python 
 2019-09-24

すぐ忘れるので、matplotlibのよく使う記法をまとめておく
公式:https://matplotlib.org/gallery.html

普段は散布図とかplotとかしか使わないけど、こうして見るといろんなグラフがかけるみたい

目次

matplotlib,pyplot,pylabの違い

matplotlibがパッケージ全体
pyplotはそのモジュール、スクリプトで作図するときに使う
pylabのimportは推奨されてない模様、インタラクティブな作図にはこっちを使うらしい

基本的には、import matplotlib.pyplot as pltのように使う

参考:
https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related
https://stackoverflow.com/questions/11469336/what-is-the-difference-between-pylab-and-pyplot

グラフを描く

シンプルな例は以下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.show()

simple-glaph

macでmatplotlibを呼ぶとValueError: unknown locale: UTF-8で怒られることがある。
locale周りの設定がおかしいため。以下を参考に直す。
Mac で ValueError: unknown locale: UTF-8 のエラーを解決したい
https://www.lifewithpython.com/2016/09/python-ValueError-unknown-locale-UTF-8.html

インスタンス化する

plt.figure()でインスタンス化し、axesに対してプロットしていく
多分この使い方が多いと思う

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

以下のように描いても同じ

fig, ax = plt.subplots(1, 1)
ax.plot(x,y)
plt.show()

複数のグラフを描く

複数のウィンドウに分けて描画

fig = plt.figure()の引数に適当にユニークな数字を入れておく。
figureに引数を与えることで、新たな図が生成される。
参考: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)

fig = plt.figure(2)
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

1つのウィンドウに複数のグラフを描画

1つのウィンドウに複数のグラフを描く場合は以下のようにする。

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax2 = fig.add_subplot(212)
ax2.plot(x,y)
plt.show()

以下のように2つのグラフが描画される。

simple-glaph-two

以下のように描いても同じ、axesをタプルで受け取るのがちょっと気持ち悪い

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(x,y)
ax2.plot(x,y)
plt.show()

グラフの保存

savefigでグラフの保存が可能

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.savefig("./test2")

複数のグラフを描画した場合には、figureインスタンスに対してもsavefigが使える。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)
fig.savefig("./test1")

fig = plt.figure(2)
ax = fig.add_subplot(111)
ax.plot(x,y)
fig.savefig("./test2")

グラフを整形する

グラフの線の色、太さ、線の種類などはよく使う。
それぞれ、color,linewidth,linestyleの引数を与えることで設定できる。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,color="red",linewidth=2,linestyle="dashed")
plt.show()

simple-glaph-format

引数の詳細は公式の以下のページから確認できる。
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html

タイトルや軸名をつける

シンプルな例は以下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.title("test")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

simple-glaph-label

インスタンス化した場合は次のようにする。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ax.set_title("test")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.show()

グラフの余白、幅を調整する

plt.subplots_adjustで調整可能

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95)
plt.show()

わかりづらいが調整できてる。

調整前 simple-glaph-adjest-before

調整後 simple-glaph-adjest-after

デフォルト値は以下

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for space between subplots,
               # expressed as a fraction of the average axis width
hspace = 0.2   # the amount of height reserved for space between subplots,
               # expressed as a fraction of the average axis height

1つのウィンドウに複数のグラフを描画し軸名など入れた場合、グラフが重なることがある。
その場合は、plt.subplots_adjust(hspace=0.4)のように調整できる。
横幅は、wspaceで調整可能。

fig = plt.figure()
plt.subplots_adjust(hspace=0.6)
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax2 = fig.add_subplot(212)
ax2.plot(x,y)
plt.show()

調整前
simple-glaph-adjest-width-before

調整後
simple-glaph-adjest-width-after

参考:https://www.haya-programming.com/entry/2018/10/11/030103

軸を設定し直す

ちょっとめんどくさい

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ticks = "abcdefghijklmnopqrstuvwxyz"
plt.xticks(x,list(ticks))
plt.show()

設定し直したい次元と、元の軸の次元が合ってなくても設定できる模様。

x軸に時刻を設定、フォーマット

datetimeをそのままx軸に利用できる。

import matplotlib.pyplot as plt
import pandas as pd
x = [
    '2018/08/08T12:15:45.000',
    '2018/08/08T12:15:45.200',
    '2018/08/08T12:17:45.600'
]
x = pd.to_datetime(x,format='%Y/%m/%dT%H:%M:%S.%f')
y = [1,2,3]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

フォーマットは、ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M'))を使って行う。

import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates

x = [
    '2018/08/08T12:15:45.000',
    '2018/08/08T12:15:45.200',
    '2018/08/08T12:17:45.600'
]
x = pd.to_datetime(x,format='%Y/%m/%dT%H:%M:%S.%f')

y = [1,2,3]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M'))
plt.show()

simple-glaph-format-time

参考:https://hack-le.com/matplotlib-x-date-format/

すぐ忘れるので、matplotlibのよく使う記法をまとめておく
公式:https://matplotlib.org/gallery.html

