[英]Creating a violin plot with seaborn without x and y values but with hue
[英]seaborn violin plot with frequency and values in separate columns
我有一些数据框:
import pandas as pd
import numpy as np
import seaborn as sns
np.random.seed(1)
data = {'values': range(0,200,1), 'frequency': np.random.randint(low=0, high=2000, size=200)}
df = pd.DataFrame(data)
我正在尝试创建一个小提琴图,其中 y 轴对应于values
列,小提琴的宽度对应于frequency
列。
我可以通过frequency
列中的值复制每一行,然后调用小提琴图:
repeat_df = df.loc[df['values'].repeat(df['frequency'])]
sns.violinplot(y=repeat_df['values'])
这有效......除非生成的重复 DataFrame 有 50+ 百万行。 使用大型 DataFrame 时有什么更好的解决方案?
正如我的评论中所建议的:
在重复频率之前,通过将它们归一化并舍入到 0 到 100 的整数范围,将它们的分辨率降低到百分比水平。
这样,您不会丢失大量细节,而是将重复次数保持在最多 100 次。
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
np.random.seed(1)
n_values = 50000
# creating values with sinusoidal frequency modulation
data = {'values': range(0,n_values,1), 'frequency': np.random.randint(low=0, high=2000, size=n_values)*(np.sin(np.arange(n_values)/(n_values/50))+2)}
df = pd.DataFrame(data)
# old method: 100 million rows after repeat
repeat_df = df.loc[df['values'].repeat(df['frequency'])]
print(f"Old method: {len(repeat_df)} Observations")
# new method: renormalize and round frequency to reduce repetitions to 100
# resulting in <2 million rows after repeat
df.frequency = np.round(df.frequency / df.frequency.max() * 100)
repeat_df = df.loc[df['values'].repeat(df['frequency'])]
print(f"New method: {len(repeat_df)} normalized Observations")
sns.violinplot(y=repeat_df['values'])
plt.show()
如果您的 50+ 百万行来自这些值,我会相应地重新组合这些值,例如一组 100 个值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.