matplotlib滑块重绘未更新figtext

3 投票
1 回答
2727 浏览
提问于 2025-04-17 00:08

我在matplotlib中使用滑块来根据图形用户界面的输入更新一些图表。我的所有图表都能很好地更新。但是,当我使用figtext时,更新后的文字会覆盖掉原来的文字。

import numpy as np
import pylab as p
from matplotlib.widgets import Slider

p.subplot(111) 
x = np.arange(0,500,1)
f = np.sin(x/100.0)
l11, = p.plot(f)

ax = p.axes([0.25, 0.05, 0.7, 0.03], axisbg='lightgoldenrodyellow')
slider1 = Slider(ax, 'amplitude', -1.0, 1.5, valinit=0)

def update(val):
    f = slider1.val * np.sin(x/100.0)
    l11.set_ydata(f)
    np.set_printoptions(precision=2)
    p.figtext(0.5, 0.65,  str(slider1.val) )
    p.draw()

slider1.on_changed(update)
p.show()

1 个回答

4

每次你调用 p.figtext(0.5, 0.65, str(slider1.val)) 时,实际上是在创建一个新的 Text 对象,这个新对象会覆盖之前的内容。正确的做法是保存第一个 Text 对象的引用,然后通过调用它的 set_text() 方法来更新它的内容。我已经把你的代码更新了,给你一个可以正常工作的例子。

import numpy as np
import pylab as p
from matplotlib.widgets import Slider

p.subplot(111) 
x = np.arange(0,500,1)
f = np.sin(x/100.0)
l11, = p.plot(f)

ax = p.axes([0.25, 0.05, 0.7, 0.03], axisbg='lightgoldenrodyellow')
slider1 = Slider(ax, 'amplitude', -1.0, 1.5, valinit=0)

# the text on the figure
fig_text = p.figtext(0.5, 0.65,  str(slider1.val))

def update(val):
    f = slider1.val*np.sin(x/100.0)
    l11.set_ydata(f)
    np.set_printoptions(precision=2)

    # update the value of the Text object
    fig_text.set_text(str(slider1.val))

    p.draw()

slider1.on_changed(update)
p.show()

撰写回答