ggplotユーザーがseabornについてまとめてみる

Rのggplotは、一度理屈を理解すれば、簡潔な記述で柔軟にグラフを描くことが可能になる素晴らしいパッケージです。
一方、pythonについては、よく使われるmatplotlibは覚えにくいし、seabornもmatplotlibのラッパーでいまいち、と思っていました。
しかし、seabornのリファレンスを読んで理解すると、結構すっきりとした記述でグラフを描けるということがわかったため、ggplotと比較しながらseabornによるグラフ描画方法をまとめてみました。
細かい見た目はおいておき、主要なグラフの簡潔な描画方法と、データを把握するのに必要な軸の設定方法についてまとめ、最後に少しだけ理屈を理解した上でグラフを描画する方法についてまとめています。

※遅ればせながら、seaborn0.11で追加された`displot()`を使った度数分布の描画について大幅に追記しました。初版の記事で、「`distplot()`も`FacetGrid()`と`map()`のショートカットが欲しい」とつぶやいていましたが、0.11で対応されました。結果的に積み上げ棒グラフも簡単に書けるようになり、主要なグラフはかなり簡単に書けるようになったと思います！(2022.7.25追記)

以下のバージョンで動作を確認しています。
R 4.11、tidyverse 1.3.1 (ggplot2 3.3.5、readr 2.0.2、forcats 0.5.1)
Python 3.9.7、seaborn 0.11.2、matplotlib 3.4.2、pandas 1.3.4、numpy 1.21.3

# データ準備
まずは説明に使うデータセットを読み込みます。seabornのデータセットを使うので、Rではseabornのgithubレポジトリからデータを取得しています。

### ggplot
```r
library(tidyverse)
theme_set(theme_bw())

df_mpg = read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/mpg.csv")

df_fmr <- read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/fmri.csv") %>% 
  mutate(region = fct_relevel(region, c("parietal", "frontal")))

df_tips <- read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv") %>% 
  mutate(day = fct_relevel(day, c("Thur", "Fri", "Sat", "Sun")),
         sex = fct_relevel(sex, c("Male", "Female")),
         time  = fct_relevel(time, c("Lunch", "Dinner")),
         smoker = fct_relevel(smoker, c("Yes", "No"))) 

df_flight <- read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv")
```
- カテゴリカルデータのラベルの順序はforcatsを使って変えている。

### seaborn
```python

import pandas as pd
import seaborn as sns

df_mpg = sns.load_dataset("mpg")
df_fmr = sns.load_dataset("fmri")
df_tips = sns.load_dataset("tips")
df_flight = sns.load_dataset("flights")
```

# 散布図
X軸：量的変数、Y軸：量的変数
色：量的変数 or カテゴリ変数
形：カテゴリ変数
サイズ：量的変数 or カテゴリ変数
行／列：カテゴリ変数

## ポイントの色と形にマッピング
### ggplot
```r
df_mpg %>% 
  ggplot(aes(x=weight, y=mpg, color=origin, shape=origin)) +
  geom_point()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/00342a28-f9b3-8cf2-04ec-8c5139ad13b4.png)


### seaborn
```python
sns.relplot(data=df_mpg, x="weight", y="mpg", hue="origin", style="origin")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/d8e4a2c0-4f14-1631-7b99-a826402e0b6b.png)

- マッピングする属性="変数名"を引数とするシンプルな記述方法。
- 色はhue。色相という意味があるらしい。
形状はstyleで、当然色と形は異なる変数をマッピングしても構わない。
- styleは量的変数の指定をしても、自動でカテゴリ変数として扱われるとのこと（ggplotではshapeに量的変数を指定するとエラーとなる）
- 散布図1つならば`scatterplot()`でも良いが、後に出てくる軸にマッピング（ggplotでいうfacet）を行おうとすると`relplot()`が便利なので、すべて`relplot()`に統一。内部では`scatterplot()`を用いている。

## ポイントのサイズにマッピング
### ggplot
```r
df_mpg %>% 
  ggplot(aes(x=weight, y=mpg, size=cylinders)) +
  geom_point()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/37ef2c03-d2a6-2ce9-1f19-0b8389908fd2.png)

### seaborn
```python
sns.relplot(data=df_mpg, x="weight", y="mpg", size="cylinders")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/d912c0a1-49c0-400c-2d33-b499fe9b25b8.png)

## 軸にマッピング
### ggplot
```r
df_mpg %>% 
  ggplot(aes(x=weight, y=mpg)) +
  geom_point() +
  facet_grid(.~origin)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/04b0e258-4f1b-bc4b-b7af-6235165dab1f.png)

### seaborn
```python
sns.relplot(data=df_mpg, x="weight", y="mpg", col="origin")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/97870254-37e5-7ada-b613-7f73962643b6.png)

