1. ホーム
  2. パイソン

[解決済み】ティックラベルのテキストを変更する

2022-04-01 12:20:59

質問

プロットで選択されたいくつかの目盛りラベルに、いくつかの修正を加えたい。

例えば、こうすると。

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

の場合、文字サイズとティックラベルの向きが変更されます。

ただし、試しに

label.set_text('Foo')

ティックラベルは ではない を修正しました。また、もし私が

print label.get_text()

は何も出力されません。

ここで、さらに不思議なことがあります。これを試したところ

 from pylab import *
 axes = figure().add_subplot(111)
 t = arange(0.0, 2.0, 0.01)
 s = sin(2*pi*t)
 axes.plot(t, s)
 for ticklabel in axes.get_xticklabels():
     print ticklabel.get_text()

空の文字列だけが出力されますが、プロットには '0.0', '0.5', '1.0', '1.5', '2.0' とラベル付けされた目盛りが含まれます。

どのように解決するのですか?

注意: ticklabels が既に文字列に設定されていない限り (例えば boxplot では通常そうです)、これは 1.1.0 . 現在のgithubマスターから作業している場合、これはうまくいきません。 何が問題なのか、まだよくわかりません...。 意図しない変更かもしれないし、そうでないかもしれない...。

普通なら、このようなことをするはずです。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()

labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'

ax.set_xticklabels(labels)

plt.show()

<イグ

なぜこれほど多くの輪を飛び越える必要があるのかを理解するためには、matplotlib がどのような構造になっているのかをもう少し理解する必要があります。

Matplotlib は、明示的に指示されない限り、目盛りの位置決めなどを "static" することを意図的に避けています。 その前提は、プロットと対話したいので、プロットの境界、目盛り、目盛りラベルなどが動的に変化することです。

したがって、与えられた目盛りのラベルのテキストを設定するだけではダメなのです。 デフォルトでは、プロットが描画されるたびに、軸のロケータとフォーマッタによって再セットされます。

しかし、ロケータとフォーマッタが静的であるように設定されている場合 ( FixedLocatorFixedFormatter それぞれ)であれば、ティックラベルは変わりません。

これは set_*ticklabels または ax.*axis.set_ticklabels が行います。

これで、個々のティックラベルを変更することがなぜ少し複雑なのか、少しはわかっていただけたでしょうか?

実際にやりたいことは、特定の位置に注釈をつけることだけであることがよくあります。 そのような場合は annotate の代わりに