首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python 2.7 vs3.6中,多个交互式matplotlib的行为不同

在python 2.7 vs3.6中,多个交互式matplotlib的行为不同
EN

Stack Overflow用户
提问于 2018-01-11 00:47:50
回答 1查看 372关注 0票数 3

我有一个python脚本,它通过用户输入不断循环,引导它从文件中获取数据,然后使用matplotlib绘制它。我的希望是,当脚本继续在控制台中继续,请求下一轮用户输入和绘图时,这些情节就会出现,并在周围停留(并继续进行交互)。因此,用户最终可能会打开几个绘图窗口,这些窗口都是功能性的。

实际上,我让它在我的python2.7anaconda构建中使用下面的示例代码,它只绘制每个循环的随机数据集。

代码语言:javascript
复制
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处理程序中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 20:09:43

我不确定使用while循环和plt.ion()从问题中获得的设置是否真的能够工作。至少对于我来说,使用python2.7和matplotlib 2.1就没有了。

不过,我认为这是意料之中的,因为只要等待用户输入,应用程序就会冻结并失去响应。

无论如何,由于混合控制台和GUI应用程序总是有点微妙,所以我选择完全在GUI的事件循环中工作。

您可以将"key_press_event"连接到"1""q"键,并在打开的matplotlib窗口中显示新数据。

代码语言:javascript
复制
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()

如果您想要创建几个数字,如下所示

代码语言:javascript
复制
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。

代码语言:javascript
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48198334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档