- 横軸は引数col、縦軸はrowに変数名を渡す。引数col_wrapに整数を渡すとその列数で折り返してグラフを描画する。


# 散布図 with 回帰曲線
X軸：量的変数、Y軸：量的変数
色：カテゴリ変数
行／列：カテゴリ変数
### ggplot
```r
df_mpg %>% 
  ggplot(aes(x=weight, y=mpg, color=origin)) +
  geom_point() +
  geom_smooth(method=lm)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/2a01e509-2d13-6ccb-e0e9-f9e79fe46bf1.png)

### seaborn
```python
sns.lmplot(data=df_mpg, x="weight", y="mpg", hue="origin", truncate=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/b9e6f295-b601-517f-3aa0-905973f5a25b.png)

- 回帰曲線を描く場合は`lmplot()`。1つの図ならば`regplot()`でも良いが、軸にマッピングするならば`lmplot()`が便利。
- 色(hue)、軸(col, row)にマッピング出来る。それ以外はできない。
- markers=["o", "^", "x"]のようにmarkers引数で、hueに合わせてプロットの形状を指定することができる。
- truncate=Trueとするとggplotのデフォルトのようにデータが存在する範囲で直線を描く。
- orderに整数nを指定すると、n次関数を描く。
- lowess=Trueでlowess平滑化による曲線を描く。
- log=Trueでy ~ log(x)の曲線を描く。
- scatter=Falseでプロットを描かない。
- ci=None で信頼区間を描かない。

# 折れ線グラフ
X軸：量的変数（系列データ 基本的に等間隔）、Y軸：量的変数
色：量的変数 or カテゴリ変数
線のスタイル：カテゴリ変数
サイズ：量的変数 or カテゴリ変数
行／列：カテゴリ変数

### ggplot
```r
df_fmr %>% 
  ggplot(aes(x=timepoint, y=signal, color=event, linetype=event)) +
  geom_line(stat="summary") +
  facet_grid(.~region)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/5a422aa2-9bac-5a17-d000-409731e29845.png)

- stat="summary"でyに指定した変数の平均を算出して縦軸にする（デフォルトはstat="identity"。この場合は統計量の計算は行われない。）

### seaborn
```python
sns.relplot(data=df_fmr, x="timepoint", y="signal", 
            hue="event", style="event", col="region", kind="line")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/288ac911-6a38-d4f2-325e-f43ecb110a34.png)

- 折れ線グラフを描く場合は、`relplot`にkind="line"を指定する。
- 折れ線グラフ一つの場合は、`lineplot()`でも可。
- yにマッピングした変数の平均が縦軸になる。
- 散布図と同様に、hue、size、col、rowにマッピングすることが可能。
- 線のスタイル（実線やダッシュ、style）にマッピングすることも可能。
- 引数 units に変数をマッピングすることで、その変数の単位で線を（同じ色やスタイルで）描画可能。units引数を使う場合、estimator引数はNoneにする必要がある。
- markers=Trueでポイントも描く。
- ci=Noneで信頼区間を描かない。

# 棒グラフ
X軸：カテゴリ変数、Y軸：量的変数
色：カテゴリ変数
行／列：カテゴリ変数
### ggplot
```r
df_tips %>% 
  ggplot(aes(x=day, y=total_bill, fill=sex)) +
  geom_bar(position="dodge", stat="summary") +
  facet_grid(.~smoker)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/f7b8b73f-dc47-385f-b1cc-98d6f4b5b5bf.png)

- stat="summary"でyに指定した変数の平均を算出して縦軸にする。特に統計量の計算をしないならば、stat="identity"またはgeom_colを使う。

### seaborn
```python
sns.catplot(data=df_tips, x="day", y="total_bill", hue="sex", col="smoker", kind="bar")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/2d483665-511f-e895-a4a6-ea5f043257fb.png)

- 棒グラフ1つのならば`barplot()`でも良いが、軸にマッピングするならば`catplot(kind="bar")`が便利
- yにマッピングした変数の平均が縦軸になる。引数 estimatorに"median"など指定すれば、平均以外の統計量も可能。
- 横棒グラフにする場合は、xとyの変数を入れ替える。
- 色(hue)、軸(col, row)にマッピング出来る。
- hueにマッピングした場合、棒は横に並ぶ。ggplotでいうとposition="dodge"。position="fill"やposition="stack"にあたる積み上げグラフは後述の`displot()`を使う。
- 引数ci=False でエラーバーを描かない。
- 引数orderに横軸の値の順序をリストで指定可能。

