読者です 読者をやめる 読者になる 読者になる

matplotlibの使い方

今回はmatplotlibについてです。

二次元グラフ

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3.0, 3.0, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()

f:id:takahiro-itazuri:20170215171229p:plain

三次元グラフ

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

_x = np.arange(-3.0, 3.0, 0.1)
_y = np.arange(-3.0, 3.0, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X, Y, Z)

plt.show()

ワイヤーフレーム

ax.plot_wireframe(X, Y, Z)

f:id:takahiro-itazuri:20170215171613p:plain
サーフェス

ax.plot_surface(X, Y, Z, rstride=1, cstride=1)

f:id:takahiro-itazuri:20170215191845p:plain
三次元プロット

ax.plot3D(np.ravel(X), np.ravel(Y), np.ravel(Z))

f:id:takahiro-itazuri:20170215192326p:plain
等高線

ax.contour3D(X, Y, Z)

f:id:takahiro-itazuri:20170215192457p:plain

ax.contourf3D(X, Y, Z)

f:id:takahiro-itazuri:20170215192624p:plain
散布図

ax.scatter3D(np.ravel(X), np.ravel(Y), np.ravel(Z))

f:id:takahiro-itazuri:20170215192755p:plain

画像として保存

import matplotlib.pyplot as plt

filename = "output.png"
plt.savefig(filename)

凡例、軸ラベル、タイトル

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>>
>>> x = np.arange(0, 6, 0.1)
>>> y = np.sin(x)
>>> plt.plot(x, y, label="sin")
[<matplotlib.lines.Line2D object at 0x00000253B0CCB4A8>]
>>> plt.xlabel("x")
<matplotlib.text.Text object at 0x00000253B11BF4A8>
>>> plt.ylabel("y")
<matplotlib.text.Text object at 0x00000253B11D35C0>
>>> plt.title("sin")
<matplotlib.text.Text object at 0x00000253B0CA1D30>
>>> plt.legend()
<matplotlib.legend.Legend object at 0x00000253B0C9C5C0>
>>> plt.show()

f:id:takahiro-itazuri:20170217050849p:plain

破線

>>> x = np.arange(0, 6, 0.1)
>>> y = np.sin(x)
>>> y2 = np.cos(x)
>>> plt.plot(x, y, label="sin")
[<matplotlib.lines.Line2D object at 0x00000253B1259518>]
>>> plt.plot(x, y2, linestyle='--', label="cos")
[<matplotlib.lines.Line2D object at 0x00000253B1259DD8>]
>>> plt.xlabel("x")
<matplotlib.text.Text object at 0x00000253B0E83320>
>>> plt.ylabel("y")
<matplotlib.text.Text object at 0x00000253B0E8A9E8>
>>> plt.title("sin & cos")
<matplotlib.text.Text object at 0x00000253B1232DA0>
>>> plt.legend()
<matplotlib.legend.Legend object at 0x00000253B4A90780>
>>> plt.show()

f:id:takahiro-itazuri:20170217051234p:plain

解像度を上げる

plt.savefig(filename, dpi=300)

色々設定

plt.rcParams['font.family'] = 'Times New Roman' #全体のフォントを設定
plt.rcParams['font.size'] = 20 #フォントサイズを設定
plt.rcParams['axes.linewidth'] = 1.5 #軸の太さを設定。目盛りは変わらない
plt.rcParams['xtics.major.size'] = 10 #x軸目盛りの長さ
plt.rcParams['xtics.major.width'] = 1.5 #x軸目盛りの太さ

# 軸ラベル等をLatex形式で書きたいとき
plt.xlabel(r'$x$')

クラスの使い方

x = np.arange(-3, 3, 0.01)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 1. Figureのインスタンスを生成
fig = plt.figure()
print("type(fig): {}".format(type(fig)))

# 2. Axesのインスタンスを生成
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
print("type(ax1): {}".format(type(ax1)))

# 3. データを渡してプロット
ax1.plot(x, y_sin)
ax2.plot(x, y_cos)

# 4. y軸の範囲を調節とグラフタイトル・ラベル付け
ax1.set_ylim(-1.3, 1.3)
ax2.set_ylim(-1.3, 1.3)

ax1.set_title("$\sin x$")
ax2.set_title("$\cos x$")

ax1.set_xlabel("x")
ax2.set_xlabel("x")

fig.tight_layout()  # タイトルとラベルが被るのを解消

プロットの種類

plt.plot( [1,2,3], '-')  # 折れ線
plt.plot( [1,2,3], '--') # 破線
plt.plot( [1,2,3], '-.') # 一点破線
plt.plot( [1,2,3], ':')  # 点線
plt.plot( [1,2,3], '.')  # 点
plt.plot( [1,2,3], ',')  # ドット
plt.plot( [1,2,3], 'o')  # 円
plt.plot( [1,2,3], 'v')  # 下向き三角
plt.plot( [1,2,3], '^')  # 上向き三角
plt.plot( [1,2,3], '<')  # 左向き三角
plt.plot( [1,2,3], '>')  # 右向き三角
plt.plot( [1,2,3], 's')  # 正方形
plt.plot( [1,2,3], 'p')  # 五角形
plt.plot( [1,2,3], 'h')  # 六角形 (縦)
plt.plot( [1,2,3], 'H')  # 六角形 (横)
plt.plot( [1,2,3], '+')  # 十字
plt.plot( [1,2,3], 'x')  # バツ
plt.plot( [1,2,3], 'd')  # 菱形
plt.plot( [1,2,3], 'D')  # 正方形 (斜め)
plt.plot( [1,2,3], '|')  # 縦線
plt.plot( [1,2,3], '_')  # 横線

# 合わせ技
plt.plot( [1,2,3], '-o')   # 折れ線 + 円
plt.plot( [1,2,3], '--o')  # 破線 + 円