Мне нужна ваша помощь. Пожалуйста, рассмотрите приведенный ниже код, который строит синусоиду, используя pylab
в IPython
. Ползунок под осью позволяет пользователю интерактивно регулировать частоту синусоиды.
%pylab
# setup figure
fig, ax = subplots(1)
fig.subplots_adjust(left=0.25, bottom=0.25)
# add a slider
axcolor = 'lightgoldenrodyellow'
ax_freq = axes([0.3, 0.13, 0.5, 0.03], axisbg=axcolor)
s_freq = Slider(ax_freq, 'Frequency [Hz]', 0, 100, valinit=a0)
# plot
g = linspace(0, 1, 100)
f0 = 1
sig = sin(2*pi*f0*t)
myline, = ax.plot(sig)
# update plot
def update(value):
f = s_freq.val
new_data = sin(2*pi*f*t)
myline.set_ydata(new_data) # crucial line
fig.canvas.draw_idle()
s_freq.on_changed(update)
Вместо вышеперечисленного мне нужно построить сигнал в виде вертикальных линий, начиная от амплитуды каждой точки в t
до оси X. Таким образом, моей первой идеей было использовать vlines
вместо plot
в строке 15:
myline = ax.vlines(range(len(sig)), 0, sig)
Это решение работает в неинтерактивном случае. Проблема в том, что plot
возвращает объект matplotlib.lines.Line2D
, который предоставляет метод set_ydata
для интерактивного обновления данных. Объект, возвращаемый vlines
, имеет тип matplotlib.collections.LineCollection
и не предоставляет такой метод. Мой вопрос: как мне обновить LineCollection
в интерактивном режиме?
set_offsets
илиset_verts
. - person tacaswell   schedule 29.03.2015set_offset
илиset_verts
.set_segments
работает, но вы должны предоставить его в формате трехмерного массива, где каждый элемент имеет форму[[x, ymin], [x, ymax]]
. - person Aaron Voelker   schedule 31.03.2020