Pyplot: обновление окна imshow()

У меня есть два метода: generate_window(), который показывает изображение и on_click(), который реагирует на щелчок в окне, показывающем изображение. Они выглядят так:

def generate_panel(img):
  plt.figure()
  ax = plt.gca()
  fig = plt.gcf()
  implot = ax.imshow(img)
  # When a colour is clicked on the image an event occurs
  cid = fig.canvas.mpl_connect('button_press_event', onclick)
  plt.show()

def onclick(event):
  if event.xdata != None and event.ydata != None:
    # Change the contents of the plt window here

В последней строке кода я хочу иметь возможность изменить изображение, показанное в окне plt, но я не могу заставить его работать. Я пробовал set_data() и draw() в разных местах, но это не сработало. Какие-либо предложения? Заранее спасибо.

1 ответ

Решение

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

NB: при использовании интерактивного режима вы должны указать аргумент block=True на plt.show() чтобы предотвратить немедленное закрытие окна.

Эта измененная версия вашего примера должна отображать окружность при каждом щелчке мыши:

from matplotlib import pyplot as plt
import matplotlib.image as mpimg
import numpy as np


def generate_panel(img):
    plt.figure()
    ax = plt.gca()
    fig = plt.gcf()
    implot = ax.imshow(img)
    # When a colour is clicked on the image an event occurs
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    plt.show(block=True)


def onclick(event):
    if event.xdata is not None and event.ydata is not None:
        circle = plt.Circle((event.xdata,
                             event.ydata), 2, color='r')
        fig = plt.gcf()
        fig.gca().add_artist(circle)
        plt.draw()
        # Change the contents of the plt window here


if __name__ == "__main__":
    plt.ion()
    img = np.ones((600, 800, 3))
    generate_panel(img)
Другие вопросы по тегам