2017-02-16 52 views
1

我开发了一个使用python pyqt的gui。在那里,我有一个matplotlib图形,需要用QSlider动态更改x,y-Data和vlines。更改gui中的matplotlib数据

现在我改变数据只是再次删除一切和情节,但这不是有效

这是我要做的事:

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数据的同样的问题。当尝试像'set_data'这样的matplotlib的已知函数时,我得到一个错误,即AxisSubPlot没有这个属性。

以下是我为图形漫画类的代码。 def update_verticalLines应该只包含用于改变vlines的x坐标而不完成重绘的命令。


编辑:解

感谢@Craigular乔 这是它不完全是如何为我工作。我需要改变一些东西:

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() 

更新()没有工作没有绘制()。 (旧vlines留下) flush_events()做了一些疯狂的东西。我有两个FigureCanvas实例。 flush_events()导致在第二个实例中调用使用滑块移动的vlines,然后移回到开始位置。

回答

0

当您创建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() 

顺便说一下,在未来,你应该尽量减少你的代码示例只是必要的部分。有很多不必要的示例代码使得很难理解你的问题。 :)

+0

谢谢!我的vlines现在正在快速移动滑块。但我无法使用flush_events()。二审的情况并未与此有关。 – Saorsa