【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))
おわり。