いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】平均値の棒グラフに個別値もプロットしたい

・お題:A、B、C及びDの4つの試験条件で、実験をしたところ、10個ずつデータを得ることができた。各試験条件ごとに、平均値を棒グラフで示し、ついでに個別値もプロットしたい。

 

・これまでEXCELで似たようなことをやっていたが、jitterの設定ができず、個別値が一列に並んで被ってしまうのが不満だった。EXCELでのやり方が分からなかったので、Pythonで作図してみた。

・まずはデータセットを作成。

import numpy as np
import seaborn as sns
import pandas as pd
a=np.random.normal(10,1,10)
b=np.random.normal(12,1,10)
c=np.random.normal(8,1,10)
d=np.random.normal(14,1,10)
df=pd.DataFrame({"A":a,"B":b,"C":c,"D":d})

dfの中身は以下の通り。

・これの平均値を棒グラフにするには、seabornのbarplotが便利。

sns.barplot(x=df.columns,y=df.mean(),color="skyblue")

・ここに、seabornのstripplotで個別値を追加する。

sns.stripplot(x="variable",y="value",data=df.melt(),color="gray")

デフォルトでjitterがTrueになっているので、勝手に良い感じにばらついてくれる。jitter=Falseにすると、プロットが縦一列に並ぶ。dfをmeltで縦持ちに変換している。

・次に、それぞれの試験条件で、XとYの2群(例えば試験物質)に分かれていたとする。まずはダミーデータを作成する。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
a=np.random.normal(10,1,10)
b=np.random.normal(12,1,10)
c=np.random.normal(8,1,10)
d=np.random.normal(14,1,10)
e=np.repeat(["X","Y"],5)
df=pd.DataFrame({"A":a,"B":b,"C":c,"D":d,"E":e})

・グラフを作成する前に、データを縦持ちにしておく。今回はそれぞれのデータにXとYを振る。

df_melt=df.melt(var_name="Sample",value_name="Score",id_vars="E")

df_meltは以下になる。

・あとは描画する。凡例は邪魔なので外に出した。

sns.stripplot(x="Sample",y="Score",data=df_melt,color="gray",hue="E", dodge=True)
sns.barplot(x="Sample",y="Score",data=df_melt,color="skyblue",hue="E", dodge=True,ci=None)

#barplotでは勝手に群の代表値で描画してくれるらしい。引数estimator=はデフォルトでmeanになってるっぽい。
plt.legend(labels=["X","Y"], bbox_to_anchor = (1,1))

 

おわり。