(matplotlib ver3.2.0)
matplotlibで描画したグラフの目盛り文字列を変更したい場合、タイトルの通り使い分けます。
ちょっと使い方にクセがあるのでまとめました。
基本的な構文
#pyplot.xticksは、目盛りの座標値を第一引数、置き換え文字列を第二引数とする
plt.xticks([1, 2, 3, 4, 5], [ "A", "B", "C", "D", "E"])
#axes.set_xticklabelsは、置き換え後の文字列だけ指定する
axes.set_xticklabels(["A", "B", "C", "D", "E"])
同様に、pyplot.yticks()も、axes.set_yticklabels()で置き換えられます。
axes.set_xticklabelsの注意すべき点
axes.set_xticklabels()では、目盛りを全体の文字列を順次指定する必要があるため、目盛りがたくさんあると、一部の目盛りだけを変更したい時などに面倒です。
例えば、次のようにプロットすると細かい目盛りが付いてしまい、全ての文字列を設定するのがとても手間だったりします。
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5] , [3,4,5,6,7])
この状態で次のように指定しても、下のグラフのように0.5〜2.5の位置に指定文字が配置されてしまうイメージです。
ax.set_xticklabels(["A", "B", "C", "D", "E"])
素直にがんばって設定するならば次のように書けます。
ax.set_xticklabels(["", "A", "", "B", "", "C", "", "D", "", "E"])
設定を多少簡略化できそうな方法を、試行錯誤して次項にまとめました。
axes.set_xticklabelsの設定を簡略化する方法
あらかじめ目盛り表記を限定する
axes.set_xticks()で、文字列に置き換えたい座標に限定してから置き換えます。
ax.set_xticks([1,2,3,4,5])
ax.set_xticklabels(["A", "B", "C", "D", "E"])
axes.get_xticklabels()を使って置き換える
axes.get_xticklabels()で現状の目盛りを取得できるため、それを基に必要な箇所だけ新たな文字列で置き換えます。
なお、axes.get_xticklabels()はTextオブジェクトのため少し工夫が必要です。
目盛りの文字列そのものには、次のようにアクセスできます。
for item in ax.get_xticklabels():
print(item.get_text())
#出力結果
0.5
1.0
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
5.5
上記より、次のように書くことで目盛り文字列を置き換えます。
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5] , [3,4,5,6,7])
fig.canvas.draw() #座標値などを決めるために呼び出しておく
#これを呼び出さずに、get_xticklabels()を読んでも文字列が取れない
#ちなみにplot.show()だとプロットがFixしてしまうのでダメ
d = {1:"A", 2:"B", 3:"C", 4:"D", 5:"E"} #置き換える座標と文字列を辞書で定義しておく
#辞書に登録した座標の位置を置き換えていく
#それ以外の位置は空白とする
#(ここはちょっとテキトー。やりたい文脈に応じて書きかえが必要ですね。)
l = []
for item in ax.get_xticklabels():
k = float(item.get_text())
if k in d:
l.append(d[k])
else:
l.append("")
ax.set_xticklabels(l)
plt.show()
ちなみにこちらの方法では、マイナー目盛り線も消さずに残すことができます。
まあ、、上のaxes.set_xticklabelsの設定を簡略化する方が良いですね。