# 箱ひげ図
X軸：カテゴリ変数、Y軸：量的変数
色：カテゴリ変数
行／列：カテゴリ変数
### ggplot
```r
df_tips %>%
  ggplot(aes(x=day, y=total_bill, fill=sex)) +
  geom_boxplot() +
  facet_grid(.~smoker)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/0bafd522-2fa3-9290-e6f2-6fce86cdcee4.png)


### seaborn
```python
sns.catplot(data=df_tips, x="day", y="total_bill", hue="sex", col="smoker", kind="box")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/17226bce-0c0b-cb0a-0b97-a38a7e1bf1b7.png)

- 箱ひげ図は`catplot(kind="box")`。箱ひげ図一つならば`boxplot()`でも可。

# Violin plot
X軸：カテゴリ変数、Y軸：量的変数
色：カテゴリ変数
行／列：カテゴリ変数

あまり使いませんが、一応。

### ggplot
```r
df_tips %>% 
  ggplot(aes(x=day, y=total_bill, fill=sex)) +
  geom_violin() +
  facet_grid(.~smoker)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/ae0957ef-6d74-5f11-f953-937fd761ffd9.png)

### seaborn
```python
sns.catplot(data=df_tips, x="day", y="total_bill", hue="sex", col="smoker", kind="violin")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/9fba62f0-d728-b442-b1a1-72b2e8cfe5d5.png)

- violin plotは`catplot(kind="violine")`。violin plot一つならば、`violinplot()`でも可。

# 棒グラフ（1つのカテゴリカル変数の度数分布）
X軸：カテゴリ変数
色：カテゴリ変数
行／列：カテゴリ変数

### ggplot
```r
df_tips %>% 
  ggplot(aes(x=smoker, fill=sex)) +
  geom_bar(position="dodge") +
  facet_grid(.~time)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/12867a81-4eb0-d171-3021-ef18d13a1bfa.png)

### seaborn
```python
sns.catplot(data=df_tips, x="smoker", hue="sex", col="time", kind="count")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/b83015f4-9815-1a17-27cc-92a2db90796c.png)

- `catplot(kind="count")`。棒グラフ一つならば`countplot()`でも可。
- 横棒グラフにしたい場合は、引数xではなくyに変数を指定する。

seaborn 0.11から実装された`displot()`を用いても描画可能。
```python
sns.displot(data=df_tips, x="smoker", hue="sex", col="time", multiple="dodge", shrink=0.8)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/611d3d98-5fe1-deba-cccf-789683451ef3.png)

- shrink引数に1以下の数値を適当に与えて、カテゴリ間の間隔を空ける。
- それぞれの色の棒を横に並べる場合は引数multipleに"dodge"を指定する。
- 横棒グラフにしたい場合は、`catplot()`と同じように、xではなくyに変数を指定する。
※xがカテゴリ変数の場合のdisplotはexperimental featureとのことです。
- col、rowにマッピングしない場合は`histplot()`でも可。

`displot()`の引数multipleを変えることで、0.10以前までは難しかった積み上げ棒グラフ、100%積み上げ棒グラフ（ggplotの`geom_bar()`にposition="fill"やposition="stack"を指定したようなグラフ）も描画可能となりました！
```python
sns.displot(data=df_tips, x="smoker", hue="sex", col="time", multiple="stack", shrink=0.8)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/821bff84-da70-4cc7-e71f-3fb419025f0e.png)

```python
sns.displot(data=df_tips, x="smoker", hue="sex", col="time", multiple="fill", shrink=0.8)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/8776c483-81e3-d177-7f9d-a312826a3fd7.png)

`dsiplot()`で度数（カウント）ではなく、いずれかの変数の合計値を積み上げたい場合は、weights引数に変数名を指定する。(ggplotの`geom_bar()`のweight引数にマッピングするのと同じ挙動となる。)

```python
sns.displot(data=df_tips, x="smoker", hue="sex", col="time", weights="total_bill", multiple="stack", shrink=0.8)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/9da38d65-8141-e396-d6fa-246b726a5e66.png)


# ヒストグラム（一つの量的変数の度数分布）
X軸：量的変数
色：カテゴリ変数
行／列：カテゴリ変数
### ggplot

