不管我做什么,Matplotlib交互模式都行不通

问题描述

我在Pycharm社区2020.1上使用python 3.7.7和matplotlib 3.3.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,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,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,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,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")

同样,空白图形窗口在单击后崩溃。

我该怎么做才能使其正常工作?

解决方法

您需要添加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")

如果您需要比这更复杂的内容,则将有一个循环,在该循环中您可以在每次迭代中重绘该图形(例如,如果要显示不同的图形),并在每次迭代结束时立即暂停。