matplotlibで折れ線グラフ
計算結果をビジュアルで見るには、やはりグラフを描くのが一番ですね。
ということで、matplotlibの使い方を簡単に紹介します。
import matplotlib.pyplot as plt listx = [1, 2, 3, 4] listy = [1, 3, 4, 2] plt.plot(listx, listy)
たったこれだけで、折れ線グラフが書けます。
グラフの種類もいろいろ。
・折れ線グラフ plt.plot(listx, listy)
・縦棒グラフ plt.bar(listx, listy)
・横棒グラフ plt.barh(listx, listy)
・散布図 plt.plot(listx, listy, "ro") "ro":赤い円
(または) plt.scatter
・ヒストグラム plt.hist()
・等高線
・3D棒グラフ
・3Dメッシュ
key | 内容 | 略表記 | defalut |
---|---|---|---|
linewidth, | 線の太さ | lw | |
linestyle, | solid, dashed, dashdot, dotted | ls | solid(実線) |
color | "red"など | c | |
marker | マーカーの種類 "o":丸 "s":square, "D":ひし形, "x", "+"他 | None | |
markersize | マーカーの大きさ | ms | |
markeredgewidth | マーカーの枠線の太さ | mew | |
markeredgecolor | マーカーの枠線の色 | mec | |
markerfacecolor | マーカーの塗りつぶしの色 | mfc | |
antialiased | 線を滑らかにする処理 True, False |
マーカーを入れてみた。
import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4]) y = np.array([1, 3, 4, 2]) plt.plot(x, y, marker="o") plt.plot(x, y*.8,marker="+", markersize=10, markeredgewidth=2 ) plt.plot(x, y*.6, marker="s", linewidth=1 )
グラフの色は自動で色分けしてくれますね。
1:緑 2:橙 3:緑 4:赤 5:紫
6:茶 7:桃 8:灰 9:黄緑 10:水色
plt.show()をせずに連続してグラフを書くと、どんどん次の色へとなっていきました。
グラフエリアの設定など
plt.figure(figsize=(8,6), dpi=80) #figsizeはinch plt.subplot(2, 3, 1) #エリアを縦2、横3に分割してその1番目 plt.tight_layout() #サブエリアの図が重ならないように。 plt.xlim(x.min, x.max*1.1) #xの変域 plt.xticks(-4, 4, 9) #目盛り -4から4まで全9個 plt.xticks([-4, -3, -2, ..., 4]) #上と同じ ax = plt.gca() #軸の情報 get current axis ax.spines["right"].set_color("none") #右消し ax.xaxis.set_ticks_position("bottom") #目盛りは軸の下 plt.plot(x, y, color=~, label="凡例")#凡例 plt.legend(loc="upper_left") #凡例 plt.savefig("test.png", dpi=72) #グラフの保存 plt.show() #グラフの表示 plt.hlines([1, 2, 3], 左端,右端, ls="dashed") #横線の描画
折れ線グラフの他のオプション
plt.title("グラフのタイトル")
plt.xlabel("x軸")
plt.ylabel("y軸")
plt.grid(True) #罫線の表示
最初の色に戻してx軸、y軸、グラフタイトルを入れてみると・・・
x = np.array([1, 2, 3, 4]) y = np.array([1, 3, 4, 2]) plt.plot(x, y, marker="o") plt.plot(x, y*.8,marker="+", markersize=10, markeredgewidth=2 ) plt.plot(x, y*.6, marker="s", linewidth=1 ) plt.title("折れ線グラフ") plt.xlabel("x軸") plt.ylabel("y軸") plt.grid(True)
あれ?うまくいかない
matplotlibで日本語 を見ると、何やら日本語表示にはfontpropertyをセットするようです。
from matplotlib.font_manager import FontProperties fp = FontProperties(fname='C:\WINDOWS\Fonts\msgothic.ttc', size=14)
WindowsのFontフォルダから適当に好みのフォントを選んでセットですね
グラフタイトル、軸ラベル、メモリ、テキスト、アノテーションにはfontproperties=fpのオプションをつけて、
凡例だけはprop=ftとオプションをつけます。
x = np.array([1, 2, 3, 4]) y = np.array([1, 3, 4, 2]) plt.plot(x, y, marker="o") plt.plot(x, y*.8,marker="+", markersize=10, markeredgewidth=2 ) plt.plot(x, y*.6, marker="s", linewidth=1 ) plt.title("折れ線グラフ", fontproperties=fp) plt.xlabel("x軸", fontproperties=fp) plt.ylabel("y軸", fontproperties=fp) plt.legend(["1","2", "3"], loc="best", prop=fp) plt.grid(True)
できた!
○曲線の描画 y=f(x)
横軸を細かく分けると曲線に見えます。
def f(x): return x**3 - 6*x #f(x)=x^3-6x x = np.linspace(-2, 2, 40) #xの範囲 -2~2を40等分 y = f(x) plt.plot(x, y)
(x, y)でplotせずに、(x, f(x))でplotするとコードも短くなります。
def f(x): return x**3 - 6*x x = np.linspace(-2, 2, 40) plt.plot(x, f(x))
lambda式を使うともっと短く。
x = np.linspace(-2, 2, 40) plt.plot(x, (lambda x:x**3 - 6*x)(x))
1行でも書けますが、読みにくい・・・
plt.plot(np.linspace(-2, 2, 40), (lambda x:x**3 - 6*x)(np.linspace(-2, 2, 40)))
x = np.linspace(0, np.pi * 2, 100) y = np.sin(x) plt.plot(x, y) plt.title("y=sin(x)", fontsize=14) xlist = np.array(["0", "1/2π", "π", "3/2π", "2π"]) xtick = np.linspace(0, np.pi *2, 5) plt.xticks(xtick, xlist) plt.grid() plt.show()
他のサンプルや散布図などの別形式のグラフはまた近いうちに。
サンプルと散布図ってなんだか似てる・・・