Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

matplotlibで折れ線グラフ

計算結果をビジュアルで見るには、やはりグラフを描くのが一番ですね。
 
ということで、matplotlibの使い方を簡単に紹介します。
 

import matplotlib.pyplot as plt

listx = [1, 2, 3, 4]
listy = [1, 3, 4, 2]

plt.plot(listx, listy)

 
たったこれだけで、折れ線グラフが書けます。
 
f:id:rare_Remrin:20170421001409j:plain
 
グラフの種類もいろいろ。
・折れ線グラフ  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 )

f:id:rare_Remrin:20170421174825j:plain

グラフの色は自動で色分けしてくれますね。
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)

f:id:rare_Remrin:20170421181611j:plain

あれ?うまくいかない

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)

 
f:id:rare_Remrin:20170421232431j:plain
 
できた!
 
○曲線の描画 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)

f:id:rare_Remrin:20170428003129p:plain
 
(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()

f:id:rare_Remrin:20170526181249p:plain
 
他のサンプルや散布図などの別形式のグラフはまた近いうちに。
サンプルと散布図ってなんだか似てる・・・