问题 在Matplotlib中显示绘图之前获取空的刻度标签


我遇到了与报道的问题类似的问题 这里。我不明白为什么刻度标签文本是一个空字符串:

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轴上的八个标记的刻度。但是,如果我要求标签  我展示了情节,然后是 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)以及如何获得我的标签 之前 我展示或保存我的情节?


5857
2017-12-13 13:56


起源

获得的目的是什么 xticklabels?您可以随时拥有自己的自定义 xticklabels 通过使用 ax.set_xticklabels(["0","1"]) (只是一个例子)。提供字符串列表作为标签。如果列表中提供的字符串数量较少,则为剩余字符串 ticklabels 将显示为空。参考: matplotlib.org/api/... - Naveen Kumar R B


答案:


你已经正确地确定了问题:在你打电话之前 plt.show() 没有明确设置。这是因为matplotlib避免了刻度线的静态定位,除非它必须,因为你可能想要与它交互:如果你能 ax.set_xlim() 例如。

在您的情况下,您可以绘制图形画布 fig.canvas.draw() 触发刻度定位,以便您可以检索它们的值。

或者,您可以明确设置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

15
2017-12-13 15:34