```r
df_tips %>% 
  ggplot(aes(x=total_bill, fill=sex)) +
  geom_histogram(alpha=0.5, position="identity") +
  facet_grid(.~time)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/7b3aab14-c9f9-66d0-d9ed-f1c8bb130f26.png)


- デフォルトではfillにマッピングした変数毎に積み上げて、ヒストグラムを描くので、それぞれ独立（重ねて）してヒストグラムを描く場合はposition="identity"を指定する。
- ビンの設定はデフォルトで、bins=30なので、変えたい場合はbins（binの数）、binwidth（binの幅）、breaks（ベクトルで直接bin境界を指定）いずれかで設定。
- 縦軸を密度にしたい場合は`geom_histgram()`の引数に、aes(y=..density..)を指定する。

### seaborn
```python
sns.displot(data=df_tips, x="total_bill", hue="sex", col="time", bins=30)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/23b9ab34-4102-5354-7dff-9f01bd951e15.png)

- 0.11で度数分布を`relplot()`, `catplot()`と同じように（`FacetGrid()`と`map()`を組み合わせた形で）描画できる`displot`が追加された。ヒストグラムを描く関数であった`distplot()`と紛らわしいですが、`distplot()`は非推奨となる。
- 軸にマッピングしない場合は、`histplot()`を使っても良い。
- ビンの設定を変更する場合は引数 binsに値（この場合binの数）またはリスト（この場合binの境界を直接指定）、もしくはbinwidthに値（binの幅）を指定する。
- 積み上げる場合は引数 multiple に"stack"を指定する。（デフォルトは"layer"で重ねる。）
- 縦軸を密度にしたい場合は引数statに"density"を指定する。（"密度"の正規化の単位がggplotとは異なるよう。）
- 棒の境界線が不要な場合は、引数elementに"step"を指定する。

## ヒストグラムに密度関数を重ねる
### ggplot
```r
df_tips %>% 
  ggplot(aes(x=total_bill)) +
  geom_histogram(aes(y=..density.., fill=sex), alpha=0.5, position="identity") +
  geom_density(aes(color=sex)) +
  facet_grid(.~time)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/c7556533-2b3e-df11-3988-cc15d2130740.png)

- 内部で計算した値をyにマッピングしたり若干面倒。

### seaborn
```python
sns.displot(data=df_tips, x="total_bill", hue="sex", col="time", bins=30, stat="density", kde=True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/a24b196f-26a9-6357-756d-7346440e3e2f.png)

- 引数statを指定しない場合は、通常のヒストグラムに密度関数を重ねることも可能。
- ヒストグラムを描画しない場合は、引数kindに"kde"を指定し、kde、bins、statを指定しない。

# ヒートマップ（2つのカテゴリカル変数の度数分布）
X軸：カテゴリ変数、y軸：カテゴリ変数
行／列：カテゴリ変数

主として度数を見たい2つのカテゴリ変数のカテゴリ数が多い場合は、ヒートマップのほうが見やすい。（以下の例はカテゴリ数は多くありませんが。）

### ggplot
```r
df_tips %>% 
    ggplot(aes(x=time, y=day, weight=total_bill)) +
    geom_bin2d() +
    facet_grid(.~sex)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/e57b42eb-4f41-8dd2-3971-572d69738a65.png)

- ラベルを重ねる場合は`geom_text(stat="bin2d", aes(label=..count..)) `を追加する。
- あらかじめ度数や合計値の計算をしている場合は、その変数をfillにマッピングし、`geom_raster()`でヒートマップを描ける。
 
### seaborn
```python
sns.displot(data=df_tips, x="day", y="time", col="sex", weights="total_bill", cbar=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/43fb04a6-6517-1d9a-3922-fe6f5eca80a3.png)

- いずれかの変数の合計値を積み上げたい場合は、weights引数に変数名を指定する。
- 軸にマッピングしない場合は、`histplot()`を使っても良い。
- ラベルを重ねることはできない。ラベルを重ねるときは`sns.heatmap()`を使うしかなさそう。

# 2次元ヒストグラム（2つの量的変数の度数分布）
X軸：量的変数、y軸：量的変数
行／列：カテゴリ変数

### ggplot
```r
df_tips %>% 
    ggplot(aes(x=total_bill, y=tip)) + 
    geom_bin2d(bins=10) +
    facet_grid(.~sex)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/d505451e-9128-6966-2cbb-f8f1f2a7e276.png)

- 1次元のヒストグラムと同じように、binsやbinwidthでビンを調整する。

### seaborn
```python
sns.displot(data=df_tips, x="total_bill", y="tip", col="sex", cbar=True, bins=10)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/594c8611-ab34-e309-75bd-70ad739486fb.png)

- 軸にマッピングしない場合は、`histplot()`を使っても良い。
- 1次元のヒストグラムと同じように、binsやbinwidthでビンを調整する。
- 2次元の密度関数を描く場合は引数kindを"kde"とする。（軸にマッピングしない場合は`kdeplot()`でも可）

