不同数据大小的 Matplotlib / Seaborn 小提琴图
Matplotlib / Seaborn violin plots for different data sizes
我有3个一维数据数组A、B、C,它们的长度都不一样。
我想用 3 把小提琴制作一个小提琴图,每个阵列一个。我该怎么做?
编辑: 我已经通过编写代理函数解决了这个问题,但是必须将每个数组的标签转换为列感觉很浪费。有没有可能nicer/more高效
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 数组,使它们的大小都相同。然后可以将它们放入数据框中以使用 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)
我有3个一维数据数组A、B、C,它们的长度都不一样。
我想用 3 把小提琴制作一个小提琴图,每个阵列一个。我该怎么做?
编辑: 我已经通过编写代理函数解决了这个问题,但是必须将每个数组的标签转换为列感觉很浪费。有没有可能nicer/more高效
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 数组,使它们的大小都相同。然后可以将它们放入数据框中以使用 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)