【问题标题】:matplotlib widgets slider on object (Ellipse)对象上的 matplotlib 小部件滑块(椭圆)
【发布时间】:2023-03-20 13:49:01
【问题描述】:

我希望通过更改滑块 d_in 来更改对象(椭圆)的 x 位置 (=d_in)。这是我得到的:

from numpy import pi, sin
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
from matplotlib.patches import Ellipse
from scipy.optimize import fsolve
import pylab


axis_color = 'lightgoldenrodyellow'
#variable
d_in=80

fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.35)
x = np.arange(0.0, 300, 0.01)


# object ellipse
Spiegel = Ellipse(xy=(d_in, 0), width=2, height=73.2,
                        edgecolor='black', fc='#808080', lw=1)
ax.add_patch(Spiegel)


#Draw d_in slider
d_in_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axis_color)
d_in_slider = Slider(d_in_slider_ax, 'd_in', 1, 150, valinit=d_in)


#axis range
ax.set_xlim([0, 300])
ax.set_ylim([-40, 40])

plt.show()

如何让滑块改变椭圆的位置?

谢谢

【问题讨论】:

    标签: object matplotlib widget slider ellipse


    【解决方案1】:

    当滑块值发生变化时,您需要注册一个回调,

    slider.on_changed(callback)
    

    在回调中,更新椭圆的位置

    ellipse.center = new_center
    

    这里可能如下所示

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import Slider
    from matplotlib.patches import Ellipse
    
    #variable
    d_in=80
    
    fig = plt.figure(figsize=(12,6))
    ax = fig.add_subplot(111)
    fig.subplots_adjust(left=0.25, bottom=0.35)
    x = np.arange(0.0, 300, 0.01)
    
    
    # object ellipse
    Spiegel = Ellipse(xy=(d_in, 0), width=2, height=73.2,
                      edgecolor='black', fc='#808080', lw=1)
    ax.add_patch(Spiegel)
    
    
    #Draw d_in slider
    d_in_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03])
    d_in_slider = Slider(d_in_slider_ax, 'd_in', 1, 150, valinit=d_in)
    
    def update(val):
        Spiegel.center = (val,0)
    
    d_in_slider.on_changed(update)
    
    
    #axis range
    ax.set_xlim([0, 300])
    ax.set_ylim([-40, 40])
    
    plt.show()
    

    【讨论】:

    • 我对 Rectangle 对象进行了同样的尝试。它不起作用,我可以绘制矩形,但它对更新定义没有反应。你有什么想法吗?
    • 矩形没有center 而是xy 位置。你可以设置rectangle.set_xy((x,y))
    • 再次感谢您!!!你太棒了,它很有效,而且很简单……抱歉这么愚蠢的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多