74
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pyplotではxticks()、Axesではset_xticklabels()を使うんだって。

Posted at

(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の設定を簡略化する方が良いですね。

74
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?