我遇到与报告的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轴上的八个标记的刻度。但是,如果我在之后询问标签,我会显示情节,那么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)以及如何在显示或保存我的情节之前获取标签?
答案 0 :(得分:22)
您已正确识别问题:在致电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
答案 1 :(得分:0)
作为 Julien Marrec,您必须致电 fig.canvas.draw()
。
好在它打开窗口后不等待输入,直接显示图表(或将控制权返回到代码中的下一行)
所以我在这里做了一个解决方法:
# First call the .draw() function and take whatever values your need.
fig.canvas.draw()
x_lab = axes.get_xticklabels()
y_lab = axes.get_yticklabels()
z_lab = axes.get_zticklabels()
# Now we close the figure since we are done getting values
# This will be a fast process and look like figure never opened
plt.close()