web-dev-qa-db-ja.com

Seabornで複数の箱ひげ図をプロットしますか?

pandasでseabornを使用して箱ひげ図をプロットしたいのは、データを視覚化するより良い方法だからですが、あまり詳しくありません。異なるメトリックである3つのデータフレームがあり、異なるメトリックを比較します。ファイルパスをループしてアクセスします。

for path in paths: 
   df = pd.read_csv(path)

各メトリックのdfは独立しており、次のようになります(...はデータ値が入力されていることを示します)。 1、2、3、4、5は列名であり、異なる試行を示します。

    1  2  3  4  5
0   ..............
1   ..............
2   ..............
3   ..............
4   ..............

トライアル1、2、3、4、5のすべてのプロットと、3つのメトリックのそれぞれを並べて表示します。3つのメトリックの最初のトライアルプロットはすべて左側にあり、2番目のトライアルプロットはすべて左側にあります。その右側などになります。

シーボーンでこれを行うにはどうすればよいですか?パスをループし、次のようなboxplot関数を使用することで、メトリックごとに個別にプロットできることを知っています。

sns.boxplot(data=df)   

ただし、同じプロットに他のメトリックのプロットを並べて適合させるにはどうすればよいですか?

9
Jane Sully

まず、対応する各データフレームにTrialのようなグループ化列を割り当て、次にpd.concatデータフレーム、最後にpd.melt seabornでプロットする前のインジケーター/値の縦方向データフレームのデータ。ランダムデータを使用した例を以下に示します。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

np.random.seed(44)
# DATAFRAMES WITH TRIAL COLUMN ASSIGNED
df1 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=1)
df2 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=2)
df3 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=3)

cdf = pd.concat([df1, df2, df3])                                # CONCATENATE
mdf = pd.melt(cdf, id_vars=['Trial'], var_name=['Number'])      # MELT

print(mdf.head())
#    Trial Number     value
# 0      1      1 -0.750615
# 1      1      1 -1.715070
# 2      1      1 -0.963404
# 3      1      1  0.360856
# 4      1      1 -1.190504

ax = sns.boxplot(x="Trial", y="value", hue="Number", data=mdf)  # RUN PLOT   
plt.show()

plt.clf()
plt.close()

enter image description here

16
Parfait
# libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from random import randint, gauss

# create a DataFrame
df = pd.DataFrame({
    'Sensations':[randint(1,3) for i in range(300)]
})
df['Temperature'] = df['Sensations'].map(lambda x: gauss(0.8/x,0.1)*40)
df['Sensations'] = df['Sensations'].map({1:'hot',2:'normal',3:'cold'})

# create plot
ax = sns.boxplot(x="Sensations", y="Temperature", data=df)

# show plot
plt.show()

ボックスプロットの例

0