我有一个python脚本,它通过用户输入不断循环,引导它从文件中获取数据,然后使用matplotlib绘制它。我的希望是,当脚本继续在控制台中继续,请求下一轮用户输入和绘图时,这些情节就会出现,并在周围停留(并继续进行交互)。因此,用户最终可能会打开几个绘图窗口,这些窗口都是功能性的。
实际上,我让它在我的python2.7anaconda构建中使用下面的示例代码,它只绘制每个循环的随机数据集。
import sys
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
print('matplotlib version: '+matplotlib.__version__)
version = sys.version_info[0]
def plot_data(data):
fig = plt.figure(figsize=(6,6))
plt.plot(data)
plt.ion()
plt.show()
plt.pause(0.001)
while True:
if version < 3:
option = raw_input('type (1) to plot next data, (q) to quit\n')
else:
option = input('type (1) to plot next data, (q) to quit\n')
if option == '1':
data = np.random.choice(1000,100, replace = False)
plot_data(data)
elif option == 'q':
break运行我的python3.6Build的代码,这个图就会显示出来,但是被冻结在一个没有响应的状态,直到我回到控制台并键入q退出我的用户输入循环。在python2.7中,绘图窗口通过多个输入循环和绘图调用充分发挥作用。所以我希望有人知道这里有什么不同。我正在打印matplotlib版本,看起来我的2.7和3.6环境都在使用相同的matplotlib 2.0.2,所以它可能在GUI处理程序中?
发布于 2018-01-11 20:09:43
我不确定使用while循环和plt.ion()从问题中获得的设置是否真的能够工作。至少对于我来说,使用python2.7和matplotlib 2.1就没有了。
不过,我认为这是意料之中的,因为只要等待用户输入,应用程序就会冻结并失去响应。
无论如何,由于混合控制台和GUI应用程序总是有点微妙,所以我选择完全在GUI的事件循环中工作。
您可以将"key_press_event"连接到"1"和"q"键,并在打开的matplotlib窗口中显示新数据。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(111)
def plot_data(ax, data):
ax.clear()
ax.plot(data)
ax.figure.canvas.draw_idle()
def press(event=None):
if event:
if event.key == "1":
data = np.random.choice(1000,100, replace = False)
plot_data(ax, data)
elif event.key == "q":
plt.close()
cid= fig.canvas.mpl_connect("key_press_event", press)
plt.show()如果您想要创建几个数字,如下所示
import matplotlib.pyplot as plt
import numpy as np
def create_figure(data):
fig, ax = plt.subplots(figsize=(6,6))
ax.plot(data)
cid = fig.canvas.mpl_connect("key_press_event", press)
fig.show()
def plot_data():
data = np.random.choice(1000,100, replace = False)
create_figure(data)
def press(event=None):
if event:
if event.key == "1":
plot_data()
elif event.key == "q":
plt.close("all")
else:
plot_data()
press()
plt.show()对于更复杂的输入,您可以创建一个小型GUI,它收集输入并调用绘图函数。例如,人们可以为此使用Tkinter。
from Tkinter import * # use from tkinter import * if using python3
import matplotlib.pyplot as plt
import numpy as np
def create_figure(data):
fig, ax = plt.subplots(figsize=(6,6))
ax.plot(data)
fig.show()
def plot_data(n, amp):
try:
n = int(n)
amp = float(amp)
data = amp*np.random.rand(n)
create_figure(data)
except:
pass
def closeall():
for i in plt.get_fignums():
plt.close(i)
def create_input():
root = Tk()
Label(text="Number of datapoints").grid(row=1,column=0, sticky=W)
Label(text="Amplitude").grid(row=2,column=0, sticky=W)
tb1=Entry(root,textvariable=StringVar(root, value='24'))
tb1.grid(row=1,column=1, sticky=W+E)
tb2=Entry(root,textvariable=StringVar(root, value='6'))
tb2.grid(row=2,column=1, sticky=W+E)
b1=Button(root,text=" Plot ",command= lambda : plot_data(tb1.get(),tb2.get()))
b1.grid(row=4,column=1, sticky=W+E)
b2=Button(root,text="Close All",command=closeall)
b2.grid(row=5,column=1, sticky=W+E)
root.mainloop()
create_input()

https://stackoverflow.com/questions/48198334
复制相似问题