0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonでFigの作成(swarmplot / stripplot)

Last updated at Posted at 2024-01-21

この記事で使われているバージョンはSeaborn v0.12.2です。

swarmplot, stripplot

公式ドキュメント(※Version 0.12)
https://seaborn.pydata.org/archive/0.12/generated/seaborn.swarmplot.html
https://seaborn.pydata.org/archive/0.12/generated/seaborn.stripplot.html

作成例
image.png

基本構文

とりあえず基本的の構文。細かい内容は後述します。

swarmplot

sns.swarmplot(data=df_plot,#DataFrameの指定
            x='x_value',#X軸にプロットする列名を指定
            y='y_value',#Y軸にプロットする列名を指定
            hue='[グループ名]',#グループ分けする場合のみ。グループ名が格納されている列名
            dodge=True,#hueを指定している場合のみTrue¥
            palette='[パレット名]',#hueを指定している場合のみ。カラーパレットを指定。プリセットor自分で設定
            #color='black',#hueを指定しない場合の色の指定
            size=10,#マーカーサイズの変更
            edgecolor='black',#マーカーの枠線の色
            linewidth=1,#マーカーの枠線の太さ
            alpha=marker_alpha,#マーカーの透過度。0~1.0で指定
            marker='^',#マーカーの形状を指定。'^'は三角、'o'は丸
            )

striplot

書き方はswarmplotと同じで、頭のところをsns.stripplot(~~)に変えるだけ。

sns.stripplot(data=df_plot,#DataFrameの指定
            x='x_value',#X軸にプロットする列名を指定
            y='y_value',#Y軸にプロットする列名を指定
            
            #細かい設定をする
            
            )

swarmplot、stripplotの描画方法

まずは、インポートとデータの読み込み。
csvからの読み込み例。

# ライブラリのインポート

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# データの読み込み
df = pd.read_csv('./data.csv', header=0, index_col=0)

入力データのDataFrameを変換する

Seabornでプロットするには、読み込んだDataFrameを一定の形に変換する必要あり。
詳しくはこちらを参照。

変換前のDataFrameの例
image.png

2要素(値、カテゴリ1)のDataFrameの変換

df_sns = df.stack().reset_index()
df_sns.columns=['id', 'x_value', 'y_value']
col_num  = len(df.columns)

3要素(値、カテゴリ1、カテゴリ2)のDataFrameの変換

ただし、読み込んだCSVファイル内のデータにおいて、グループの列が一番右列にあってその列名がgroupになっている前提。

col_num  = len(df.columns)-1
df_stack = df.iloc[:, 0:col_num].stack().reset_index()
df_stack.columns = ['id', 'x_value', 'y_value']
df_sns = df_stack.merge(df.loc[:,'group'], left_on='id', right_index=True ,how='left')

プロットする

ここから、実際のプロットに使うコードを記します。

最小限でプロットするとこんな感じ。
image.png

コード
fig = plt.figure(figsize=(6,4))
ax1 = fig.add_subplot(1,1,1)

sns.swarmplot(data=df,
              x='day',
              y='value',
              #color='black'#色の指定,
              ax=ax1
              )
plt.show()

(※オブジェクト指向で描画するためaxを指定しています。)

huedodgeでグループ分けしてプロットする

左から、

  • hue 指定なしdodge 指定なし
  • hue='group'dodge 指定なし
  • hue='group'dodge=True

image.png

コード
fig = plt.figure(figsize=(9,6))
ax1 = fig.add_subplot(1,1,1)

sns.swarmplot(data=df,
              x='day',
              y='value',
              #hue='group',
              #dodge=True,
              #palette='muted',#hueを指定している場合のみ(color=は使えない)
              alpha=0.7,
              ax=ax1
              )
plt.show()

マーカの変更

  • color='white' edgecolor="black",linewidth=1,:白塗りつぶし・黒枠線
  • color='red' edgecolor="black",linewidth=1,:白塗りつぶし・赤枠線
  • marker='^':三角形形に変更

image.png

コード
fig = plt.figure(figsize=(6,4))
ax1 = fig.add_subplot(1,1,1)

sns.swarmplot(data=df,
              x='day',
              y='value',
              color='white',
              edgecolor="black",
              linewidth=1,
              marker='^',
              ax=ax1
              )
plt.show()

複数色への変更

  • x= で指定した列を hue= に指定することで下図のように色分け可能。

image.png

コード
fig = plt.figure(figsize=(6,4))
ax1 = fig.add_subplot(1,1,1)

sns.swarmplot(data=df,
              x='day',
              y='value',
              hue='day',
              palette=['red', 'blue', 'green'],
              alpha=0.7,
              edgecolor="black",
              linewidth=1,
              marker='o',
              legend=False,
              ax=ax1
              )
plt.show()
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?