# 軸の設定
細かい設定の話はしませんが、軸はデータを把握する上で重要なので、簡単に触れます。
### ggplot
```r
df_mpg %>% 
  ggplot(aes(x=weight, y=mpg, color=origin, shape=origin)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  coord_cartesian(xlim=c(2000, 4000), ylim=c(10, 40))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/a70f4104-e059-a1bc-f8ba-dc540ae3926c.png)

### seaborn
```python
sns.relplot(data=df_mpg, x="weight", y="mpg", hue="origin", style="origin", height=3).\
set(xlim=(2000, 4000), ylim=(10, 40), xscale="log", yscale="log", aspect=0.5)
```
- `relplot()`や`scatterplot()`などに`.set()`を続ける。
- 引数にはx/ylim()（軸範囲）、x/yscale（リニア/対数スケール）以外にも/ytick（軸メモリ）、ｘx/ylabel（軸ラベル）、title（グラフタイトル）など設定できる。
- aspectはy軸対x軸の数値。グラフの大きさは`relplot()`の引数に高さを単位インチで指定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/aabc7336-b7b2-9bc7-2041-4178e4d814ad.png)

# seaborn応用編
- `FacetGrid()`、`relplot()`、`catplot()`、`displot()`、`lmplot()`の返り値はFacetGridオブジェクト。FacetGridオブジェクトに`map()`を適用し、プロットを描く。
- `map()`の返り値は自分自身なので、`map()`を続けて適用しプロットを重ねることができる。

```python
g = sns.FacetGrid(data=df_tips, col="time")
g = g.map(sns.kdeplot, "total_bill", "tip")
g = g.map(sns.scatterplot, "total_bill", "tip")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/b5a06954-ce77-8177-3fb9-add9e74c803c.png)

- `scatterplot()`や`barplot()`、`histplot()`などの返り値はmatplotlibのAxesオブジェクト。
- これらの関数は引数axにAxesオブジェクトを指定できるが、指定しない場合は、現在のAxesオブジェクトが使われる。
- なので`ax = 上記の関数`を続けていけば、プロットを重ねることができる。

```python
ax = sns.lineplot(data=df_fmr, x="timepoint", y="signal", hue="event")
ax = sns.scatterplot(data=df_fmr, x="timepoint", y="signal", hue="event")
# 2行目は ax = sns.scatterplot(data=df_fmr, x="timepoint", y="signal", hue="event", ax=ax) と等価。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/1bb3d13f-1ce2-2e20-19de-f7ee62e4d006.png)

- FacetGridオブジェクトのaxes属性はmatplotlibのAxesオブジェクトの2次元配列となっている。
- よってFaceGrid.axes[0, 0]のように、所定のグリッド位置（[0,0]は左上）のAxesオブジェクトを得ることができる。
- これを利用して、以下のように所定の位置だけ、プロットを重ねることが可能。

```python
g = sns.FacetGrid(data=df_tips, col="time")
g = g.map(sns.kdeplot, "total_bill", "tip")
sns.scatterplot(data=df_tips, x="total_bill", y="tip", ax=g.axes[0, 0])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354870/930e5277-6594-647c-200a-39a3a6e46cbf.png)

このあたりの話、詳しくは[公式](https://seaborn.pydata.org/introduction.html#figure-level-and-axes-level-functions)のfigure-levelとAxes-levelを参照ください。
また、Axesオブジェクトを使いこなそうとすると、matplotlibのオブジェクト指向インターフェイスの理解が必要だと思います。
matplotlibについては@skotaroさんが[素晴らしい記事](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9) をまとめてくれています。この記事でも参考にさせていただきました。またseabornについてのこちらの[記事](https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae)も参考にさせていただきました。

# 編集履歴
- seabornではできなかった、pythonで100%積み上げグラフを描く方法を追記。Rのサンプル読み込みで不足の行があり追記。（当該行がないとサンプルのグラフ通りにならないものがありました）（2020.6.21）
- 主にseaborn0.11で対応された`displot()`に関連する度数グラフの内容を大幅追加した。
    - カテゴリ変数／連続変数、1変数／2変数の組み合わせで度数分布に関する項目をそれぞれ記載する形式に変更。それに伴い、使用機会がすくない、密度関数の記載を削除した。
    - 見出しタイトルをグラフの名前に変更し、見出しタイトルの直下にマッピング可能な属性（引数）と変数の種類（量的／カテゴリ）を明示する形式とした。
    - そのほか、折れ線グラフでマッピング可能な引数を追記するなど、グラフの説明を微修正をした。(2022.7.25)