如何更新嵌入matplotlib图形的轴限?

0 投票
1 回答
927 浏览
提问于 2025-04-18 02:49

我在一个PySide应用程序中嵌入了一个matplotlib图形。我想通过一些按钮等功能让用户可以自定义这个图形。

我遇到的问题是,当我想更新x轴和y轴的范围时,总是无法成功。我有一个这样的函数:

def set_xlimits(self, lower, upper):
    """ Convenience method to canvas.axes.set_xlim """
    self.canvas.axes.set_xlim(lower, upper)
    self.canvas.draw()

这里的axes是一个matplotlib.axes.Axes的实例,而canvas是从FigureCanvasQTAgg继承来的。

当我调用这个方法并传入新的范围时,要么什么都没有发生,要么轴上增加了一些新的刻度,但没有新的刻度标签(比如说,如果我把范围从0到1改成0到10,轴上还是显示0到1的标签,只是多了一些超出1的刻度)。

有没有什么办法可以确保这个变化总是生效呢?

编辑:似乎轴的范围是更新了,但刻度没有。所以,如果我把范围改成0到16,刻度还是保持在0到1,但0到16之间的数据却都显示出来了?!

当我随后调用另一个方法,比如这个来编辑刻度标签的字体:

def set_tick_font(self, font):
    self.canvas.axes.set_xticklabels(self.canvas.axes.get_xticks(), **font)
    self.canvas.axes.set_yticklabels(self.canvas.axes.get_yticks(), **font)
    self.canvas.draw()

之前更新轴范围的调用才最终被绘制出来。这并不是理想的情况——它应该在第一次调用时就被绘制出来。有没有人知道这是怎么回事?

1 个回答

0

正如tcaswell提到的,我的第二种方法——设置刻度字体,似乎在某种程度上阻碍了set_xlim和set_ylim这两个方法的正常工作。

我还需要仔细研究一下它是怎么回事,但目前,把第二种方法改成:

def set_tick_font(self, font):
    fnt = font_manager.FontProperties(**font)
    for labelx, labely in zip(self.canvas.axes.get_xticklabels(), self.canvas.axes.get_yticklabels()):
        labelx.set_fontproperties(fnt)
        labely.set_fontproperties(fnt)
    self.canvas.draw()

这样一来,当我调用set_xlimits方法时,限制值就能正确更新了,而且我仍然可以独立地更改刻度标签的字体。

撰写回答