簡體   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