LoginSignup
11
20

More than 3 years have passed since last update.

独特のお作法があって初心者が引っかかりがちなmatplotlibの入門記事です

試行環境

windows10
jupyter notebook

使うデータ

なんでも良いですが、iris使っときます

python
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
data.head()

image.png

1. グラフいろいろ

基本的に全部matplotlib.pyplotを使います。また、jupyter notebookで表示する為に%matplotlib inlineとしておきます。(最近は%matplotlib inlineしなくても2回目以降表示されるようになったようですが一応やっときます)

python
import matplotlib.pyplot as plt
%matplotlib inline

グラフを描くだけなら1行で書けます

python
plt.hist(data['sepal length (cm)'], bins=10) # ヒストグラム

python
plt.plot(data['sepal length (cm)'])

python
plt.scatter(data['sepal length (cm)'], data['sepal width (cm)'])

python
import numpy as np
tmp = data['sepal length (cm)'].head(20)
plt.bar(np.arange(len(tmp)), tmp)

2. グラフを整える

最初にmatplotlibのお作法を確認しておきましょう。matplotlib.pyplotは最初に呼ばれた時にpyplotオブジェクトを作ります。以降は作られたオブジェクトに変更が加わっていきます。さっきまでの書き方だとplt.scatter()で作ったpyplotオブジェクトがそのまま表示していましたが、表示する前に同じオブジェクトに変更指示を与えれば形や軸ラベルなどを変更できます。

python
plt.figure(figsize=(4, 4), dpi=80)  # 縦横サイズと解像度を指定
plt.plot(data['sepal length (cm)']) # プロットする
plt.title('title')                  # タイトル
plt.xlabel('sepal length (cm)')     # Xラベル
plt.ylabel('value')                 # Yラベル
plt.xlim(0, 150)                    # X軸の範囲
plt.ylim(0, 10)                     # Y軸の範囲
plt.xticks(np.arange(0,151,25))     # X軸目盛りを指定
plt.yticks(np.arange(0,11,2))       # Y軸目盛りを指定
plt.legend(loc='upper right')       # 凡例を表示
plt.show()                          # グラフを表示

ダウンロード (6).png

3. グラフの重ね書き

同じpyplotオブジェクトに続けてプロットすれば重ねてプロットすることができます。プロットする度にパレットの色を順番に適用してくれるのでいちいち色を指定しなくてもそれっぽく表示してくれます。

python
plt.figure(figsize=(4, 4), dpi=80)
plt.plot(data['sepal length (cm)']) # プロットする
plt.plot(data['sepal width (cm)']) # プロットする
plt.title('title')
plt.xlabel('sepal length (cm)')
plt.ylabel('value')
plt.xlim(0, 150)
plt.ylim(0, 10)
plt.xticks(np.arange(0,151,25))
plt.yticks(np.arange(0,11,2))
plt.legend(loc='upper right')
plt.show()

ダウンロード (9).png

4. グラフを複数まとめて表示する

plt.subplot()でsubplotオブジェクトをつくって、そこにプロットを書いていけば複数プロットをまとめて表示できます。plt.subplot(231)だと縦に2個、横に3個で配置する内の1番目のsubplotオブジェクトを作ります。

python
plt.figure(figsize=(4, 6), dpi=80)  # 縦横サイズと解像度を指定
plt.subplots_adjust(wspace=0.4, hspace=0.45)

ax = plt.subplot(211)               # サブプロットの1個目
ax.plot(data['sepal length (cm)'])
ax.set_title('title')
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('value')        
ax.set_xlim(0, 150)               
ax.set_ylim(0, 10)                
ax.set_xticks(np.arange(0,151,25))
ax.set_yticks(np.arange(0,11,2))
ax.legend(loc='upper right')      

ax = plt.subplot(212)               # サブプロットの2個目
ax.plot(data['sepal width (cm)'])
ax.set_title('title')
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('value')
ax.set_xlim(0, 150)
ax.set_ylim(0, 10)
ax.set_xticks(np.arange(0,151,25))
ax.set_yticks(np.arange(0,11,2))
ax.legend(loc='upper right')

plt.show()  # グラフを表示

ダウンロード (8).png
ちなみにsubplotオブジェクトは維持してなくても良いので以下のような書き方もできます。

python
plt.figure(figsize=(8, 8), dpi=80)
plt.subplots_adjust(wspace=0.3, hspace=0.35)

for k, each in enumerate(data.columns):
    ax = plt.subplot(221+k)
    ax.plot(data[each])
    ax.set_title(str(k+1))
    ax.set_xlabel(each)
    ax.set_ylabel('value')
    ax.set_xlim(0, 150)
    ax.set_ylim(0, 10)
    ax.set_xticks(np.arange(0,151,25))
    ax.set_yticks(np.arange(0,11,2))
    ax.legend(loc='upper right')

plt.show() 

ダウンロード (7).png
論文で見るようなプロットも簡単に作れますね。

5. スタイルを使う

styleを適用してデザインをまとめて変更できます

python
plt.style.use('ggplot')

python
plt.style.use('fivethirtyeight')

python
plt.style.use('grayscale')

6. 日本語表示を出来るようにする

matplotlibは標準だと日本語表示が出来ませんので日本語を使おうとすると豆腐だらけになります
ダウンロード (14).png
日本語表示が出来るようにする方法は色々ありますが、一番簡単なのはjapanize_matplotlibを使うことです。このpackageは内部に日本語フォントをもっていて呼ばれた時にfontを指定してくれます。ただし、plt.style.use()を使うとfontを指定し直してしまいますのでjapanize_matplotlibを呼ぶのはplt.style.use()より後にします。

python
import japanize_matplotlib

詳しくはこちらを参照
https://qiita.com/uehara1414/items/6286590d2e1ffbf68f6c

7. 画像を保存する

plt.show()する前にplt.savefig()で保存できます。以下だとcodeのあるフォルダにtest.pngとして書き出します。標準だとtitleやlabelが出力されない事があるのでbbox_inches='tight'で描画範囲に合わせて書き出されるようにします。

python
plt.savefig('./test.png', dpi=150, bbox_inches='tight')

もっと詳しく知りたい人は

公式ドキュメント
https://matplotlib.org/gallery/index.html

legendについてはここが詳しいです
http://pynote.hatenablog.com/entry/matplotlib-legend

styleについてはこの辺
https://matplotlib.org/3.1.0/gallery/style_sheets/style_sheets_reference.html
https://qiita.com/eriksoon/items/b93030ba4dc686ecfbba

11
20
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
11
20