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

xnx*_*xnx 19 python label matplotlib python-3.x

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

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()
Run Code Online (Sandbox Code Playgroud)

输出:

Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Run Code Online (Sandbox Code Playgroud)

我得到了相同的结果,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)
Run Code Online (Sandbox Code Playgroud)

输出:

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')
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况(Mac OS X Yosemite,Matplotlib 1.5.1)以及如何显示或保存我的情节之前获取我的标签?

Jul*_*rec 25

您已正确识别问题:在您呼叫之前,plt.show()未明确设置.这是因为matplotlib避免了刻度线的静态定位,除非必须这样做,因为你可能想要与它进行交互:ax.set_xlim()例如,如果可以的话.

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

或者,您可以明确地设置,这将反过来轴设定为xticks FixedFormatterFixedLocator并获得相同的结果.

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
Run Code Online (Sandbox Code Playgroud)

  • 当使用 `pdf` 后端时,此解决方案不起作用。在这种情况下,`ax.get_xticklabels()` 不受 `fig.canvas.draw()` 的影响。虽然替代解决方案 `ax.set_xticklabels(ax.get_xticks())` 产生了刻度标签,但实际上,它们与否则会产生的不同:`ax.set_xticklabels(ax.get_xticks())` 产生 0.0, 1.0, 2.0 ... `fig.canvas.draw()` 产生 0, 1, 2, ... (4认同)