matplotlib show() 不能工作两次

2024-01-03

我有一个奇怪的问题,与 matplotlib 有关。如果我运行这个程序,我可以多次打开和关闭同一个图形。

import numpy
from pylab import figure, show


X = numpy.random.rand(100, 1000)
xs = numpy.mean(X, axis=1)
ys = numpy.std(X, axis=1)

fig = figure()
ax = fig.add_subplot(111)
ax.set_title('click on point to plot time series')
line, = ax.plot(xs, ys, 'o', picker=5)  # 5 points tolerance


def onpick(event):

    figi = figure()
    ax = figi.add_subplot(111)
    ax.plot([1,2,3,4])        
    figi.show()

fig.canvas.mpl_connect('pick_event', onpick)

show()

相反,如果我在自定义小部件中使用相同的 onpick 函数代码,它只会在第一次打开图形,然后进入它进入函数的其他事件,但不显示图形:

from PyQt4 import QtGui, QtCore
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
import time

STEP = 0.000152 

class MplCanvas(FigureCanvas):

    def __init__(self):

        # initialization of the canvas
        FigureCanvas.__init__(self, Figure())

        self.queue = []
        self.I_data = np.array([])
        self.T_data = np.array([])

        self.LvsT = self.figure.add_subplot(111)
        self.LvsT.set_xlabel('Time, s')
        self.LvsT.set_ylabel('PMT Voltage, V')
        self.LvsT.set_title("Light vs Time")
        self.LvsT.grid(True)

        self.old_size = self.LvsT.bbox.width, self.LvsT.bbox.height
        self.LvsT_background = self.copy_from_bbox(self.LvsT.bbox)

        self.LvsT_plot, = self.LvsT.plot(self.T_data,self.I_data)
        #self.LvsT_plot2, = self.LvsT.plot(self.T_data2,self.I_data2) 

        self.mpl_connect('axes_enter_event', self.enter_axes)
        self.mpl_connect('button_press_event', self.onpick)
        self.count = 0
        self.draw()

    def enter_axes(self,event):

        print "dentro"

    def onpick(self,event):
        print "click"
        print 'you pressed', event.canvas

        a = np.arange(10)
        print a
        print self.count

        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.plot(a)    
        fig.show()



    def Start_Plot(self,q,Vmin,Vmax,ScanRate,Cycles):
        self.queue = q

        self.LvsT.clear()
        self.LvsT.set_xlim(0,abs(Vmin-Vmax)/ScanRate*Cycles)
        self.LvsT.set_ylim(-3, 3)
        self.LvsT.set_autoscale_on(False)
        self.LvsT.clear()
        self.draw()

        self.T_data = np.array([])
        self.I_data = np.array([])

        # call the update method (to speed-up visualization)
        self.timerEvent(None)
        # start timer, trigger event every 1000 millisecs (=1sec)
        self.timerLvsT = self.startTimer(3)

    def timerEvent(self, evt):

        current_size = self.LvsT.bbox.width, self.LvsT.bbox.height
        if self.old_size != current_size:
            self.old_size = current_size
            self.LvsT.clear()
            self.LvsT.grid()
            self.draw()
            self.LvsT_background = self.copy_from_bbox(self.LvsT.bbox)

        self.restore_region(self.LvsT_background, bbox=self.LvsT.bbox)

        result = self.queue.get()

        if result == 'STOP': 
            self.LvsT.draw_artist(self.LvsT_plot)
            self.killTimer(self.timerLvsT)
            print "Plot finito LvsT"

        else:
            # append new data to the datasets
            self.T_data = np.append(self.T_data,result[0:len(result)/2])
            self.I_data = np.append(self.I_data,result[len(result)/2:len(result)])

            self.LvsT_plot.set_data(self.T_data,self.I_data)#L_data
            #self.LvsT_plot2.set_data(self.T_data2,self.I_data2)#L_data

            self.LvsT.draw_artist(self.LvsT_plot)

            self.blit(self.LvsT.bbox)


class LvsT_MplWidget(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)        
        self.canvas = MplCanvas()
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)
        self.setLayout(self.vbl)

动画绘图需要这个小部件,当实验完成时,如果我单击绘图,它应该会出现一个图形,该图形仅在第一次出现。

你有什么线索吗?

非常感谢。


在代码开头,通过启用交互模式 plt.ion()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matplotlib show() 不能工作两次 的相关文章

