在 gui 中更改 matplotlib 数据
change matplotlib data in gui
我用 python pyqt 开发了一个图形用户界面。我有一个带有 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 代码 Class。 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 随滑块移动但移动然后回到起始位置。
创建 vline 时,保存对它们的引用,例如
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()
顺便说一句,以后您应该尽量将您的代码示例精简到只包含必要的部分。有很多不必要的示例代码很难理解您的问题。 :)
我用 python pyqt 开发了一个图形用户界面。我有一个带有 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 代码 Class。 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 随滑块移动但移动然后回到起始位置。
创建 vline 时,保存对它们的引用,例如
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()
顺便说一句,以后您应该尽量将您的代码示例精简到只包含必要的部分。有很多不必要的示例代码很难理解您的问题。 :)