2015-06-17 3 views
2

Я реализую средство просмотра изображений с использованием matplotlib. Идея состоит в том, что изменения, внесенные в изображение (например, приложение фильтра), будут автоматически обновляться.Рисунок Matplotlib не обновляется при изменении данных

Я создаю рисунок, чтобы показать исходное изображение, и добавил кнопку, используя pyQt, чтобы обновить данные. Данные делает изменение, я проверил, но на рисунке нет. Однако, если после того, как я нажал кнопку приложения фильтра, I переместите изображение с помощью стандартной панели инструментов matplotlib, изображение затем обновляется.

Я предполагаю, что я делаю что-то неправильно при обновлении изображения, но поскольку факт его перемещения фактически заставляет обновление, он показывает изменение данных. Я бы хотел, чтобы это произошло, когда я нажимаю кнопку.

Ниже приведен код. Это начальная инициализация цифра, которая показывает исходное изображение:

self.observableFig = Figure((4.0, 4.0), dpi=100) 
    self.canvas = FigureCanvas(self.observableFig) 
    self.canvas.setParent(self.observableWindow) 
    self.canvas.setFocusPolicy(Qt.StrongFocus) 
    self.canvas.setFocus() 

    self.canvas.mpl_connect('button_press_event', self.on_click) 

    # Showing initial data on Window 
    self.observableFig.clear() 
    self.observableAxes = self.observableFig.add_subplot(1, 1, 1) 
    min, max = self.min, self.max 
    self.observableAxes.imshow(self.data, vmin=min, vmax=max, origin='lower') 

И это событие при нажатии на кнопку, которая изменяет данные:

self.observableAxes.imshow(self.data/2, origin='lower') 
    # plt.clf() 
    # plt.draw() 
    # plt.show() 

Я попытался draw(), show(), в основном все, что я нашел на pyplot. Я также пробовал как с, так и без plt.ion() в начале, но это не повлияло на это.

Заранее спасибо.

ответ

5

Причина, по которой ничего не обновляется, заключается в том, что вы пытаетесь использовать методы pyplot для фигуры, которая не является частью конечного автомата для работы с пистолетом. plt.draw() не рисует эту цифру, так как plt не знает, что фигура существует.

Используйте вместо этого fig.canvas.draw().

Несмотря на это, то лучше использовать fig.canvas.draw() что plt.draw(), как это ясно, какой рисунок вы рисуете (бывший рисует один, последний привлекает все, но только если они отслеживаются pyplot).

попробовать что-то вдоль этих линий:

import numpy as np 
import matplotlib.pyplot as plt 

data = np.random.random((10,10)) 

# To make a standalone example, I'm skipping initializing the 
# `Figure` and `FigureCanvas` and using `plt.figure()` instead... 
# `plt.draw()` would work for this figure, but the rest is identical. 
fig, ax = plt.subplots() 
ax.set(title='Click to update the data') 
im = ax.imshow(data) 

def update(event): 
    im.set_data(np.random.random((10,10))) 
    fig.canvas.draw() 

fig.canvas.mpl_connect('button_press_event', update) 
plt.show() 
+0

Спасибо за ваш ответ. Я хотел бы знать, что вы имеете в виду: «последний рисует все, но только если их отслеживают« pyplot », хотя ... есть способ, которым я могу фактически добавить цифры, которые будут отслеживаться« pyplot »? Я предполагаю, что это может быть полезно, когда вы хотите обновить многие цифры. – Francisca

+1

@Fran. «Отслеживается pyplot». Я в основном имею в виду «созданный с использованием' plt.figure() 'или' plt.subplots() '. Это похоже на то, re вставлять matplotlib в какую-то структуру gui? Если это так, вы не хотите, чтобы в этом смысле были обнаружены следы от пиплета. В противном случае у них будут свои собственные окна gui. Если вы не пишете отдельное GUI-приложение, , тогда лучше всего создать фигуры с использованием pyplot именно по той причине, о которой вы только что упоминали. –

Смежные вопросы