清除 Jupyter Python 笔记本中的 MatPlotLib 图
Clear MatPlotLib figure in Jupyter Python notebook
我想要 MatPlotLib 中的 3D 散点图在 Jupyter Python 笔记本中交互旋转。出于这个原因,我集成了 ipywidgets
中的滑块来更新视角。下面的测试代码显示了我想要实现的目标。问题是在前一个图形下方添加了一个新图形,而不是清除当前图形。我试过 plt.close(fig)
、plt.cla()
和 plt.clf()
都没有成功。 (此外,我意识到重新创建图形和轴会产生开销,但这是我目前关注的较小部分......)
这是(测试)代码:
# init
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import ipywidgets as widgets
from IPython.display import display
# generate test data
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
# prepare plot
def draw_plot(angle1 = 20, angle2 = 40):
# create figure
fig = plt.figure(figsize=(15,10))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.scatter(x, y, z)
# set view angle
ax.view_init(angle1, angle2)
# show plot
plt.show()
# prepare widgets
angle1_slider = widgets.IntSlider(20, min = 0, max = 60)
angle1_label = widgets.Label(value = 'Angle 1 value is: ' + str(angle1_slider.value))
display(angle1_slider, angle1_label)
# handle angle 1 update
def update_angle1(value):
draw_plot(angle1 = value['new'])
angle1_label.value = 'Angle 1 value is: ' + str(value.new)
angle1_slider.observe(update_angle1, names = 'value')
# draw initial plot
draw_plot()
如有任何建议,我们将不胜感激!
你所说的开销才是问题的根源。或者换句话说:如果在每次调用该函数时,都会创建一个新图形,那么您最终会得到很多图形是否令人惊讶?
思路当然是画单图了。为了以后能够更新图形,需要 %matplotlib notebook
后端。
更改滑块时调用的函数只需要更新视角并重绘 canvas。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import ipywidgets as widgets
from IPython.display import display
%matplotlib notebook
# generate test data
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.scatter(x, y, z)
ax.view_init(20, 40)
# show plot
plt.show()
def update_plot(angle1 = 20, angle2 = 40):
# set view angle
ax.view_init(angle1, angle2)
fig.canvas.draw_idle()
# prepare widgets
angle1_slider = widgets.IntSlider(20, min = 0, max = 60)
angle1_label = widgets.Label(value = 'Angle 1 value is: ' + str(angle1_slider.value))
display(angle1_slider, angle1_label)
# handle angle 1 update
def update_angle1(value):
update_plot(angle1 = value['new'])
angle1_label.value = 'Angle 1 value is: ' + str(value.new)
angle1_slider.observe(update_angle1, names = 'value')
这是它的样子:
我想要 MatPlotLib 中的 3D 散点图在 Jupyter Python 笔记本中交互旋转。出于这个原因,我集成了 ipywidgets
中的滑块来更新视角。下面的测试代码显示了我想要实现的目标。问题是在前一个图形下方添加了一个新图形,而不是清除当前图形。我试过 plt.close(fig)
、plt.cla()
和 plt.clf()
都没有成功。 (此外,我意识到重新创建图形和轴会产生开销,但这是我目前关注的较小部分......)
这是(测试)代码:
# init
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import ipywidgets as widgets
from IPython.display import display
# generate test data
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
# prepare plot
def draw_plot(angle1 = 20, angle2 = 40):
# create figure
fig = plt.figure(figsize=(15,10))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.scatter(x, y, z)
# set view angle
ax.view_init(angle1, angle2)
# show plot
plt.show()
# prepare widgets
angle1_slider = widgets.IntSlider(20, min = 0, max = 60)
angle1_label = widgets.Label(value = 'Angle 1 value is: ' + str(angle1_slider.value))
display(angle1_slider, angle1_label)
# handle angle 1 update
def update_angle1(value):
draw_plot(angle1 = value['new'])
angle1_label.value = 'Angle 1 value is: ' + str(value.new)
angle1_slider.observe(update_angle1, names = 'value')
# draw initial plot
draw_plot()
如有任何建议,我们将不胜感激!
你所说的开销才是问题的根源。或者换句话说:如果在每次调用该函数时,都会创建一个新图形,那么您最终会得到很多图形是否令人惊讶?
思路当然是画单图了。为了以后能够更新图形,需要 %matplotlib notebook
后端。
更改滑块时调用的函数只需要更新视角并重绘 canvas。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import ipywidgets as widgets
from IPython.display import display
%matplotlib notebook
# generate test data
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.scatter(x, y, z)
ax.view_init(20, 40)
# show plot
plt.show()
def update_plot(angle1 = 20, angle2 = 40):
# set view angle
ax.view_init(angle1, angle2)
fig.canvas.draw_idle()
# prepare widgets
angle1_slider = widgets.IntSlider(20, min = 0, max = 60)
angle1_label = widgets.Label(value = 'Angle 1 value is: ' + str(angle1_slider.value))
display(angle1_slider, angle1_label)
# handle angle 1 update
def update_angle1(value):
update_plot(angle1 = value['new'])
angle1_label.value = 'Angle 1 value is: ' + str(value.new)
angle1_slider.observe(update_angle1, names = 'value')
这是它的样子: