matplotlibのグラフの体裁を整える

前回は折れ線グラフを作成しました。
ただ、グラフにはx軸の名前だったり凡例だったりが必要ですよね。
今回はそういった内容をやります。
また、複数段にわたってプロットする方法を記します。


以前のお話はこちら
matplotlibでグラフを書く - たこ焼き食べた.net


今回もほとんどの内容を公式サイトを参考に記しています。
Matplotlib: Python plotting — Matplotlib 3.0.3 documentation

テキスト関連

グラフの軸だったりに表示するテキストの設定を行ないます。
今回は簡単に、軸とタイトル、凡例などのみです。
なお、matplotlibでは日本語の文字列を埋め込むことができませんのでご注意ください。


テキストを図中に埋め込んだり、矢印を描画する手法もありますが、今回は省略します。
というより使ったことがないので。。。
表なんかも埋め込めるんですね。
Pyplot tutorialにあるので、気になる方はどうぞ。
Pyplot tutorial — Matplotlib 2.0.2 documentation


さて、今回のサンプルは下図のようになります。

from pylab import *

x = arange(0, 5, 0.1)
y = cos(x)

plot(x, y)
legend(('legend dayo',)) # 凡例
# どうでもいいけど、要素数一つのタプルは(A,)のようにカンマが必要です。お忘れなく。。。(忘れてた)
xlabel("Time [ps]", fontsize=20, fontname='serif') # x軸のタイトル
ylabel(r"$\mu_0$", fontsize=20, fontname='serif') # y軸
title("test", fontsize=25, fontname='serif') # タイトル
xticks(range(5), ("test", "1", "2", "3", "#4")) # xの目盛
yticks(fontsize=15) # yの目盛

show()


フォントの設定

以下のテキストは、フォントの指定の仕方等が一緒です。
フォントでいじるのはフォント名とフォントサイズがメインだと思います。
これらは、テキストを表示する関数に、キーワード引数として

  • fontname
  • fontsize

を与えてあげれば良いかと思います。
例えば、xlabel(後述)関数なら、

xlabel("test", fontname='serif', fontsize=20)

などとなります。

x, y軸のラベル, グラフのタイトル

関数xlabelとylabelによって指定することができます。
グラフのタイトルはtitle関数です。

軸のテキストの設定

軸についてる目盛の文字の大きさや、目盛の文字列も指定できます。
これは、xticks, yticks関数を使います。
フォントのサイズのみだけでも指定できます。


軸の文字列の変更は以下のようになります。

xticks([1,2,3,4,5], ('#1', '#2', '#3', '#4', '#5')

1番目はx軸の元の数字列、 2番目が変更後の文字列です。
1番目と2番目の要素のそれぞれが対応します。

凡例

凡例はlegend()関数で表示できます。
凡例内の文字列は、以下のようにタプルで与えることで指定できます。
plotする順番が早い順に、タプルの要素が割り振られます。

legend(('legend 1', '2', '3'), loc='upper left')

loc引数で、位置を指定することができます。
指定しない場合は最善の位置を、プログラム側が探してくれるので、指定する必要はほとんどないと思います。

数式の入力

Texの形式で数式を与えることで、数式を出力することもできます。
これはTexを入れてなくても出力することができ、大変便利です。
Tex同様、$$で囲んであげます。

xlabel(r'$\mu_0$')

ここで、Texの形式だと\muのように\マークが出現します。
Python的にはこれはエスケープシーケンスなので出力できません。
というわけで、文字列の前にrをつけてあげます。(詳細はraw stringで調べてみてください)
これによって、Texと同じ形式で出力することができます。


Texの数式の使い方は他のページを参考にしてください。
次に示すページはまとまっていてわかりやすいかと思います。
LaTeXコマンドシート一覧

複数段のプロット

複数段に分けてプロットする方法を示します。
その前に簡単なmatplotlibの仕組みも説明します。

Figure, Axes

matplotlibでは、図全体をFigureと呼びます。
そして、その中にあるグラフ(複数個でも構わない)をAxes(複数形で、単数形だとAxis)と呼びます。
直訳すればFigureは図、Axesは軸ですね。
複数のグラフを作成する時は、FigureにAxesを追加していきます。

Current Figure, Current Axes

matplotlibにはCurrent Figure, Current Axesという考え方があります。
現在操作している図(Current Figure, Current Axes)を、プログラム側で保存しています。
適当にplotやxlabelなどの関数を使うと、これらの現在操作している図の内容を変更します。
複数グラフがある時なども、現在操作しているグラフを変更することでそれぞれを操作することができます。
現在操作している軸、図はそれぞれ、gca(), gcf()関数で取得することができます。
そんなに使うこともないかもしれませんが、凝った図を書く時には必要になるかもしれません。

複数段プロットの仕方

図はfigure()で関数で作成することができます。
一つの図だけで良い場合は、省略可能です。
今迄の折れ線グラフでも実は省略しています。書いてもよいです。
Axes(軸)も今までは一つしかなかったので、省略してきました。


しかし、今回はグラフをいくつもつくりたいので、Axesを自分で定義する必要があります。
このための関数がいくつか用意されているようですが、subplot関数が便利です。
subplot関数は、図(figure)を等間隔に分割して、そこにグラフを流し込みます。
同じ大きさのグラフを複数並べたいときには便利です。


subplot関数は

subplot(3桁の数字)

を取ります。3桁の数字は、

  • 100の位は、行の数
  • 10の位は、列の数
  • 1の位は何番目の軸を作成するか

を示します。例えば

subplot(211)

は「2*1のグラフの1つ目のグラフ」を作成します。
どうやらこれがCurrent Axesになります。


例えば、2*1のグラフを作成することにします。
上の行にはsinを、下の行にはcosを表示します。

from pylab import *
x = arange(1, 10, 0.1)
y1 = sin(x)
y2 = cos(x)

# 上の行のグラフ
subplot(211)
plot(x, y1)
xlabel("1") # 上の行のxlabel

# 下の行のグラフ
subplot(212)
plot(x, y2)
xlabel("2") # 下の行のylabel

show()


ここで、subplotを実行するとCurrent Axesが変わるという点に注意してください。
subplotを定義して、次のsubplotまでの間にグラフの設定(xlabelやらxticksやら)を書けば、
その部分のグラフの設定を変更することができます。

グラフのクリア

matplotlibはグラフをfigure(図)に重ねて描いていきます。
消したいときはclf()としましょう

グラフの範囲

グラフのx, y軸それぞれの表示範囲を指定することができます。
あくまで表示範囲です。
これにはxlim(), ylim()を使います。
>python|
xlim(0, 3)
|

とすれば、0から3までの範囲を表示します。
片方だけ指定する時は

xlim(xmin=0)
xlim(xmax=3)

などと別に書きます。


また、axis関数を使って指定することもできます。

axis([xmin, xmax, ymin, ymax])

のようにも指定できますが、それよりも文字で指定する方法が重宝します。

axis('scaled')

とすると、x, y軸のスケールが同じになります。
またx, yのある範囲のみを表示するときは'tight'です。
他にもありますので、気になる方は公式ドキュメントを参照してみてください。

スケールの指定(片対数等)

xscale, yscale関数に'log'を引数で与えてあげると、その軸が対数になります。

xscale('log')