web-dev-qa-db-ja.com

Matplotlibでプロットを表示する前に空の目盛りラベルを取得する

報告されたものと同様の問題が発生しています here 。目盛りラベルテキストが空の文字列である理由がわかりません。

_import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)**2

fig, ax = plt.subplots()
ax.plot(x,y)

labels = ax.get_xticklabels()
for label in labels:
    print(label)

plt.show()
_

出力:

_Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
_

ax.xaxis.get_ticklabels()でも同じ結果が得られますが、プロットされたグラフには、保存または表示されたときにx軸に8つの目盛りが表示されます。ただし、ラベルを要求した場合afterプロットを表示すると、labelsリストに適切に入力されます。もちろん、それらを変更することについて何かをするのは少し遅れています。

_fig, ax = plt.subplots()
ax.plot(x,y)
plt.show()

labels = ax.get_xticklabels()
for label in labels:
    print(label)
_

出力:

_Text(0,0,'0')
Text(1,0,'1')
Text(2,0,'2')
Text(3,0,'3')
Text(4,0,'4')
Text(5,0,'5')
Text(6,0,'6')
Text(7,0,'7')
_

なぜこれが発生するのか(Mac OS X Yosemite、Matplotlib 1.5.1)、どのようにしてラベルを取得できますかbeforeプロットを表示または保存しますか?

18
xnx

問題を正しく特定しました。plt.show()を呼び出す前に、明示的に何も設定されていません。これは、matplotlibが必要な場合を除き、ティックの静的な配置を回避するためです。たとえば、ax.set_xlim()を使用できる場合は、対話する必要があるためです。

あなたの場合、fig.canvas.draw()でFigureキャンバスを描画して目盛りの配置をトリガーし、その値を取得できます。

または、xticksを明示的に設定して、軸をFixedFormatterおよびFixedLocatorに設定し、同じ結果を得ることができます。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)**2

fig, ax = plt.subplots()

ax.plot(x,y)
ax.set_xlim(0,6)

# Must draw the canvas to position the ticks
fig.canvas.draw()
# Or Alternatively
#ax.set_xticklabels(ax.get_xticks())

labels = ax.get_xticklabels()
for label in labels:
    print(label.get_text())

plt.show()

Out:
0
1
2
3
4
5
6
23
Julien Marrec