Интерактивный режим Matplotlib не будет работать, что бы я ни делал

Я использую python 3.7.7 и matplotlib 3.3.1 в сообществе Pycharm 2020.1

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

только plt.ion ()

import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3])
plt.show()


print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

это приводит только к пустому окну рисунка. Если вы щелкнете по этому окну слишком часто, оно перестанет отвечать.

plt.show (block = False)

import matplotlib.pyplot as plt    
plt.plot([1,2,3])
plt.show(block=False) 

print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

Тот же результат, что и раньше.

plt.draw ()

import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.draw()


print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

Это ничего не делает, просто отображает вопрос в консоли.

plt.ion () и plt.draw ()

import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3])
plt.draw()


print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

Опять же, пустое окно рисунка, которое вылетает после нажатия на него.

ion () и block = False

import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3])
plt.show(block=False)


print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

Опять же, пустое окно рисунка, которое вылетает после нажатия на него.

Что я могу сделать, чтобы он работал правильно?


person user46147    schedule 24.09.2020    source источник


Ответы (1)


Вам нужно добавить pause, чтобы избежать блокировки фигуры и получить доступ к вводу пользователя, пока фигура все еще отображается.

import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3])
plt.pause(0.01) # <---- add pause
plt.show()

print('is this fig good? (y/n)')
x = input()
if x=="y":
    plt.savefig(r'C:\figures\papj.png')
else:
    print("big sad")

Если вам нужно что-то более сложное, у вас будет цикл, в котором вы перерисовываете фигуру на каждой итерации (например, если вы хотите показать другую фигуру) и делаете паузу прямо в конце каждой итерации.

person runDOSrun    schedule 24.09.2020
comment
Я скопировал ваш код, и похоже, что для моего компьютера значение паузы, равное 0,01, слишком мало и приводит только к черной цифре, которая также вылетает при нажатии. Изменение значения на 1 устранило проблему, и теперь у меня есть то, что я хотел. Спасибо! - person user46147; 24.09.2020
comment
С другой стороны, фигура, которая появляется, ясна, но не интерактивна. Я не могу масштабировать или панорамировать. Вылетает при попытке. Вы тоже знаете, как это решить? - person user46147; 24.09.2020
comment
@ user46147 Хм, я не уверен, возможно ли это вообще, потому что input блокирует. Если вы посмотрите на похожие решения, я думаю, что это всегда так. Если вам нужно что-то по-настоящему интерактивное, вы можете отказаться от input и вместо этого использовать настоящие кнопки по твоей фигуре. Вы также можете попробовать изменить версии matplotlib, поскольку люди сообщают о другом поведении (половина ваших примеров дала мне другой результат). - person runDOSrun; 24.09.2020