У меня проблемы с перерисовкой фигуры здесь. Я позволяю пользователю указать единицы измерения во временной шкале (ось X), а затем я пересчитываю и вызываю эту функцию plots()
. Я хочу, чтобы сюжет просто обновлялся, а не добавлял другой сюжет к рисунку.
def plots():
global vlgaBuffSorted
cntr()
result = collections.defaultdict(list)
for d in vlgaBuffSorted:
result[d['event']].append(d)
result_list = result.values()
f = Figure()
graph1 = f.add_subplot(211)
graph2 = f.add_subplot(212,sharex=graph1)
for item in result_list:
tL = []
vgsL = []
vdsL = []
isubL = []
for dict in item:
tL.append(dict['time'])
vgsL.append(dict['vgs'])
vdsL.append(dict['vds'])
isubL.append(dict['isub'])
graph1.plot(tL,vdsL,'bo',label='a')
graph1.plot(tL,vgsL,'rp',label='b')
graph2.plot(tL,isubL,'b-',label='c')
plotCanvas = FigureCanvasTkAgg(f, pltFrame)
toolbar = NavigationToolbar2TkAgg(plotCanvas, pltFrame)
toolbar.pack(side=BOTTOM)
plotCanvas.get_tk_widget().pack(side=TOP)
python
matplotlib
tkinter
thenickname
источник
источник
Ответы:
По сути, у вас есть два варианта:
Делайте именно то, что вы делаете в данный момент, но звоните
graph1.clear()
иgraph2.clear()
до пересадки данных. Это самый медленный, но самый простой и надежный вариант.Вместо того, чтобы реплотировать, вы можете просто обновить данные объектов графика. Вам нужно будет внести некоторые изменения в ваш код, но это должно быть намного, намного быстрее, чем каждый раз повторять реплоты. Тем не менее, форма данных, которые вы выводите, не может измениться, и если диапазон ваших данных меняется, вам необходимо вручную сбросить ограничения по осям x и y.
Чтобы привести пример второго варианта:
источник
clear
? Вы должны звонитьgraph1.clear(); graph2.clear()
внутри своегоfor
цикла, как раз перед тем, как звонитьgraph1.plot(...)
, иgraph2.plot(...)
т.д ...fig.canvas.draw()
илиplt.draw()
после составления графика каждого кадра? (Т.е. вы должны иметь последовательностьclear
,plot
,draw
каждый раз , когда вы хотите , чтобы показать кадр) Я предполагаю, но я думаю , что может вызвать именно поведение вы описываете ... Удачи, во всяком случае!Вы также можете сделать следующее: Это нарисует случайные матричные данные 10x1 на графике для 50 циклов цикла for.
источник
%matplotlib inline
в тетради Jupyter тоже есть.plt.clf()
. Оmatplotlib
, ты негодяй :)Это сработало для меня. Неоднократно вызывает функцию обновления графика каждый раз.
«fun» - это функция, которая возвращает целое число. FuncAnimation будет неоднократно вызывать «обновление», он будет делать это «xmax» раз.
источник
Если кто-то сталкивается с этой статьей в поисках того, что я искал, я нашел примеры на
Как визуализировать скалярные 2D данные с помощью Matplotlib?
и
http://mri.brechmos.org/2009/07/automatics-update-a-figure-in-a-loop (на web.archive.org)
затем изменил их, чтобы использовать imshow со входным стеком кадров вместо генерации и использования контуров на лету.
Начиная с трехмерного массива изображений формы (nBins, nBins, nBins), называется
frames
.Я также нашел гораздо более простой способ прохождения всего этого процесса, хотя и менее надежный:
Обратите внимание , что оба они , кажется , только для работы с
ipython --pylab=tk
акойbackend = TkAgg
Спасибо за помощь во всем.
источник
Я выпустил пакет с именем python-drawnow, который предоставляет функциональность, позволяющую обновлять фигуры, обычно вызываемые в цикле for, аналогично Matlab
drawnow
.Пример использования:
Этот пакет работает с любым рисунком matplotlib и предоставляет опции для ожидания после каждого обновления рисунка или перехода в отладчик.
источник
Все вышесказанное может быть правдой, однако для меня «онлайн-обновление» фигур работает только с некоторыми бэкэндами, в частности
wx
. Вы можете попробовать изменить это, например, запустив ipython / pylab с помощьюipython --pylab=wx
! Удачи!источник
Это сработало для меня:
источник