図を作るの大変
Matplotlibなどで,図を作るのが大変だと思ったことはないですか?私はあります!
線の太さを太くしたり,外れ値のマークを入れ替えたり,x軸やy軸のメモリを書き換えたり,統計的検定の星を打ったり etc ...
プロット対象のData Frameを渡すことにより,自動的に有意差の星までプロットするプログラムがあれば,そのまま図をスライドに貼れるなとずっと思ってました.今回は,上記のスタイル調整と統計的検定・描画を行えるプログラムを作成したので,共有したいと思います.
つたないプログラムですが,同じような悩みがある人の役に立てれば幸いです.
どんな感じの図を表示できるの?
プログラムをまとめたGithubは以下のページです.
Github
こんな感じのプログラムで
plot = PLOT(save_mode=["png"], figsize=(12,8), font_size=30)
df = plot.convert(df, hue="target", x="features", y="number")
color = plot.get_color("pastel")
plot.box(df, "pic/adjust", x="features", y="number", hue="target", yticks=[-5,0,5], color=color)
基本的に,X軸とY軸の線をそこそこの太さにし,上側と右側の線を消すスタイルで描画します.そして,図の上部に統計的検定の結果有意差が見られた指標には星を打つものとなっています.
表示可能な図の一覧
少ないですが,私が常用する図だけとなってます.
- 箱ひげ図(
sns.boxplot
) - 線グラフ(
sns.lineplot
) - 棒グラフ(
sns.barplot
) - 混同行列(
plt.imshow
) - スペクトログラム(
ax.pcolormesh
)
主な機能
線の太さ・色,図のスタイルのほかに,以下に示す機能があります.(すべてではありません)
-
X軸とY軸のラベルの調整,X軸とY軸の範囲の設定
各関数において,引数xticks``yticks
に設定したいメモリのリストを設定すると,その始まりの値がylim
の下限値,最後の値がylim
の最大値に設定され,各リストはset_yticks
に渡され,メモリの値に設定されます. -
メモリ文字列の回転
各関数において,引数rotation
にメモリの回転角度を設定すると,値がset_rotation
に渡され,X軸のメモリの文字が回転します. -
統計的検定
各関数において,引数stats
に検定名等を渡すと,自動的に検定が行われます.これは,すでにvistatsとして実装されているものにインスパイアを受けて実装したものになります.
vistatsとの大きな違いは,hue
の引数で示された指標に基づき分割されたクラスに対して検定を自動で実施し,描画する点です.以下のパラメータで検定の方法などを調整します.stats=None
を指定するとこの項の処理は行われません.
-
stat_name
:検定の方法を指定することができます.brunnermunzel
を指定するとBrunner-Munzel検定をwelch
を指定するとwelchのt検定を行います -
adjust_name
:多重比較の補正方法を指定することができます.本検定は,表示されるすべての群間で実施されるので,基本的に補正をする必要があります.bonferroni
(bonferroni補正),holm
(holm補正),fdr_bh
(Benjamini-Hochberg補正)などを使用できます -
stat_mark
:有意差の星の形状を指定できます.基本的には*
を使用すると思います.None
を指定するとp値をそのまま表示します
使い方
1. PLOTクラスをインスタンス化
PLOTクラスをインスタンス化します.この時,図・フォントのサイズや保存する拡張子などを指定します.
plot = PLOT(figsize=(10, 8), font_size=20, is_times_new_roman=False, save_mode=["png", "pdf"])
pdfはAffinityなどのソフトで使用するため,透過した状態で保存されます.
また,figsizeは各グラフ描画時にも指定することができます.
2. データフレームの変換
必要に応じてデータフレームを縦持ちに変換します.データフレームの縦持ちと横持ちについては,こちらをご覧ください.
df = plot.convert(df, hue="target")
ここで,hue
はクラスを分ける目的変数の列名を表します.例えば,irisデータセットであれば"variety",タイタニックデータセットでは"Survived"などです.
また,ここで,x
やy
の列名を指定することで,描画するX軸とY軸のラベルを設定することができます.例えば,最初に例示した図では,x="features", y="number"
を指定しており,図に反映されています.
3. プロット
以下のように,図を描画します.
plot.bar(df, "test")
デフォルトのまま体裁を気にしないのであれば,データフレームと保存ファイル名を指定するだけで,図を描画することができます.hue
で目的変数を指定すると検定等を実施します.2の工程でx
やy
の列名を指定した場合は,その値をx="features", y="number"
のように引数を指定してください.
引数などの詳細は,Githubのほうをご確認ください.
test.py
にirisデータなどを用いたプログラムの例を置いています.
最後に
初めてQiitaに記事を書いたので,問題点などがあれば教えていただけますと幸いです.
また,つたないプログラムなのですべてが未保障です.何が起こっても自己責任として笑って見過ごして下さい.