pandasのデータフレームをseabornのcatplotを使ってかっこいいグラフ作成！

## 目次：
0. はじめに
1. DataFrameの前処理
1. catplot　引数なし
2. catplot　bar型グラフ
2. catplot　violin型グラフ
4. まとめ



## 1.はじめに
pandasのデータフレームからseabornのbarplotを作る場合、前処理が必要なのでメモ用に記載しておくとする。
（これが一番いいプロット方法というわけでもないので、急いでいるんだったらブラウザバックしてpd.DataFrame.plot()について調べてください。）

データフレームは以下のを使うとする。

```python
df = pd.DataFrame({'Japan': [100, 300, 200, 100],
                   'USA': [200, 300, 400, 500],
                   'Canada': [300, 200, 100, 400]},
                  index=['cat', 'dog', 'hamster', 'horse'])
df
```
Out:


|  | Canada | Japan | USA |
|:--|--:|--:|--:|
| cat | 300 | 100 | 200 |
| dog | 200 | 300 | 300 |
| hamster | 100 | 200 | 400 |
| horse | 400 | 100 | 500 |


__似ているfactorplot関数についての注意！__
旧名称はfactorplotで、もうすぐ使えなくなるとかなのでcatplotを使おう。
ちなみにfactorplotを使おうとすると以下のような警告が出る。

```python
/usr/local/lib/python3.6/site-packages/seaborn/categorical.py:3666: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)
```


seabornは主にsnsと略されるので以下ではsns.catplotとして使用していく。


#DataFrame の前処理
あとで使うseabornの引数であるx, y, hueを取り入れるために今データの前処理をする。
前処理にはpd.melt()を使う（meltは溶かす、の意味。意味どおりdfを溶かして、数値データ、indexなどを列一個にまとめる）

```python
melted_df = pd.melt(
    df.reset_index(), id_vars="index",
    var_name="Country", value_name="Species")
melted_df.rename(columns={'index': 'Animal'}, inplace=True)
melted_df
```

このように前処理をしなければあとで、ちょっとめんどくさい！
Out:


|  | Animal | Country | Species |
|:--|:--|:--|:--|
| 0 | cat | Canada | 300 |
| 1 | dog | Canada | 200 |
| 2 | hamster | Canada | 100 |
| 3 | horse | Canada | 400 |
| 4 | cat | Japan | 100 |
| 5 | dog | Japan | 300 |
| 6 | hamster | Japan | 200 |
| 7 | horse | Japan | 100 |
| 8 | cat | USA | 200 |
| 9 | dog | USA | 300 |
| 10 | hamster | USA | 400 |
| 11 | horse | USA | 500 |


# seabornのcatplotを引数無しで使う場合

seabornのcatplotは主にドットのプロットを描画してくれる。

sns.catplotを使うと以下のようなグラフが与えられる。

```python
sns.catplot(x='Animal', y='Species', hue='Country', data=melted_df)
plt.show()
```

![plotted (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/083f87df-61f5-ecc2-38d2-66cb97f4544a.png)


ここで、

```python
sns.catplot(data=df)
plt.show()
```
を使うと以下のようになり、各国同じ色で動物が識別しにくいグラフが生まれてしまう。

![catplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/9248c170-fb29-8933-4ab9-1369b3755111.png)



#seabornのcatplotのbar graph型
棒グラフは以下のように描画可能

```
sns.catplot(x='Country', y='Species', hue='Animal', data=melted_df, kind='bar')
plt.show()
```

![plotted (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/7dfdad26-d75d-1e68-8bf8-3117936207b1.png)

```
sns.catplot(data=df)
plt.show()
```

これだと以下のようになってしまい、各国、各動物の対比が見れない。

![plotted (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/2fd4546a-9416-e9fa-f1b5-5fa81082f5c6.png)



# seabornのcatplotのviolin型


今回は前処理なしのdfを使う。

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


df = pd.DataFrame({'Japan': [100, 300, 200, 100],
                   'USA': [200, 300, 400, 500],
                   'Canada': [300, 200, 100, 400]},
                  index=['cat', 'dog', 'hamster', 'horse'])
sns.catplot(data = df, kind='violin')
plt.show()
```

![catplot (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/75a52288-2cd3-a800-5a74-e729e24eee59.png)

かっこいい！これは各国の動物の個体数の平均などを入れた箱ひげ図に近いグラフとなる。



# まとめ

barかviolinは結局以下のようにかけば描画可能

```python
df = pd.DataFrame({'Japan': [100, 300, 200, 100],
                   'USA': [200, 300, 400, 500],
                   'Canada': [300, 200, 100, 400]},
                  index=['cat', 'dog', 'hamster', 'horse'])
melted_df = pd.melt(
    df.reset_index(), id_vars="index",
    var_name="Country", value_name="Species")

#動物のカラムの名前が'index'になってしまっているので、'Animal'に変更
melted_df.rename(columns={'index': 'Animal'}, inplace=True)

#点のみのグラフを描画したい場合
sns.catplot(x='Animal', y='Species', hue='Country', data=melted_df)
plt.show()
#一応figureをcloseしておく
plt.close()

#棒グラフの場合
sns.catplot(x='Animal', y='Species', hue='Country', data=melted_df, kind='bar')
plt.show()
#一応figureをcloseしておく
plt.close()

```


あとはseabornのdocumentationを参考にすると良い。
また繰り返しになりますが、violinなどが描きたい！以外のデータフレームのプロットは
pd.DataFrame.plot()を使ったほうがいいと思います。

> 参考(seaborn.catplotについてのドキュメンテーション)
>>https://seaborn.pydata.org/generated/seaborn.catplot.html