繁体   English   中英

seaborn小提琴图,频率和值在单独的列中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM