我试图在我的3d图中引入一个matplotlib Slider进行实时交互......
问题是,当我移动滑块时,3d表面上的背景线会保持渲染在顶部。将zorder
增加到超过9000也不会有任何帮助,而且我已经尝试了一段时间解决问题,但无济于事。
代码如下,请亲自看看:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from matplotlib.widgets import Slider, Button, RadioButtons
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
K = 1.0
def calculate_and_plot():
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(K*R)
ax.cla()
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False, zorder=9001)
#Default plot
calculate_and_plot()
axcolor = 'lightgoldenrodyellow'
axs = plt.axes([0.02,0.02, 0.7, 0.05], axisbg=axcolor)
samp = Slider(axs, 'K', 0.2, 5.0, valinit=1.0)
def update(val):
global K
K = samp.val
calculate_and_plot()
plt.draw()
samp.on_changed(update)
plt.show()
有什么想法吗?
- 编辑:
所以我找到了一个临时的,简单的解决方法,我只是在绘制更新的表面之前调用surf.remove()
而不是ax.cla()
(小心地绘制第一个表面,在calculate_and_plot()
之外,所以我们可以保留对surf
)的全局引用。也许它无论如何都是以这种方式完成的......