【问题标题】:Getting empty tick labels before showing a plot in Matplotlib在 Matplotlib 中显示绘图之前获取空刻度标签
【发布时间】:2017-04-28 14:55:15
【问题描述】:

我遇到了与报告的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 轴上显示了八个标记的刻度。但是,如果我要求标签 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)以及如何在显示或保存绘图之前获取标签?

【问题讨论】:

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

标签: python python-3.x matplotlib label


【解决方案1】:

作为 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()

【讨论】:

    【解决方案2】:

    您已正确识别问题:在调用 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
    

    【讨论】:

    • 使用pdf-backend 时,此解决方案不起作用。在这种情况下,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、...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2014-08-03
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多