如何更新嵌入matplotlib图形的轴限?
我在一个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
方法时,限制值就能正确更新了,而且我仍然可以独立地更改刻度标签的字体。