使用滑块更新matplotlib中的随机粒子

时间:2017-06-15 03:52:44

标签: matplotlib random slider

我尝试绘制随机粒子图,其中使用滑块减少粒子数。 到目前为止,我得到了以下内容:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider


fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
fig.canvas.set_window_title('Teilchen')

x = np.random.randn(50)
y = np.random.randn(50)

plt.plot(x,y, 'o')

axrs = plt.axes([0.125, 0.1, 0.778, 0.03], facecolor='lightblue')
srs = Slider(axrs, 'Zeit', 0, 50, valinit=0, valfmt='%0.0f')

def update1(x): 
    p = round(srs.val,0)
    n = int(50-p)
    x = np.random.randn(n)
    y = np.random.randn(n)
    plt.cla()
    ax.plot(x,y, 'o')
    fig.canvas.draw_idle()

srs.on_changed(update1)

plt.show()

问题在于,不是重新绘制减少数量的粒子,而是将粒子添加到现有图中。 剩余颗粒的位置应优选在整个时间内保持相同。

1 个答案:

答案 0 :(得分:1)

您需要使用ax.clear()代替plt.cla()

说明:plt.cla()清除当前轴。但是,在滑块更新时,滑块是当前轴,因此清除了滑块而不是要绘制的轴。要清除特定轴ax,您可以使用ax.clear()

请注意,您也可以只更新粒子而不是重绘它们。

x = np.random.randn(50)
y = np.random.randn(50)

particles, = ax.plot(x,y, 'o')

axrs = plt.axes([0.125, 0.1, 0.778, 0.03], facecolor='lightblue')
srs = Slider(axrs, 'Zeit', 0, 50, valinit=50, valfmt='%0.0f')

def update1(val): 
    p = round(val,0)
    n = int(50-p)
    x = np.random.randn(n)
    y = np.random.randn(n)
    particles.set_data(x,y)
    fig.canvas.draw_idle()

srs.on_changed(update1)

plt.show()

为了保持粒子的位置,我们的想法当然不是绘制新的随机数,而是使用在开头绘制的随机数。

x = np.random.randn(50)
y = np.random.randn(50)

particles, = ax.plot(x,y, 'o')

axrs = plt.axes([0.125, 0.1, 0.778, 0.03], facecolor='lightblue')
srs = Slider(axrs, 'Zeit', 0, 50, valinit=50, valfmt='%0.0f')

def update1(val): 
    p = round(val,0)
    n = int(50-p)
    particles.set_data(x[:n],y[:n])
    fig.canvas.draw_idle()

srs.on_changed(update1)

plt.show()