普段は散布図とかplotとかしか使わないけど、こうして見るといろんなグラフがかけるみたい

matplotlib,pyplot,pylabの違い

matplotlibがパッケージ全体
pyplotはそのモジュール、スクリプトで作図するときに使う
pylabのimportは推奨されてない模様、インタラクティブな作図にはこっちを使うらしい

基本的には、import matplotlib.pyplot as pltのように使う

参考:
https://matplotlib.org/faq/usage_faq.html#matplotlib-pyplot-and-pylab-how-are-they-related
https://stackoverflow.com/questions/11469336/what-is-the-difference-between-pylab-and-pyplot

グラフを描く

シンプルな例は以下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.show()

simple-glaph

macでmatplotlibを呼ぶとValueError: unknown locale: UTF-8で怒られることがある。
locale周りの設定がおかしいため。以下を参考に直す。
Mac で ValueError: unknown locale: UTF-8 のエラーを解決したい
https://www.lifewithpython.com/2016/09/python-ValueError-unknown-locale-UTF-8.html

インスタンス化する

plt.figure()でインスタンス化し、axesに対してプロットしていく
多分この使い方が多いと思う

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

以下のように描いても同じ

fig, ax = plt.subplots(1, 1)
ax.plot(x,y)
plt.show()

複数のグラフを描く

複数のウィンドウに分けて描画

fig = plt.figure()の引数に適当にユニークな数字を入れておく。
figureに引数を与えることで、新たな図が生成される。
参考: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)

fig = plt.figure(2)
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

1つのウィンドウに複数のグラフを描画

1つのウィンドウに複数のグラフを描く場合は以下のようにする。

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax2 = fig.add_subplot(212)
ax2.plot(x,y)
plt.show()

以下のように2つのグラフが描画される。

simple-glaph-two

以下のように描いても同じ、axesをタプルで受け取るのがちょっと気持ち悪い

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(x,y)
ax2.plot(x,y)
plt.show()

グラフの保存

savefigでグラフの保存が可能

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.savefig("./test2")

複数のグラフを描画した場合には、figureインスタンスに対してもsavefigが使える。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)
fig.savefig("./test1")

fig = plt.figure(2)
ax = fig.add_subplot(111)
ax.plot(x,y)
fig.savefig("./test2")

グラフを整形する

グラフの線の色、太さ、線の種類などはよく使う。
それぞれ、color,linewidth,linestyleの引数を与えることで設定できる。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,color="red",linewidth=2,linestyle="dashed")
plt.show()

simple-glaph-format

引数の詳細は公式の以下のページから確認できる。
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html

タイトルや軸名をつける

シンプルな例は以下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.title("test")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

simple-glaph-label

インスタンス化した場合は次のようにする。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ax.set_title("test")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.show()

グラフの余白、幅を調整する

plt.subplots_adjustで調整可能

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

plt.plot(x,y)
plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95)
plt.show()

わかりづらいが調整できてる。

調整前 simple-glaph-adjest-before

調整後 simple-glaph-adjest-after

デフォルト値は以下

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for space between subplots,
               # expressed as a fraction of the average axis width
hspace = 0.2   # the amount of height reserved for space between subplots,
               # expressed as a fraction of the average axis height

1つのウィンドウに複数のグラフを描画し軸名など入れた場合、グラフが重なることがある。
その場合は、plt.subplots_adjust(hspace=0.4)のように調整できる。
横幅は、wspaceで調整可能。

fig = plt.figure()
plt.subplots_adjust(hspace=0.6)
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax2 = fig.add_subplot(212)
ax2.plot(x,y)
plt.show()

調整前
simple-glaph-adjest-width-before

調整後
simple-glaph-adjest-width-after

参考:https://www.haya-programming.com/entry/2018/10/11/030103

軸を設定し直す

ちょっとめんどくさい

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.2)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ticks = "abcdefghijklmnopqrstuvwxyz"
plt.xticks(x,list(ticks))
plt.show()

設定し直したい次元と、元の軸の次元が合ってなくても設定できる模様。

x軸に時刻を設定、フォーマット

datetimeをそのままx軸に利用できる。

import matplotlib.pyplot as plt
import pandas as pd
x = [
    '2018/08/08T12:15:45.000',
    '2018/08/08T12:15:45.200',
    '2018/08/08T12:17:45.600'
]
x = pd.to_datetime(x,format='%Y/%m/%dT%H:%M:%S.%f')
y = [1,2,3]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
plt.show()

フォーマットは、ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M'))を使って行う。

import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates

x = [
    '2018/08/08T12:15:45.000',
    '2018/08/08T12:15:45.200',
    '2018/08/08T12:17:45.600'
]
x = pd.to_datetime(x,format='%Y/%m/%dT%H:%M:%S.%f')

y = [1,2,3]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M'))
plt.show()

simple-glaph-format-time

参考:https://hack-le.com/matplotlib-x-date-format/

See Also