matplotlib メモ

2020年5月24日

はじめに

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)

凡例をグラフの外側に置きたい場合は次のようにする。

plt.legend(bbox_to_anchor=(1.03, 1), loc='upper left', borderaxespad=0)

これだけだとウインドウで描画したときに凡例が見切れることがあるので、次のように調整する。

plt.subplots_adjust(right=0.7)

反例を 2 段にしたい場合は次のようにする。

plt.legend(ncol=2)

色や線種などの設定

たとえば線の色を赤にするには "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"))

日付の場合は次のようにする。

from matplotlib import dates
ax = plt.gca()
ax.xaxis.set_major_formatter(dates.DateFormatter("%y/%m/%d"))

年は "%y" だと 2 桁、"%Y" だと 4 桁になる。

ログスケール

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

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

軸の方向を逆にする

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

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

目盛ラベルを非表示にする

plt.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False)

目盛を非表示にする

plt.tick_params(bottom=False,
                left=False,
                right=False,
                top=False)

軸を非表示にする

ax = plt.gca()
ax.spines["bottom"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

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])

グラフを正方形にする

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

グリッド表示

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

plt.grid()

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

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

グラフサイズの指定

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

画像の保存

plt.savefig("fig.png")

余白を小さくするには、次のようにする。

plt.tight_layout()
plt.savefig("fig.png")

Jupyter Notebook でファイル出力だけしてインライン表示したくない場合は、出力後に以下のようにすればよい。

plt.close()

ベクトルを描く

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

# 始点
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);

参考

棒グラフ

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")

絵として描画して表示

from matplotlib import pyplot as plt
import numpy as np
from io import BytesIO
from PIL import Image

x = np.arange(0., 2.*np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)

output = BytesIO()
plt.savefig(output, format="png")

img = Image.open(output)
img.show()

あるいは

from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
import numpy as np
from io import BytesIO
from PIL import Image

fig = Figure()
axes = fig.add_subplot(111)

x = np.arange(0., 2.*np.pi, 0.1)
y = np.sin(x)
axes.plot(x, y)

canvas = FigureCanvasAgg(fig)
output = BytesIO()
canvas.print_png(output)

img = Image.open(output)
img.show()

Python 外から matplotlib を利用したいときに使えるかもしれない。