Matplotlibのサンプルプログラム
冒頭部の記述

%matplotlib inline
# スクリプトにエクスポートすると以下のような記述に変わります。
#get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt

折れ線グラフを描く

yvalue = [100, 300, 200, 400, 500]
xvalue = [1,2,3,4,5]

# 点のマークはx,oは見た目通り。^は△、vは▽、sは正方形、Dはダイヤ、*は星形、hは六角形など
plt.plot(xvalue, yvalue, marker="^")
plt.title("Graph Title", fontsize=20)
plt.xlabel("X-Value", fontsize=16)
plt.ylabel("Y-Value", fontsize=16)
# 描画範囲はデフォルトでは全ての点が収まるように自動調整される。
# 明示的に指定したい場合はxlim、ylimを使う
plt.ylim(80,540)
plt.grid(True)
plt.show()

なお、上の例のtitle、xlabel、ylabelなどで描画したい文字列に、デフォルトでは日本語は使用できません。 簡単に使う方法は以降の例でご紹介します。

棒グラフを描く

labels = ["A","B","C","D","E","F"]
x = range(0,len(labels))
y = [10, 30, 40, 20, 50, 60]
plt.bar(x, y, tick_label = labels)
# barの代わりにbarhを使うと横向きの棒グラフになる。引数の指定方法は同じ
#plt.barh(x, y, tick_label = labels)
plt.show()

円グラフを描く

# 角度が回る向き=反時計回りに描くので、円グラフとしては比率が小さい方から描くのがポイント
labels = ["E", "D", "C", "B", "A"]
y = [5, 10, 18, 32, 48]
# explode=に値を設定するとパイが切り離されたように描画される
ex = [0, 0, 0, 0.05, 0.2]
plt.pie(y, explode=ex, labels=labels, autopct="%1.1f%%", startangle=90)
# 時計回りにするにはcounterclock=Falseにすればよい
#plt.pie(y, explode=ex, labels=labels, autopct="%1.1f%%", startangle=90, counterclock=False)
plt.show()

同じ領域に複数のグラフを描く
同じ領域に複数のグラフを描くには、figureをまず作り、個々のグラフをadd_subplotします。

fig = plt.figure()

labels = ["A","B","C","D","E","F"]
x = range(0,len(labels))
y = [10, 30, 40, 20, 50, 60]
graph1 = fig.add_subplot(1, 2, 1)
graph1.bar(x, y, tick_label = labels)
graph1.set_title("graph-1")

labels = ["E", "D", "C", "B", "A"]
y = [5, 10, 18, 32, 48]
ex = [0, 0, 0, 0, 0.2]
graph2 = fig.add_subplot(1, 2, 2)
graph2.pie(y, explode=ex, labels=labels, autopct="%1.1f%%", startangle=90)
graph2.set_title("graph-2")
plt.show()

散布図を描画する

yvalue = [72, 74, 82, 85, 73, 70, 77, 84, 76, 78]
xvalue = [160, 170, 177, 172, 168, 162, 175, 173, 169, 178]

# グラフのスタイルを指定可能
plt.style.use("seaborn-darkgrid")
# plt.style.use("ggplot")

# figureでグラフ領域の大きさを指定できる。使わないといい感じにデフォルトで確保される
#plt.figure(figsize=(6,6))
plt.scatter(xvalue, yvalue, marker="^")
plt.xlim(155, 185)
plt.ylim(60, 90)

# matplotlibで日本語を使う方法は幾つかあるが、最も簡単にはOSシステムフォントを使う事
plt.title("身長と体重のサンプルデータ", fontsize=20, fontname="MS Gothic")
#plt.xlabel("Height", fontsize=16)
plt.xlabel("身長", fontsize=16, fontname="Meiryo")
#plt.ylabel("Weight", fontsize=16)
plt.ylabel("体重", fontsize=16, fontname="Meiryo")

