在matplotlib中更新图形坐标
我有一段代码可以画出一个球体,它的大小是由prop来决定的。我想要在按下按钮时,prop的值变成5,然后图形也相应地调整。请问我该怎么做呢?
我知道tkinter有一个.configure()的方法,可以用来调整组件的设置。我在找类似的东西,这样我就可以重新配置我的图形了。
#!/usr/bin/env python
import matplotlib
matplotlib.use('TkAgg')
from mpl_toolkits.mplot3d import axes3d,Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import Tkinter
import sys
class E(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.protocol("WM_DELETE_WINDOW", self.dest)
self.main()
def main(self):
self.fig = plt.figure()
self.fig = plt.figure(figsize=(3.5,3.5))
ax = Axes3D(self.fig)
prop = 10
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = prop * np.outer(np.cos(u), np.sin(v))
y = prop * np.outer(np.sin(u), np.sin(v))
z = prop * np.outer(np.ones(np.size(u)), np.cos(v))
t = ax.plot_surface(x, y, z, rstride=4, cstride=4,color='lightgreen',linewidth=0)
self.frame = Tkinter.Frame(self)
self.frame.pack(padx=15,pady=15)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.get_tk_widget().pack(side='top', fill='both')
self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)
self.toolbar = NavigationToolbar2TkAgg( self.canvas, self )
self.toolbar.update()
self.toolbar.pack()
self.btn = Tkinter.Button(self,text='button',command=self.alt)
self.btn.pack(ipadx=250)
def alt (self):
prop = 5
def dest(self):
self.destroy()
sys.exit()
if __name__ == "__main__":
app = E(None)
app.title('Embedding in TK')
app.mainloop()
2 个回答
0
这里是更新后的代码,可以在Python 3.9和Matplotlib 3.4中正常运行。
#!/usr/bin/env python
import matplotlib
matplotlib.use('TkAgg')
from mpl_toolkits.mplot3d import axes3d,Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import tkinter as tk
import sys
class E(tk.Tk):
def __init__(self,parent):
tk.Tk.__init__(self,parent)
self.parent = parent
self.protocol("WM_DELETE_WINDOW", self.dest)
self.main()
def main(self):
self.fig = plt.figure()
self.fig = plt.figure(figsize=(3.5,3.5))
self.frame = tk.Frame(self)
self.frame.pack(padx=15,pady=15)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.get_tk_widget().pack(side='top', fill='both')
self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)
self.toolbar = NavigationToolbar2Tk( self.canvas, self )
self.toolbar.update()
self.toolbar.pack()
self.btn = tk.Button(self,text='button',command=self.alt)
self.btn.pack(ipadx=250)
self.draw_sphere()
def alt (self):
self.draw_sphere(5)
def dest(self):
self.destroy()
sys.exit()
def draw_sphere(self, prop=10):
self.fig.clear()
ax = Axes3D(self.fig, auto_add_to_figure=False)
self.fig.add_axes(ax)
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = prop * np.outer(np.cos(u), np.sin(v))
y = prop * np.outer(np.sin(u), np.sin(v))
z = prop * np.outer(np.ones(np.size(u)), np.cos(v))
t = ax.plot_surface(x, y, z, rstride=4, cstride=4,color='lightgreen',linewidth=0)
self.canvas.draw()
if __name__ == "__main__":
app = E(None)
app.title('Embedding in TK')
app.mainloop()
5
修改类 E 中的 main
函数:
def main(self):
self.fig = plt.figure()
self.fig = plt.figure(figsize=(3.5,3.5))
self.frame = Tkinter.Frame(self)
self.frame.pack(padx=15,pady=15)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.get_tk_widget().pack(side='top', fill='both')
self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)
self.toolbar = NavigationToolbar2TkAgg( self.canvas, self )
self.toolbar.update()
self.toolbar.pack()
self.btn = Tkinter.Button(self,text='button',command=self.alt)
self.btn.pack(ipadx=250)
self.draw_sphere()
函数 alt
是:
def alt (self):
self.draw_sphere(5)
并在类 E 中添加一个新函数 draw_sphere
:
def draw_sphere(self, prop=10):
self.fig.clear()
ax = Axes3D(self.fig)
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = prop * np.outer(np.cos(u), np.sin(v))
y = prop * np.outer(np.sin(u), np.sin(v))
z = prop * np.outer(np.ones(np.size(u)), np.cos(v))
t = ax.plot_surface(x, y, z, rstride=4, cstride=4,color='lightgreen',linewidth=0)
self.canvas.draw()