[英]Dynamically update graphics in matplotlib
# when the code works but it's meaningless to include it
### When I can't get this part to work and I'd need your code
如何在matplotlib中隐藏或显示Axes对象(子图),以便可以在同一图中的不同Axes之间切换?
我正在使用matplotlib在Tkinter GUI中显示图形,并且我想使用单选按钮在同一图中的不同轴之间切换。
基本上,我将有一些链接到IntVar()的单选按钮:
graphic_version = tk.IntVar()
tk.Radiobutton(root, text='Option1', variable=graphic_version, value=1).pack()
tk.Radiobutton(root, text='Option2', variable=graphic_version, value=2).pack()
然后,使用自定义方法跟踪IntVar(),以使用请求的图形更新图形:
choice.trace("w", lambda choice: myGraphic.showGraphic(version))
这样,每当用户单击单选按钮时,图形就会以不同版本的绘图进行更新。 现在的问题是我不知道如何正确执行showGraphic。 可以说,我使用此类系统来获得2种绘制相同数据的不同版本:
class Version1():
def __init__(self, ax, data):
self.ax = ax #This is a Axes object
self.data = self._formatDataV1(data)
self._draw()
self._setOptions()
self.hide()
def _formatDataV1(self, data):
#Here I manipulate the raw data to extract the info I need for this version
#Just a bunch of math algorithms it works fine
def _setOptions(self):
#Here I can overwrite or change settings specific for this version
def _draw(self):
self.ax.bar(self.data[0], self.data[1], width=1, color='red')
self._setOptions()
def hide(self):
###How do I remove the ax without affecting the figure?
def show(self):
###If I want to see this version again I don't want the cost of redrawing
class Version2():
def __init__(self, ax, data):
self.ax = ax #This is a Axes object
self.data = self._formatDataV1(data)
self._draw()
self._setOptions()
self.hide()
def _formatDataV2(self, data):
#The data is manipulated differently here to extract new information
def _setOptions(self):
#These options are specific to the version2 to get the display right
def _draw(self): #Drawing a different version of the graphic with differently formated data
self.ax.plot(self.data[0], self.data[1])
self._setOptions()
def hide(self):
###How do I remove the ax without affecting the figure?
def show(self):
###If I want to see this version again I don't want the cost of redrawing
class MyGraphic(tk.LabelFrame):
def __init__(self, root, data, **options):
#I use the labelframe only as a container to make things pretty
tk.LabelFrame.__init__(self, root, text="My 1337 graphic : ", **options)
self.data = data
self.fig = mpl.figure.Figure()
self.ax = self.fig.add_subplot(111)
self._drawCanvas() #This is just for Tkinter compatibility
self.my_versions = {}
self.my_versions.update({'v1' : Version1(self.ax, self.data)})
self.my_versions.update({'v2' : Version2(self.ax, self.data)})
def _drawCanvas(self):
self.canvas = FigureCanvasTkAgg(self.figure, master=self)
self.canvas.show()
self.canvas.get_tk_widget().grid()
self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
def _setOptions(self, **kwargs):
#Here I can set options common to both versions of the graphic
def showGraphic(self, graphic_version):
for i, item in enumerate(self.my_versions):
item.hide()
if graphic_version == 1:
self.my_versions['v1'].show()
elif graphic_version == 2:
self.my_versions['v2'].show()
self._setOptions()
很抱歉,冗长的帖子,但我宁愿包括过多的详细信息,并删除那些不需要的细节。
基本上,我希望能够根据用户的选择在同一图形上隐藏和显示不同的斧头。 难题的缺失部分是myGraphic.show()和myGraphic.hide()。
我也是一个完整的matplotlib新手,因为我尝试过这种设计,因为在需要时可以清晰,轻松地实现其他版本,但是设计输入也非常受人们欢迎。
您可以使用fig.delaxes(并使用add_axes添加)从图形中删除轴: http ://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.delaxes
我设法用figure.clear()
和figure.add_axes(ax)
解决了这个问题,明天我将尝试编辑一个干净的问题-答案,其中有一个最小的示例,说明如何在同一图上切换不同版本的绘图图在Tkinter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.