ggplotとMatplotlibのコード比較

pythonの代表的なグラフ描画ツールであるmatplotlibを勉強するついでに、Rの代表的なグラフ描画ツールであるggplotとmatplotlibのコードを比較していこうと思います。備忘録的要素が強いですが、ggplotに慣れている方や、逆にmatplotlibに慣れている方がもう片方を勉強する際の助けになれば幸いです。


#データセットの読み込み
今回は、定番であるirisデータセットを使っていきます。

```python
#python
import matplotlib.pyplot as plt
import seaborn as sns
df=sns.load_dataset("iris")
df.head()
```

```python
#python
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
```


```R
#R
library(tidyverse)
df <- iris
df %>% head()
```

```R
#R
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
```

#散布図
geom_point()関数 / Axes.scatter()メソッド




```R
#ggplot
ggplot(data = df,aes(x=Sepal.Length,y=Sepal.Width))+
  geom_point()
```
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/207726/cf580714-dbdf-7a08-ba79-47f9ff7b6457.png)




```python
#matplotlib
fig=plt.figure()#pyplot.figureクラスをインスタンス化
ax=fig.add_subplot(1,1,1)#1行1列のサブプロットを作成し、1番目にaxを配置
ax.scatter(df["sepal_length"],df["sepal_width"])#axに散布図を描画
ax.set_xlabel("sepal_length")#x軸ラベルを指定
ax.set_ylabel("sepal_width")#y軸ラベルを指定
plt.show()
```
![figure.png](https://qiita-image-store.s3.amazonaws.com/0/207726/657c8c0e-3584-96f1-ee37-50bc57fd3505.png)

#折れ線グラフ
geom_line()関数 / Axes.plot()メソッド

```R
#ggplot
ggplot(data = df,aes(x=Sepal.Length,y=Sepal.Width))+
  geom_line()
```
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/207726/29fcab79-5329-f41d-b43f-e33fad5c070b.png)

```python
#matplotlib

fig=plt.figure()#pyplot.figureクラスをインスタンス化
ax=fig.add_subplot(1,1,1)#1行1列のサブプロットを作成し、axを配置
ax.plot(df["sepal_length"],df["sepal_width"])#axに折れ線グラフを描画
ax.set_xlabel("sepal_length")#x軸ラベルを指定
ax.set_ylabel("sepal_width")#y軸ラベルを指定

plt.show()
```
![figure.png](https://qiita-image-store.s3.amazonaws.com/0/207726/83ef0973-4096-2aac-34e3-9ca05a55e175.png)
上記のコードでは、データの上の行の点から順番に結んでしまうらしい。そこで、x軸の列であるsepal_lengthをsortしたデータフレームを用意する。

```python
#matplotlib
df1=df.sort_values(by=["sepal_length"])#sepal_lengthによって、dfをsortする

fig=plt.figure()#pyplot.figureクラスをインスタンス化
ax=fig.add_subplot(1,1,1)#1行1列のサブプロットを作成し、1番目にaxを配置
ax.plot(df1["sepal_length"],df1["sepal_width"])#axに折れ線グラフを描画

ax.set_xlabel("sepal_length")#x軸ラベルを指定
ax.set_ylabel("sepal_width")#y軸ラベルを指定
```


![figure.png](https://qiita-image-store.s3.amazonaws.com/0/207726/ef23dbd0-85ac-3077-f6cb-98c31d131b21.png)




#棒グラフ
geom_bar()関数 / Axes.bar()メソッド
棒グラフを作成するためのデータとして、SpeciesごとのSepal.Widthの平均値をgroup_byにより作成する。

```R
#R
df1 <- 
  df %>% 
  group_by(Species) %>% 
  summarise(Sepal.Width_mean=mean(Sepal.Width))
df1
```
```R
#R
  Species    Sepal.Width_mean
  <fct>                 <dbl>
1 setosa                 3.43
2 versicolor             2.77
3 virginica              2.97
```


```python
#python
df2=\    #"\"を書くことで、コードの途中でも改行できる。
df.groupby("species").aggregate({"sepal_width":"mean"})
df2
```


```python
#python
            sepal_width
species                
setosa            3.428
versicolor        2.770
virginica         2.974
```

```R
#ggplot
ggplot(data = df1,aes(x=Species,y=Sepal.Width_mean))+
  geom_bar(stat = "identity")
```
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/207726/f85cbae8-84b5-54e2-6a60-2cbffaa7d6c5.png)



```python
#matplotlib
fig=plt.figure()#pyplot.figureクラスをインスタンス化
ax=fig.add_subplot(1,1,1)#1行1列のサブプロットを作成し、1番目にaxを配置
x=[1,2,3]#x座標を与える
y=[df2.query("species=='setosa'").sepal_width,\
   df2.query("species=='versicolor'").sepal_width,\
   df2.query("species=='virginica'").sepal_width]#y軸の値を与える
labels=["setosa","versicolor","virginica"]
ax.bar(x,y,tick_label=labels)##axに棒グラフを描画し、x座標をlabelsに置き換える
ax.set_xlabel("species")#x軸ラベルを指定
ax.set_ylabel("sepal_width")#y軸ラベルを指定

plt.show()
```
![figure.png](https://qiita-image-store.s3.amazonaws.com/0/207726/bf835af7-908a-5f4a-a57c-984fd2c67579.png)


随時更新していきます。2018/10/24

[参考文献]
[Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E2%80%95NumPy%E3%80%81pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-Wes-McKinney/dp/487311845X/ref=sr_1_8?ie=UTF8&qid=1540311077&sr=8-8&keywords=python)
[Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習](https://www.amazon.co.jp/Python%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%8F%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95Jupyter%E3%80%81NumPy%E3%80%81pandas%E3%80%81Matplotlib%E3%80%81scikit-learn%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-Jake-VanderPlas/dp/4873118417/ref=sr_1_39?ie=UTF8&qid=1540311142&sr=8-39&keywords=python)
[PythonユーザのためのJupyter[実践]入門](https://www.amazon.co.jp/Python%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEJupyter-%E5%AE%9F%E8%B7%B5-%E5%85%A5%E9%96%80-%E6%B1%A0%E5%86%85-%E5%AD%9D%E5%95%93/dp/4774192236/ref=sr_1_1?s=books&ie=UTF8&qid=1540311180&sr=1-1&keywords=python+jupyter)
[Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集](https://www.amazon.co.jp/R%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95ggplot2%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B0%E3%83%A9%E3%83%95%E4%BD%9C%E6%88%90%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94%E9%9B%86-Winston-Chang/dp/4873116538/ref=sr_1_1?s=books&ie=UTF8&qid=1540311200&sr=1-1&keywords=ggplot)
[Rではじめるデータサイエンス](https://www.amazon.co.jp/R%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-Hadley-Wickham/dp/487311814X/ref=pd_sbs_14_5?_encoding=UTF8&pd_rd_i=487311814X&pd_rd_r=909f6892-d6de-11e8-a3f6-7d92aa42fa48&pd_rd_w=kJAC0&pd_rd_wg=qtmzT&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=YNKZQGPW64AG2D1DQ68D&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=YNKZQGPW64AG2D1DQ68D)
[Tidyverse](https://www.tidyverse.org/)