3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Matplotlibを用いてプレゼンスライドに直接貼れる図を作るwith統計的検定の有意差の星を表示

Last updated at Posted at 2025-01-15

図を作るの大変

Matplotlibなどで,図を作るのが大変だと思ったことはないですか?私はあります!
線の太さを太くしたり,外れ値のマークを入れ替えたり,x軸やy軸のメモリを書き換えたり,統計的検定の星を打ったり etc ...
プロット対象のData Frameを渡すことにより,自動的に有意差の星までプロットするプログラムがあれば,そのまま図をスライドに貼れるなとずっと思ってました.今回は,上記のスタイル調整と統計的検定・描画を行えるプログラムを作成したので,共有したいと思います.
つたないプログラムですが,同じような悩みがある人の役に立てれば幸いです.

どんな感じの図を表示できるの?

プログラムをまとめたGithubは以下のページです.
Github

こんな感じのプログラムで

sample.py
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)

こんな感じの図を表示できます.
adjust.png

基本的に,X軸とY軸の線をそこそこの太さにし,上側と右側の線を消すスタイルで描画します.そして,図の上部に統計的検定の結果有意差が見られた指標には星を打つものとなっています.

表示可能な図の一覧

少ないですが,私が常用する図だけとなってます.

  • 箱ひげ図(sns.boxplot
  • 線グラフ(sns.lineplot
  • 棒グラフ(sns.barplot
  • 混同行列(plt.imshow
  • スペクトログラム(ax.pcolormesh

主な機能

線の太さ・色,図のスタイルのほかに,以下に示す機能があります.(すべてではありません)

  1. X軸とY軸のラベルの調整,X軸とY軸の範囲の設定
    各関数において,引数xticks``yticksに設定したいメモリのリストを設定すると,その始まりの値がylimの下限値,最後の値がylimの最大値に設定され,各リストはset_yticksに渡され,メモリの値に設定されます.

  2. メモリ文字列の回転
    各関数において,引数rotationにメモリの回転角度を設定すると,値がset_rotationに渡され,X軸のメモリの文字が回転します.

  3. 統計的検定
    各関数において,引数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クラスをインスタンス化します.この時,図・フォントのサイズや保存する拡張子などを指定します.

sample.py
plot = PLOT(figsize=(10, 8), font_size=20, is_times_new_roman=False, save_mode=["png", "pdf"])

pdfはAffinityなどのソフトで使用するため,透過した状態で保存されます.
また,figsizeは各グラフ描画時にも指定することができます.

2. データフレームの変換
必要に応じてデータフレームを縦持ちに変換します.データフレームの縦持ちと横持ちについては,こちらをご覧ください.

sample.py
df = plot.convert(df, hue="target")

ここで,hueはクラスを分ける目的変数の列名を表します.例えば,irisデータセットであれば"variety",タイタニックデータセットでは"Survived"などです.
また,ここで,xyの列名を指定することで,描画するX軸とY軸のラベルを設定することができます.例えば,最初に例示した図では,x="features", y="number"を指定しており,図に反映されています.

3. プロット
以下のように,図を描画します.

sample.py
plot.bar(df, "test")

デフォルトのまま体裁を気にしないのであれば,データフレームと保存ファイル名を指定するだけで,図を描画することができます.hueで目的変数を指定すると検定等を実施します.2の工程でxyの列名を指定した場合は,その値をx="features", y="number"のように引数を指定してください.

引数などの詳細は,Githubのほうをご確認ください.
test.pyにirisデータなどを用いたプログラムの例を置いています.

最後に

初めてQiitaに記事を書いたので,問題点などがあれば教えていただけますと幸いです.
また,つたないプログラムなのですべてが未保障です.何が起こっても自己責任として笑って見過ごして下さい.

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?