Matplotlib按钮生成随机圆圈

时间:2017-03-11 11:47:39

标签: python numpy matplotlib

大家好!我正在使用matplotlib,我有一个随机生成的圆圈。此外,我有按钮,必须在字段中生成新的随机圆圈,但每次按下它,圆圈都会在按钮内生成,但不会在现场生成。请告诉我我做错了什么,我是python的新手(实际上昨天开始学习它)。这是我的代码:

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

plt.subplots_adjust(bottom=0.2)

N = 10
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * 0.2
l = plt.scatter(x, y, s=area, c=colors, alpha=0.8)


def gen(event):
    N = 10
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * 0.2
    plt.scatter(x, y, s=area, c=colors, alpha=0.8)
    plt.draw()


axgen = plt.axes([0.81, 0.05, 0.1, 0.075])
bgen = Button(axgen, 'Generate')
bgen.on_clicked(gen)


plt.show()

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要告诉matplotlib您想使用主图轴来绘制点。通过调用plt.scatter,您告诉matplotlib使用当前轴,在您的情况下恰好是按钮本身。这是使用显式轴的代码的修改版本:

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

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)

N = 10
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * 0.2
l = plt.scatter(x, y, s=area, c=colors, alpha=0.8)


def gen(event):
    N = 10
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * 0.2
    ax.scatter(x, y, s=area, c=colors, alpha=0.8)
    fig.canvas.draw()


axgen = plt.axes([0.81, 0.05, 0.1, 0.075])
bgen = Button(axgen, 'Generate')
bgen.on_clicked(gen)

plt.show()

请注意,我还将当前数字实例存储在fig中,以使用fig.canvas.draw()更新整个数字。您使用的plt.draw()也可以使用,但如果您有多个数字,可能会遇到类似的问题。

答案 1 :(得分:1)

一旦有多个轴,跟踪绘制哪些轴是至关重要的。不要使用pyplot命令,而应该坚持使用matplotlib api,明确地绘制到轴上。 ax.scatter()代替plt.scatter

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


fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)

N = 10
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * 0.2
l = ax.scatter(x, y, s=area, c=colors, alpha=0.8)


def gen(event):
    N = 10
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * 0.2
    ax.scatter(x, y, s=area, c=colors, alpha=0.8)
    plt.draw()


axgen = plt.axes([0.81, 0.05, 0.1, 0.075])
bgen = Button(axgen, 'Generate')
bgen.on_clicked(gen)


plt.show()