【发布时间】:2014-04-15 14:35:57
【问题描述】:
我在 PySide 应用程序中嵌入了一个 matplotlib 图。我正在尝试向用户公开一些功能(通过 gui 按钮等),以帮助他们自定义图形。
我无法在被告知时更新 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()
上一次更新坐标轴范围的调用终于画好了。这并不理想——它应该是第一次绘制的。有什么想法吗?
【问题讨论】:
-
不要使用
set_*ticklabels,除非你真的确定你在做什么。它将您的刻度标签与数据分离本质上是危险的。 -
尽管非常含糊,但您是对的。在研究了 mpl 源代码之后,使用 get_*ticklabels() 和 set_fontproperties 的组合可以在不与数据解耦的情况下更改刻度标签(从而阻止 set_*lim 方法正确更新)
标签: python matplotlib plot pyside embedding