簡體   English   中英

Matplotlib / Seaborn 不同數據大小的小提琴圖

[英]Matplotlib / Seaborn violin plots for different data sizes

我有3個一維數據arrays A,B,C。它們的長度都不一樣。

我想用 3 把小提琴制作一把小提琴 plot,每個陣列一個。 我該怎么做呢?

編輯:我已經通過編寫代理 function 解決了這個問題,但是必須將每個數組的標簽轉換為列感覺很浪費。 有沒有可能做得更好/更有效

def dict2pandas(d, keyname, valname):
    dframes = []
    for k,v in d.items():
        dframes += [pd.DataFrame({keyname : [k] * len(v), valname : v})]
    return pd.concat(dframes)

data = {
    'A' : np.random.normal(1, 1, 100),
    'B' : np.random.normal(2, 1, 110),
    'C' : np.random.normal(3, 1, 120)
}

dataDF = dict2pandas(data, 'arrays', 'values')

fig, ax = plt.subplots()
sns.violinplot(data=dataDF, x='arrays', y='values', scale='width', axis=ax)
plt.show()

雖然它大致相同,但你可以用 nan 填充你的 numpy arrays ,所以它們的大小都是一樣的。 然后可以將它們放入 dataframe 中以使用 seaborn 進行繪圖:

data = {
    'A' : np.random.normal(1, 1, 100),
    'B' : np.random.normal(2, 1, 110),
    'C' : np.random.normal(3, 1, 120)
}
maxsize = max([a.size for a in data.values()])
data_pad = {k:np.pad(v, pad_width=(0,maxsize-v.size,), mode='constant', constant_values=np.nan) for k,v in data.items()}
df = pd.DataFrame(data_pad)

fig, ax = plt.subplots()
sns.violinplot(data=df)

我也找不到比用NaN填充 Pandas DataFrame 更好的主意,但這種方法可能更簡潔:

import numpy as np
import pandas as pd
import seaborn as sns

# OP's data
data = {
    'A' : np.random.normal(1, 1, 100),
    'B' : np.random.normal(2, 1, 110),
    'C' : np.random.normal(3, 1, 120)
}

# Create DataFrame where NaNs fill shorter arrays 
df = pd.DataFrame([data['A'], data['B'], data['C']]).transpose()

# Label the columns of the DataFrame
df = df.set_axis(['A','B','C'], axis=1)

# Violin plot  
sns.violinplot(data=df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM