matplotlib メモ

2018年10月30日

はじめに

matplotlib についてのメモ。Jupyter Notebook での利用を想定。

準備

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np

seaborn

seaborn を使う場合は、以下を追加する。

import seaborn as sns
sns.set()

ファイルからデータを読み込む

空白区切りのデータを読み込む場合は次のようにする。

data = np.loadtxt("data.txt")

データは np.array として読み込まれる。

"#" で始まる行がコメントになっているのであれば、次のようにして読み飛ばす。

data = np.loadtxt("data.txt", comments="#")

コメント文字の種類が複数ある場合はタプルで指定すればよい。

あるいは、先頭の 1 行だけがコメントになっているのであれば、次のようにしてもよい。

data = np.loadtxt("data.txt", skiprows=1)

CSV の場合は、区切り文字を指定する。

data = np.loadtxt("data.csv", delimiter=",")

ファイルにデータを書き出す

np.array のデータを CSV として保存するには、次のようにする。

np.savetxt("data.csv", data, delimiter=",")

プロット

データの 1 列目と 2 列目でプロットするには、次のようにする。

plt.plot(data[:, 0], data[:, 1])

複数のデータをプロットする場合は、そのまま続けて plot() すればよい。

Jupyter Notebook だとこれだけでグラフが表示されるが、ipython でのグラフの表示には以下の関数の実行が必要である。

plt.show()

ラベル (凡例で使われる) を付けるには次のようにする。

plt.plot(data[:, 0], data[:, 1], label="Data 1")

タイトルと軸のラベル、凡例を表示するには次のようにする。

plt.title("title")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()

次のように $...$ で囲めば、TeX の数式も使える。

plt.xlabel("$x$")

ラベルの文字のサイズは以下のように指定できる。

plt.xlabel("x", fontsize=14)

凡例は表示位置を指定できる。

plt.legend(loc="upper left")

loc には以下のものを指定できる。

  • lower right
  • best
  • center left
  • center right
  • lower left
  • upper left
  • center
  • upper right
  • right
  • upper center
  • lower center

凡例の文字のサイズを指定するには以下のようにする。

plt.legend(fontsize=20)

色や線種などの設定

たとえば線の色を赤にするには "r" を指定する。

plt.plot(data[:, 0], data[:, 1], "r")

点線にするには "--" を指定する。

plt.plot(data[:, 0], data[:, 1], "--")

鎖線は "-."。

plt.plot(data[:, 0], data[:, 1], "-.")

太さを変えるには、linewidth オプションを使う。

plt.plot(data[:, 0], data[:, 1], linewidth=2)

マーカーの表示には "o" や "." などを使う。

plt.plot(data[:, 0], data[:, 1], "o")

緑の十字の点で表示するには、"g+" とする。

plt.plot(data[:, 0], data[:, 1], "g+")

マーカーのサイズは ms オプションで指定できる。

plt.plot(data[:, 0], data[:, 1], "o", ms=2)

マーカーの色はオプションの mec (エッジ) と mfc (中身) でも指定できる。

plt.plot(data[:, 0], data[:, 1], "o", mec="red", mfc="pink")

マーカーの中の塗りつぶしをやめるにはつぎのようにする。

plt.plot(data[:, 0], data[:, 1], "o", mfc="none")

透過度は alpha で設定できる (0...1 で、0 が透明)。

plt.plot(data[:, 0], data[:, 1], "o", alpha=0.5)

日本語の使用

タイトルや軸のラベル、凡例で日本語を使いたい場合、Windows の場合は次のようにすればよい。

from matplotlib.font_manager import FontProperties
fp = FontProperties(fname="C:\Windows\Fonts\msgothic.ttc")

fp.set_size(12)

plt.title("タイトル", fontproperties = fp)
plt.xlabel("x の値", fontproperties = fp)
plt.ylabel("y の値", fontproperties = fp)
plt.legend(prop = fp);

参考

軸の範囲の指定

軸の範囲の指定は次のようにする。

plt.xlim([0, 1])
plt.ylim([0, 1])

目盛の間隔の設定

目盛の間隔を指定するには、次のようにする。

from matplotlib import ticker
ax = plt.gca()
ax.xaxis.set_major_locator(ticker.MultipleLocator(0.1))
ax.yaxis.set_major_locator(ticker.MultipleLocator(0.1))

書式設定

目盛の数値の書式設定は、次のようにする。

from matplotlib import ticker
ax = plt.gca()
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%.2f"))
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter("%.2f"))

ログスケール

ログスケールにするには、次のようにする。

ax = plt.gca()
ax.set_xscale("log")
ax.set_yscale("log")

軸の方向を逆にする

軸の方向を逆にするには次のようにする。

ax = plt.gca()
ax.invert_xaxis()
ax.invert_yaxis()

グラフを正方形にする

ax = plt.gca()
ax.set_aspect('equal', adjustable='box')

グリッド表示

グリッド表示するには、次のようにする。

plt.grid()

線の色や線種を変えることもできる。

plt.grid(color="r", linestyle="--")

2 軸表示

fig, ax1 = plt.subplots()
ax1.set_ylim([1200, 1300])
ax1.plot(data[:, 0], data[:, 1])
ax2 = ax1.twinx()
ax2.plot(data2[:, 0], data2[:, 1])

ベクトルを描く

ベクトルを描くには、次のようにする。

# 始点
x = [0, 5]
y = [0, 5]

# 成分
u = [1, -1]
v = [1, -1]

plt.quiver(x, y, u, v, angles="xy", scale_units="xy", scale=1)

次のようにしたほうが使いやすいかもしれない。

p = np.array([
    [0, 0],
    [5, 5],
])

vec = np.array([
    [1, 1],
    [-1, -1],
])

x = p[:, 0]
y = p[:, 1]

u = vec[:, 0]
v = vec[:, 1]

plt.quiver(x, y, u, v, angles="xy", scale_units="xy", scale=1);

参考

グラフサイズの指定

plt.figure(figsize=(8, 6), dpi=100) # 800x600

画像の保存

plt.savefig("fig.png")

棒グラフ

x = np.linspace(1, 4, 4)

label = [
    "apple",
    "banana",
    "lemon",
    "orange",
]

y = np.array([
    5,
    1,
    3,
    2,
])

plt.bar(x, y, tick_label=label, align="center", width=0.5)

複数のデータの表示。

x = np.linspace(1, 4, 4)

label = [
    "apple",
    "banana",
    "lemon",
    "orange",
]

y1 = np.array([
    5,
    1,
    3,
    2,
])

y2 = np.array([
    4,
    2,
    4,
    3,
])

wbar = 0.4

plt.bar(x, y1, color="g", label='2016', align="center", width=wbar)
plt.bar(x + wbar, y2, color="r", label='2017', align="center", width=wbar)
plt.xticks(x + wbar/2, label)

plt.legend()

棒の枠の色の指定は次のようにする。

plt.bar(x, y, edgecolor=["black"]*len(x))

X 軸ラベルを回転するには、次のようにする。

plt.xticks(rotation=90)

横棒グラフにするには、次のようにする。

plt.barh(x, y, tick_label=label, align="center", height=0.5)

データの順番を逆にするには、x の順番を逆にすればよい。

x = np.linspace(4, 1, 4)

注釈

グラフに注釈を入れることができる。

plt.annotate("...", xy=(x, y), size=10)

ヒストグラム

ヒストグラムの表示は次のようにする。

x = np.random.normal(50, 10, 5000)
plt.hist(x)

ビンの数を指定できる。

plt.hist(x, bins=32)

上面のエッジだけ表示させるには次のようにする。

plt.hist(x, histtype="step")

全部塗りつぶすには "step" の代わりに "stepfilled" を用いる。

色の指定は color と edgecolor で行う。

plt.hist(x, color="pink", edgecolor="black")