# グラフと関係ない独立したテキストも表示できる
plt.text(160,63,"この例では多少の相関が見て取れる。", fontname="Meiryo", fontsize=14)

# グラフを画像ファイルとして保存できる。
# ただしshowすると描画領域がリセットされ真っ白になる。showの前に実行するのがポイント
# plt.savefig("./graph_output.png")
# ちなみに%matplotlib inlineを実行するとshowしなくても画面に表示される
plt.show()

この例では本来の散布図を描く以外に幾つかのおまけを使っています。
まず「plt.style.use("seaborn-darkgrid")」の指定で通常よりも格好いいグラフのデザインにしています。
次に日本語を使う方法は幾つかあり、代表的なものに
  1. 日本語化済matplotlibをインストールする
  2. OS標準のシステムフォントを使う
  3. FontManagerを使用してTTFフォントファイルをロードする
があるそうです。ここでは一番簡単なシステムフォントを使用しています。
最後に、描いたグラフを「plt.savefig("./graph_output.png")」でPNG画像ファイルに出力しています。 コメント中に注意があるように、showの実行より前に行う必要があります。 あるいは、Jupyter NotebookやJupyterLabでは「%matplotlib inline」を実行すると、 デフォルトでshowを実行しなくても、実行する区切りの度にグラフが画面に描画されます。

指定できるスタイルの一覧を表示

plt.style.available

複数グループを色分けした散布図を描画する

yvalue = [72, 74, 82, 85, 73, 70, 77, 84, 76, 78,
          68, 69, 86, 77, 70, 72, 69, 76, 77, 81]
xvalue = [160, 170, 177, 172, 168, 162, 175, 173, 169, 178,
          164, 171, 176, 170, 175, 173, 173, 162, 172, 173]
groups = [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]

plt.style.use("seaborn-darkgrid")

plt.scatter(xvalue, yvalue, marker="v", c=groups, cmap="bwr")
plt.xlabel("Height", fontsize=16)
plt.ylabel("Weight", fontsize=16)
plt.xlim(155, 185)
plt.ylim(60, 90)
plt.show()

この例ではXとYの値のリストに加えて、各データが所属するグループをgroupsというリストに保持し、 plt.scatter関数に渡しています。これによってグループによる色分けが可能です。
またcmapは色分けを定義したカラーマップで、特にカスタマイズが不要ならばbwr,brg,jetなどの定義済の文字列で指定可能です。 定義済色マップの全体は 公式マニュアルのこのページで確認できます。

複数のデータを色を変えて同じ散布図上に描画する(凡例付き)

yvalue1 = [72, 74, 82, 85, 73, 70, 77, 84, 76, 78]
yvalue2 = [68, 69, 86, 77, 70, 72, 69, 76, 77, 81]
xvalue1 = [160, 170, 177, 172, 168, 162, 175, 173, 169, 178]
xvalue2 = [164, 171, 176, 170, 175, 173, 173, 162, 172, 173]

#plt.style.use("seaborn-darkgrid")
plt.style.use("ggplot")

plt.scatter(xvalue1, yvalue1, marker="*", c="green",   cmap="bwr", label="Group-1")
plt.scatter(xvalue2, yvalue2, marker="h", c="magenta", cmap="bwr", label="Group-2")
plt.xlabel("Height", fontsize=16)
plt.ylabel("Weight", fontsize=16)
plt.xlim(155, 185)
plt.ylim(60, 90)
plt.legend(loc="upper left", fontsize=12)
plt.show()

今後はまた少し違って、複数の異なる系列データを同じ散布図上に描画しています。
各系列を色分けするためにplt.scatterのcで今度は色そのものを指定しています。 "green"のような英単語の代わりに"g"と1文字だけでも行けます。
さらにlabelで系列名を表す文字列を渡し、plt.legend関数を使うことで凡例を表示しています。 凡例の位置は例のように文字列で指定できます。

Misc. Topics Top

(first uploaded 2024/02/19 last updated 2024/02/25, URANO398)