随机推荐

  • Java Spring MVC 在浏览器中显示 PDF

    如何强制浏览器显示 pdf 而不是下载 这是控制器 RequestMapping value preview pdf method RequestMethod GET protected String preivewSection Http
  • 将静态子域添加到网站的推荐方法是什么?

    我想创建一些静态子域 例如 mycategory mydomain com 在一个相当小的网站中 并希望它指向该文件夹 mydomain com mycategory 不在浏览器地址栏中显示此类重定向 实现它的最简单方法是什么 我可以在 I
  • 吸收 HTML 元素的宽度

    我正在思考如何使用 html 元素来做到这一点 颜色没有什么特别的 所以我不需要把它们做成图像 请注意 文本是右对齐的 此外 颜色条从左侧上升到文本 因此 这可以通过让文本向右浮动 背景颜色为白色 并在其旁边设置一个背景颜色的 div 然后
  • 将事件监听器添加到未来的项目(没有 jQuery)[重复]

    这个问题在这里已经有答案了 很好奇我是否愿意接受用 Vanilla JS 编写列表应用程序的挑战 问题是事件监听器没有添加到新的列表项中 我向列表中的现有项目添加删除按钮 const deleteButton document queryS
  • 为什么数字的行为与有序的不同?

    Scala 有许多可以用作类型类的特征 例如Ordered and Numeric包装内scala math 例如 我可以使用编写一个通用方法Ordered像这样 def f T
  • Request.Url.Host 和 ApplicationPath 一次调用

    有什么办法可以得到HttpContext Current Request Url Host and HttpContext Current Request ApplicationPath一通电话 像 完整的应用程序网址 之类的东西 编辑 澄
  • 如何在 Swift 中将字典切片转换为字典

    我正在尝试转换myDictionary dropFirst 一本新字典缺少一个键 我不在乎是哪一个 dropFirst 返回一个切片 我想要一本与以下类型相同的新词典myDictionary 您可以将数组切片转换为数组 如下所示let ar
  • 类型“Observable<{}>”不可分配给类型“Observable”

    前言 我知道还有很多其他问题也有同样的错误 但我似乎仍然无法弄清楚我自己的问题 我有一个简单的服务和另一个简单的组件 我正在尝试非常严格地遵循 angular2 英雄教程 这是我的代码 位置 ts export class Location
  • 使用 Segue 发送变量

    我正在开发一个简单的 iOS Swift 应用程序 该应用程序有 2 个视图控制器和一个已编程为连接到另一个视图控制器的按钮 如下所示 IBAction func pushMe sender AnyObject self performSe
  • 将列表中的学生姓名和年龄添加到列表框

    我有 3 个textboxes我可以在哪里进入Name Surname and Age 当我按下按钮1后 它会生成一个具有这些属性的新学生 如何将具有所有 3 个属性的学生添加到ListBox 看起来像这样 姓名 姓氏 年龄1 约翰 史密斯
  • WP7 - 在“重建”时擦除独立存储设置

    我刚刚发现 困难的方法 如果您在 Visual Studio 中执行 重建 或 清理 gt 构建 后将应用程序部署到设备 您的应用程序将首先被卸载 然后重新安装 导致隔离的存储文件被擦除 应用程序部署工具似乎总是会卸载 重新安装 无论它是否
  • Java Instant.parse 日期 java 8

    我有一些旧版 KML 文档 其中包含时间戳条目 为什么使用 Instant 解析时以下日期无效 这两种方法都假设解析 ISO 8601 格式的日期 字符串日期字符串 2017 12 04T08 06 60Z Using java time
  • 您能否将 Google Cloud 网络控制台登录限制在某个 IP 地址范围内?

    我在使用 Google Cloud Platform 特别是我工作的 IT 安全部门的 Big Query 时遇到了一些阻力 争论的焦点是任何人都可以从任何地方登录 有什么办法只允许来自特定 IP 范围的 GCP 访问吗 或者是否有其他方法
  • Azure 函数请求正文为 xml 而不是 json

    我正在跟进这个例子 https learn microsoft com en us azure azure functions functions test a function在 Azure 函数中创建 javascript 函数并使用
  • php 的 mysql_real_escape_string() 的等效 JavaScript 代码是什么?

    等效的 javascript 代码是什么mysql real escape string 基于PHP 文档 http php net manual en function mysql real escape string php该方法的作用
  • 如何在 felm() 函数之后绘制交互的边际效应

    我基于具有一堆单位固定效应的 巨大 面板数据进行了回归 所以我使用了包 lfe 中的函数 felm 此外 我在回归中有两个连续变量的交互项 但是 当绘制 x 对 y 的边际效应如何随 x2 变化时 felm 生成的对象似乎通常与大多数绘图函
  • 为什么我使用 context().method() 违反了状态图断言?

    我已经为一个项目开发了一些概念代码 我很快就会从事该项目 该项目适合于状态机设计 我认为 boost statechart 会做得很好 然而 当我尝试使用 context 时 我遇到了障碍 这是一个示例 我很乐意提供更多代码 但我认为这是相
  • 如何“安全”地使用 window.history.pushState

    我想使用window history pushState 支持浏览器的功能 不幸的是我在 Firefox 上遇到错误 类型错误 history pushState 不是函数 如何才能避免这种情况呢 虽然我没有在 JavaScript 中测试
  • Swift 1.2 中的可变@autoclosure ?

    现在 autoclosure是参数声明的一部分而不是类型 如何声明函数采用可变数量的自动闭包 Before public func coalesce
  • matplotlib show() 不能工作两次

    我有一个奇怪的问题 与 matplotlib 有关 如果我运行这个程序 我可以多次打开和关闭同一个图形 import numpy from pylab import figure show X numpy random rand 100 1