【问题标题】:How to update axes limits when embedding matplotlib figure?嵌入matplotlib图形时如何更新轴限制?
【发布时间】: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()

其中axesmatplotlib.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


【解决方案1】:

正如 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 方法时限制将正确更新,并且我仍然可以独立更改刻度标签字体。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2012-04-22
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多