【问题标题】:change matplotlib data in gui在 gui 中更改 matplotlib 数据
【发布时间】:2017-02-16 18:57:20
【问题描述】:

我用 python pyqt 开发了一个 gui。我有一个带有 x,y-Data 和 vlines 的 matplotlib 图,需要使用 QSlider 动态更改。

现在我只是通过删除所有内容并重新绘制来更改数据,但这没有效果

这就是我的做法:

 def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg):
    if PlotNr == 2:
        self.axes.cla()
        self.axes.plot(xData, Data, color='b', linewidth=2)             
        self.axes.vlines(valueSlider1,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4)
        self.axes.vlines(valueSlider2,min(Data),max(Data),color='r',linewidth=1.5, zorder = 4)
        self.axes.text(1,0.8*max(Data),str(np.round(width_wg,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.text(1,0.6*max(Data),"Pos1: "+str(round(valueSlider1,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.text(1,0.4*max(Data),"Pos2: "+str(round(valueSlider2,2))+u"µm", fontsize=16, bbox=dict(facecolor='m', alpha=0.5))
        self.axes.grid(True)
        self.draw()

"vlines" 是 matplotlib 中的 LineCollections。我在文档中进行了搜索,但找不到像“set_xdata”这样的函数的任何提示当它们已经被绘制并嵌入到 FigureCanvas 中时,如何更改垂直线的 x 值?

我在更改 x 和 y 数据时遇到了同样的问题。在尝试 matplotlib 的已知函数(如“set_data”)时,出现 AxisSubPlot 没有此属性的错误。

以下是我的 FigureCanvas 类代码。 def update_verticalLines 应该只包含用于更改 vlines 的 x 坐标的命令,而不是完成重绘。


编辑:解决方案

感谢@Craigular Joe 这对我来说并不完全有效。我需要改变一些东西:

def update_verticalLines(self, Data, xData, valueSlider1, valueSlider2, PlotNr, width_wg):

    self.vLine1.remove()
    self.vLine1 = self.axes.vlines(valueSlider1,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)
    self.vLine2.remove()
    self.vLine2 = self.axes.vlines(valueSlider2,min(Data), max(Data), color='g', linewidth=1.5, zorder = 4)            
    self.axes.draw_artist(self.vLine1)
    self.axes.draw_artist(self.vLine2)
    #self.update()
    #self.flush_events()        
    self.draw() 

update() 没有 draw() 就无法工作。 (旧的 vlines 留下了) flush_events() 做了一些疯狂的事情。我有两个 FigureCanvas 实例。 flush_events() 导致在第二个实例调用中,vlines 随滑块移动,但随后又移回了起始位置。

【问题讨论】:

    标签: matplotlib dynamic pyqt lines


    【解决方案1】:

    创建 vlines 时,保存对它们的引用,例如

    self.my_vlines = self.axes.vlines(...)
    

    这样当您想更改它们时,您可以删除并替换它们,例如

    self.my_vlines.remove()
    self.my_vlines = self.axes.vlines(...)
    
    # Redraw vline
    self.axes.draw_artist(self.my_vlines)
    # Add newly-rendered lines to drawing backend
    self.update()
    # Flush GUI events for figure
    self.flush_events()
    

    顺便说一句,将来您应该尽最大努力将代码示例缩减到只剩下基本部分。拥有大量不必要的示例代码会使您难以理解您的问题。 :)

    【讨论】:

    • 谢谢!我的 vlines 现在随着滑块快速移动。但我不能使用flush_events()。第二个实例的 vlines 没有用这个。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多