Python:用交互式gui绘制圆圈?

时间:2017-05-27 12:10:17

标签: python python-2.7 python-3.x matplotlib

我用mathplotlib编写了一个python脚本。 我有3个滑块“r1”,“r2”,“dist”。

r1是圆1的半径。 r2是圆2的半径。 dist是圆圈1和2之间的距离。

现在我要打印两个圆圈。 1.圆半径应该具有滑块r1的值。 2.圆半径应该具有滑块r2的值。 并且x轴上两个圆之间的距离应该是slider dist的值。

对我来说,绘制这些东西没有问题。 但是当我移动滑块时,圆圈不会移动/改变。

如何用python实现2个交互式圆圈,我可以用滑块管理半径和距离???

到目前为止我所拥有的:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
plt.axis([0, 100, 0, 100])

axcolor = 'lightgoldenrodyellow'
sl1 = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
sl2 = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
sl3 = plt.axes([0.25, 0.05, 0.65, 0.03], facecolor=axcolor)

slider_r1 = Slider(sl1, 'r1', 0.0, 50.0, 25)
slider_r2 = Slider(sl2, 'r2', 0.0, 50.0, 25)
slider_d = Slider(sl3, 'dist', 0.0, 50.0, 25)



def update(val):
    print("\nr1: ",slider_r1.val)
    print("r2: ",slider_r2.val)
    print("dist: ", slider_d.val)

slider_r1.on_changed(update)
slider_r2.on_changed(update)
slider_d.on_changed(update)

plt.show()

1 个答案:

答案 0 :(得分:1)

可以通过circle = plt.circle((x,y), radius)创建一个圆圈,然后使用ax.add_patch(cicle)将其添加到轴中。

其半径可以circle.set_radius更新,其中心可以设置为circle.center = x,y (不幸的是它没有set_positionset_xy 。像其他艺术家一样的方法)。

完整示例:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
ax.axis([0, 100, 0, 100])
ax.set_aspect("equal")

axcolor = 'skyblue'
sl1 = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
sl2 = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
sl3 = plt.axes([0.25, 0.05, 0.65, 0.03], facecolor=axcolor)

slider_r1 = Slider(sl1, 'r1', 0.0, 50.0, 25)
slider_r2 = Slider(sl2, 'r2', 0.0, 50.0, 25)
slider_d = Slider(sl3, 'dist', 0.0, 100.0, 50)

circ1 = plt.Circle((25,50), 25, ec="k")
circ2 = plt.Circle((75,50), 25, ec="k")
ax.add_patch(circ1)
ax.add_patch(circ2)

def update(val):
    r1 = slider_r1.val
    r2 = slider_r2.val
    d  = slider_d.val
    circ1.center = 50-d/2., 50
    circ2.center = 50+d/2., 50
    circ1.set_radius(r1) 
    circ2.set_radius(r2)
    fig.canvas.draw_idle()

slider_r1.on_changed(update)
slider_r2.on_changed(update)
slider_d.on_changed(update)

plt.show()

enter image description here