我用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数据时遇到同样的问题。当尝试像'set_data'这样的matplotlib的已知函数时,我得到一个错误,即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()
没有draw(),update()不起作用。 (旧的vlines留了下来) flush_events()做了一些疯狂的事情。我有两个FigureCanvas实例。 flush_events()导致在第二个实例中调用vlines随滑块移动但移动然后返回到起始位置。
答案 0 :(得分: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()
顺便说一下,将来你应该尽力将你的代码示例削减到基本部分。拥有大量不必要的示例代码使您很难理解您的问题。 :)