matplotlib メモ2022年8月28日 | |
はじめにmatplotlib についてのメモ。Jupyter Notebook での利用を想定。 準備%matplotlib inline from matplotlib import pyplot as plt import numpy as np seabornseaborn を使う場合は、以下を追加する。 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 には以下のものを指定できる。
凡例の文字のサイズを指定するには以下のようにする。 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) デフォルトの色の指定色の指定は、color オプションでできる。 plt.plot(data[:, 0], data[:, 1], color="blue") ただし、これはデフォルトの色とは異なる。デフォルトの色を指定するのであれば、"tab:blue" などを指定する。 デフォルトの色のリストを用いて指定したい場合は、次のようにすればよい。 import matplotlib.colors as mcolors tab_colors = [x for x in mcolors.TABLEAU_COLORS.keys()] for i in range(3): plt.plot(data[:, 0], data[:, i+1], color=tab_colors[i]) 日本語の使用タイトルや軸のラベル、凡例で日本語を使いたい場合、日本語のフォントを指定する。
import matplotlib
matplotlib.rc("font", family="Hiragino Maru Gothic Pro", size=9)
family は、Windows の場合は "MS Gothic"、"Yu Gothic" など、macOS の場合は "Hiragino Maru Gothic Pro" などを指定すればよい。 次のように個別に指定する方法もある。
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 を利用したいときに使えるかもしれない。 コンター表示
ax = plt.gca()
ax.set_aspect("equal", adjustable="box")
m = plt.pcolor(x, y, u.T, shading="auto", vmax=1000)
plt.colorbar(m)
plt.contour(x, y, us.T, colors="black", linewidths=0.5)
| |
| PENGUINITIS | |