pythonでFigの作成（swarmplot / stripplot）

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

# swarmplot, stripplot
<b>公式ドキュメント</b>（※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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/105ab606-5d59-94c5-9dfc-46751e8e3f28.png)




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

### swarmplot
```python
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(~~)`に変えるだけ。
```python
sns.stripplot(data=df_plot,#DataFrameの指定
            x='x_value',#X軸にプロットする列名を指定
            y='y_value',#Y軸にプロットする列名を指定
            
            #細かい設定をする
            
            )
```
# swarmplot、stripplotの描画方法

まずは、インポートとデータの読み込み。
csvからの読み込み例。
```python
# ライブラリのインポート

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を一定の形に変換する必要あり。
詳しくは[こちら](https://qiita.com/kujira_0120/items/4ab229209861e80b3e81)を参照。


**変換前のDataFrameの例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/f8a7709b-526c-e7da-9e84-4918b5ba8a6d.png)



#### 2要素（値、カテゴリ1）のDataFrameの変換
```python
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`になっている前提。
```python
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')
```

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

最小限でプロットするとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/a0a486a2-d701-8d2c-3711-4bd6ccc26b95.png)


```python:コード
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`を指定しています。）


## `hue`と`dodge`でグループ分けしてプロットする

左から、
* `hue 指定なし`、`dodge 指定なし`
* `hue='group'`、`dodge 指定なし`
* `hue='group'`、`dodge=True`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/8440a45b-b483-a80d-4d6e-3799523915f3.png)

```python:コード
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/880015f2-f1d1-7738-3357-4c707421355a.png)



```python: コード
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/cbaf41ce-5117-a6fc-06b7-69a383e30941.png)

```python: コード
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()
```