3つの1次元データ配列A、B、Cがあります。それらはすべて長さが異なります。
アレイごとに1つずつ、3つのバイオリンを使用してバイオリン図を作成したいと思います。どうすればよいですか?
編集:プロキシ関数を作成することで問題を解決しましたが、配列ごとにラベルを列に変換する必要があるのは無駄だと感じます。それをより良く/より効率的に行うことは可能ですか?
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()
ほぼ同じ量になりますが、numpy配列にnanを埋めて、すべて同じサイズにすることができます。次に、それらを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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加