Как обновить сюжет в matplotlib?

У меня проблемы с перерисованием фигуры. Я разрешаю пользователю указывать единицы измерения в шкале времени (ось х), а затем я пересчитываю и вызываю эти функциональные 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) 

  • как вставить небольшое изображение на углу сюжета с помощью matplotlib?
  • Вертикальная линия в конце гистограммы CDF с использованием matplotlib
  • Эквивалент Python для «удерживания» в Matlab
  • Тепловая карта в matplotlib с pcolor?
  • Добавление дополнительных контурных линий с использованием matplotlib 2D контурной графики
  • Не-ASCII-символы в Matplotlib
  • numpy rollaxis - как именно он работает?
  • Как добавить реестр Python в Windows
  • Добавьте каталог в sys.path Python, чтобы он включался каждый раз, когда я использую Python
  • PyXML на Ubuntu
  • Каков правильный способ преобразования байтов в шестнадцатеричную строку в Python 3?
  • Python, Sqlite3 - Как преобразовать список в ячейку BLOB
  • 5 Solutions collect form web for “Как обновить сюжет в matplotlib?”

    У вас есть два варианта:

    1. Сделайте то, что вы сейчас делаете, но вызовите функции graph1.clear() и graph2.clear() перед тем, как выполнить повторную загрузку данных. Это самый медленный, но самый простой и надежный вариант.

    2. Вместо подстановки вы можете просто обновить данные объектов сюжета. Вам нужно будет внести некоторые изменения в свой код, но это должно быть намного быстрее, чем при каждом повторном использовании. Однако форма данных, которые вы рисуете, не может измениться, и если диапазон ваших данных меняется, вам необходимо вручную сбросить пределы оси x и y.

    Чтобы привести пример второго варианта:

     import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 6*np.pi, 100) y = np.sin(x) # You probably won't need this if you're embedding things in a tkinter plot... plt.ion() fig = plt.figure() ax = fig.add_subplot(111) line1, = ax.plot(x, y, 'r-') # Returns a tuple of line objects, thus the comma for phase in np.linspace(0, 10*np.pi, 500): line1.set_ydata(np.sin(x + phase)) fig.canvas.draw() 

    Это сработало для меня. Неоднократно вызывает функцию, обновляющую график каждый раз.

     import matplotlib.pyplot as plt import matplotlib.animation as anim def plot_cont(fun, xmax): y = [] fig = plt.figure() ax = fig.add_subplot(1,1,1) def update(i): yi = fun() y.append(yi) x = range(len(y)) ax.clear() ax.plot(x, y) print i, ': ', yi a = anim.FuncAnimation(fig, update, frames=xmax, repeat=False) plt.show() 

    «fun» – это функция, которая возвращает целое число. FuncAnimation будет многократно называть «обновление», он будет делать это «xmax» раз.

    Если кто-то встретит эту статью в поисках того, что я искал, я нашел примеры на

    Как визуализировать скалярные 2D-данные с помощью Matplotlib?

    а также

    http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (на web.archive.org)

    затем изменили их, чтобы использовать imshow с входным стеком кадров, вместо генерации и использования контуров «на лету».


    Начиная с 3D-массива изображений формы (nBins, nBins, nBins), называемых frames .

     def animate_frames(frames): nBins = frames.shape[0] frame = frames[0] tempCS1 = plt.imshow(frame, cmap=plt.cm.gray) for k in range(nBins): frame = frames[k] tempCS1 = plt.imshow(frame, cmap=plt.cm.gray) del tempCS1 fig.canvas.draw() #time.sleep(1e-2) #unnecessary, but useful fig.clf() fig = plt.figure() ax = fig.add_subplot(111) win = fig.canvas.manager.window fig.canvas.manager.window.after(100, animate_frames, frames) 

    Я также нашел гораздо более простой способ заниматься этим процессом, хотя и менее надежным:

     fig = plt.figure() for k in range(nBins): plt.clf() plt.imshow(frames[k],cmap=plt.cm.gray) fig.canvas.draw() time.sleep(1e-6) #unnecessary, but useful 

    Обратите внимание, что оба эти только, похоже, работают с ipython --pylab=tk , aka backend = TkAgg

    Спасибо за помощь со всем.

    Я выпустил пакет под названием python-drawow, который предоставляет функциональность, позволяющую обновлять фигуру, обычно называемую внутри цикла for, похожей на Matlab's drawnow .

    Пример использования:

     from pylab import figure, plot, ion, linspace, arange, sin, pi def draw_fig(): # can be arbitrarily complex; just to draw a figure #figure() # don't call! plot(t, x) #show() # don't call! N = 1e3 figure() # call here instead! ion() # enable interactivity t = linspace(0, 2*pi, num=N) for i in arange(100): x = sin(2 * pi * i**2 * t / 100.0) drawnow(draw_fig) 

    Этот пакет работает с любым рисунком matplotlib и предоставляет опции для ожидания после обновления каждой цифры или перехода в отладчик.

    Все вышеизложенное может быть правдой, однако для меня «онлайн-обновление» цифр работает только с некоторыми бэкэндами, в частности wx . Вы просто можете попробовать изменить это, например, запустив ipython / pylab с помощью ipython --pylab=wx ! Удачи!

    Python - лучший язык программирования в мире.