HOWTO · Matplotlib
Matplotlib で X 軸の値を設定する
このチュートリアルでは、Matplotlib の matplotlib.pyplot.xticks()を使って X 軸の値を設定する方法を説明します。
このページの内容
matplotlib.pyplot.xticks() を使うと、X軸の目盛りを表示する位置と、必要に応じて各位置に表示する文字列を指定できます。目盛り位置は横方向の座標を表すもので、プロットするデータを変更したり、軸タイトルを設定したりするものではありません。読みやすいグラフにするには、各ラベルを、それが示す位置とデータ点に対応させます。
X軸の目盛り位置とラベルを設定する
xticks() の第1引数には位置の列を指定します。省略可能な第2引数には、各位置に対応するラベルを1つずつ指定します。2つの列は同じ順序で、要素数をそろえてください。次の例では、1つの図にカスタムラベル、数値の間隔、均等間隔のインデックスを使う方法、ラベル数を減らして回転させる方法を示します。
import matplotlib.pyplot as plt
x = [1, 2, 5, 9]
y = [3, 5, 4, 8]
labels = ['Jan', 'Feb', 'May', 'Sep']
categories = ['North region', 'South region', 'East region', 'West region', 'Central region']
values = [12, 9, 14, 7, 11]
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
axes[0, 0].plot(x, y, marker='o')
axes[0, 0].set_title('Custom labels')
axes[0, 0].set_xlabel('Month')
axes[0, 0].set_ylabel('Value')
plt.sca(axes[0, 0])
plt.xticks(x, labels)
axes[0, 1].plot(x, y, marker='o')
axes[0, 1].set_title('Numeric spacing')
axes[0, 1].set_xlabel('X value')
axes[0, 1].set_ylabel('Value')
index_positions = list(range(len(x)))
axes[1, 0].plot(index_positions, y, marker='o')
axes[1, 0].set_title('Evenly spaced positions')
axes[1, 0].set_xlabel('Month')
axes[1, 0].set_ylabel('Value')
axes[1, 0].set_xticks(index_positions)
axes[1, 0].set_xticklabels(labels)
axes[1, 1].bar(categories, values)
axes[1, 1].set_title('Fewer, rotated category labels')
axes[1, 1].set_ylabel('Value')
axes[1, 1].set_xticks([0, 2, 4])
axes[1, 1].set_xticklabels(categories[::2])
plt.sca(axes[1, 1])
plt.xticks(rotation=35, ha='right')
fig.tight_layout()
plt.show()
左上のグラフでは、4つの位置に4つの月名ラベルを対応させています。数値を使ったグラフでは実際の x 値を使うため、1から2までの間隔より、2から5までの間隔のほうが広くなります。左下のグラフでは代わりに0から3までの位置を使い、各値と月名の対応を保ちながら、月を均等な間隔で表示します。最後のグラフには5本の棒がありますが、混雑を抑えるため、位置0、2、4だけにラベルを付け、それらを回転させて右揃えにしています。例のコード内にある月名やカテゴリ名のラベルは英語のままです。MatplotlibをインストールしたPython環境でスクリプトを実行してください。ここには実行時の出力を掲載していません。
間隔が不均等なX値を扱う
数値軸では、数値の差がそのまま距離として表されます。測定値の x が1、2、5、9の場合、それらの値を使ってプロットすると、2から5まで、また5から9までの間隔が大きくなります。目盛りラベルを月名に変えても、座標は変わりません。距離や経過時間に意味がある場合は、この間隔を保ってください。
カテゴリを等間隔で比較したい場合は、range(len(x)) などのインデックス位置に対して y 値をプロットし、カテゴリ名を目盛りラベルとして使います。データ列とラベルは同じ順序にそろえます。この方法では横軸が数値の距離ではなくカテゴリの並び順を表すため、数値測定値の間隔に意味がある場合には適しません。
日付を示すラベルを使う場合は、プロットする x データに日付値を使い、必要に応じて日付目盛りの書式を設定します。無関係な数値座標に月名を割り当てても、その座標が日付になるわけではありません。
目盛りの頻度を調整し、ラベルを読みやすくする
小さなグラフで一部の目盛りだけを表示するには、xticks() に位置を明示的に渡します。たとえば、plt.xticks(x[::2]) は、順序のある列から値を1つおきに選びます。一定間隔の数値軸では、表示範囲に応じて適切な間隔を選ぶロケーターを使えます。たとえば、matplotlib.ticker から MultipleLocator を読み込み、ax.xaxis.set_major_locator(MultipleLocator(2)) を呼び出すと、主目盛りを2単位ごとに置くよう指定できます。ラベルが意味のあるカテゴリ名なら位置を明示し、数値軸ならロケーターを使います。
長いラベルは plt.xticks(rotation=35, ha='right') で回転できます。ha は水平方向の揃え方を指定します。回転後もラベルが重なる場合は、図の幅を広げるか、目盛りの数を減らしてください。tight_layout() は軸の周囲に余白を確保するのに役立ちますが、どの目盛りを使うべきかは選びません。
上の例では、ほとんどのパネルで個々の Axes に set_xticks を使い、ラベルを調整する箇所では現在の Axes に xticks を使っています。オブジェクト指向の書き方では、ax.set_xticks(positions, labels) のように特定の Axes に対して操作できます。pyplotを使い、1つの図に複数のプロットがある場合は、対象の Axes を先に選択してください。
FAQ:X軸の値を設定する
位置とラベルを1回の呼び出しで設定できますか? はい。plt.xticks(positions, labels) に両方の列を渡すか、ax.set_xticks(positions, labels) を使います。各ラベルは、インデックスが対応する位置に割り当てられます。
目盛りの数を減らすにはどうすればよいですか? 目盛り位置を短いリストで指定するか、一定間隔の数値目盛りにはロケーターを使います。目盛りの頻度は、プロットするデータ点の数とは別です。
X軸にカテゴリ名を使えますか? はい。棒グラフのようにカテゴリ値を直接プロットするか、数値のインデックス位置をプロットしてカテゴリ名をラベルに指定します。カテゴリの順序を明示したい場合や、等間隔で表示したい場合は後者を使います。
ラベルが重なる場合はどうすればよいですか? ラベルを減らす、回転させる、回転した文字を右揃えにする、または図の幅を広げる方法があります。これらの調整は目盛りラベルに影響しますが、プロットする値は変わりません。