Python/Matplotlib - 快速更新轴上的文本

2024-04-04

我在 wxpython 窗口中有一个 matplotlib 图/画布。我想在鼠标移动时更新绘图上的一些信息。我已连接到“motion_notify_event”来获取此信息。

在下面的代码中,绘制了大量随机数据,然后在窗口的状态栏中显示光标的 x,y 位置。这非常顺利并且效果很好。然而,我真的想在图的顶部显示这些信息。如果取消注释 cbUpdateCursor 的最后两行,就会显示我想要的行为。但是,完成此操作后,移动光标的响应时间非常慢(因为调用了绘制并且存在大量数据,但必须调用绘制否则文本不会更新)。

如何加快速度,以便光标位置可以显示在绘图上,但又不会减慢太多?我想我可能需要用 bbox 做点什么?

Code:

import wx
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.widgets import Cursor
from matplotlib.backends.backend_wxagg import \
   FigureCanvasWxAgg as FigCanvas, \
   NavigationToolbar2WxAgg as NavigationToolbar

class wxPlotting(wx.Frame):
   title = 'Test'
   def __init__(self):
      wx.Frame.__init__(self, None, -1, self.title)
      self.time = np.arange(10000)
      self.data = np.random.random(10000)
      self.sb = self.CreateStatusBar()
      self.create_main_panel()
      self.axes.plot(self.time, self.data)
      self.canvas.draw()

   def create_main_panel(self):
      self.panel = wx.Panel(self)
      self.fig = Figure((5.0, 4.0), dpi=100)
      self.canvas = FigCanvas(self.panel, -1, self.fig)
      self.axes = self.fig.add_subplot(111)
      self.text = self.axes.text(0., 1.005, '', transform = self.axes.transAxes)
      self.cursor = Cursor(self.axes, useblit=True, color='red')
      self.canvas.mpl_connect('motion_notify_event', self.cbUpdateCursor)
      self.vbox = wx.BoxSizer(wx.VERTICAL)
      self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
      self.panel.SetSizer(self.vbox)
      self.vbox.Fit(self)

   def cbUpdateCursor(self, event):
      if event.inaxes:
         text = 'x = %5.4f, y = %5.4f' % (event.xdata, event.ydata)
         self.sb.SetStatusText(text)
         #self.text.set_text(text)
         #self.canvas.draw()

if __name__ == '__main__':
   app = wx.PySimpleApp()
   app.frame = wxPlotting()
   app.frame.Show()
   app.MainLoop()

基本上我想要类似于使用 pyplot 显示的文本的内容,即运行下面的代码时的右下角:

Code:

import matplotlib.pyplot as plt
plt.plot(range(10000), range(10000))
plt.show()

EDIT:

在我的实际程序中,我希望静态文本位于 matplotlib 轴内,而不是真正位于其上方。所以我不认为我可以只使用 wxpython statictext 来显示它。


您可以使用位块传送,类似于动画示例here http://www.scipy.org/Cookbook/Matplotlib/Animations#head-3d51654b8306b1585664e7fe060a60fc76e5aa08.

这使得一个very在这种情况下,性能差异很大,因为只需要重绘窗口的一小部分。

不幸的是,我不知道如何在重绘时在文本后面获得灰色背景,以匹配其后面的默认图形背景......不过,性能非常出色。

作为基于上面代码的独立示例:

import wx
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.widgets import Cursor
from matplotlib.backends.backend_wxagg import \
   FigureCanvasWxAgg as FigCanvas, \
   NavigationToolbar2WxAgg as NavigationToolbar

class wxPlotting(wx.Frame):
   title = 'Test'
   def __init__(self):
      wx.Frame.__init__(self, None, -1, self.title)
      self.time = np.arange(10000)
      self.data = np.random.random(10000)
      self.sb = self.CreateStatusBar()
      self.create_main_panel()
      self.axes.plot(self.time, self.data)
      self.background = self.canvas.copy_from_bbox(self.fig.bbox)
      self.canvas.draw()

   def create_main_panel(self):
      self.panel = wx.Panel(self)
      self.fig = Figure((5.0, 4.0), dpi=100)
      self.canvas = FigCanvas(self.panel, -1, self.fig)
      self.axes = self.fig.add_subplot(111)
      self.text = self.axes.text(0., 1.005, '', transform = self.axes.transAxes, animated=True)
      self.cursor = Cursor(self.axes, useblit=True, color='red')
      self.canvas.mpl_connect('motion_notify_event', self.cbUpdateCursor)
      self.vbox = wx.BoxSizer(wx.VERTICAL)
      self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
      self.panel.SetSizer(self.vbox)
      self.vbox.Fit(self)

   def cbUpdateCursor(self, event):
      if event.inaxes:
         text = 'x = %5.4f, y = %5.4f' % (event.xdata, event.ydata)
         self.sb.SetStatusText(text)

         self.canvas.restore_region(self.background)
         self.text.set_text(text)
         self.axes.draw_artist(self.text)
         self.canvas.blit(self.text.get_window_extent())

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

Python/Matplotlib - 快速更新轴上的文本 的相关文章

  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • 从 torch.autograd.gradcheck 导入 zero_gradients

    我想复制代码here https github com LTS4 DeepFool blob master Python deepfool py 并且我在 Google Colab 中运行时收到以下错误 ImportError 无法导入名称
  • 如何替换Python字符串中的正确字母

    任务是 您的任务是纠正数字化文本中的错误 您只需处理以下错误 S 被误解为 5 O 被误解为 0 I 被误解为 1 我的代码 def correct string for i in string if 5 in string string
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • Python,Google Places API - 给定一组纬度/经度查找附近的地点

    我有一个由商店 ID 及其纬度 经度组成的数据框 我想迭代该数据框 并使用 google api 为每个商店 ID 查找附近的关键地点 例如输入 Store ID LAT LON 1 1 222 2 222 2 2 334 4 555 3
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 使用 Tkinter 打开网页

    因此 我的应用程序需要能够打开其中的单个网页 并且它必须来自互联网并且未保存 特别是我想使用 Tkinter GUI 工具包 因为它是我最熟悉的工具包 最重要的是 我希望能够在窗口中生成事件 例如单击鼠标 但无需实际使用鼠标 有什么好的方法
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • 为什么需要设置WORKON_HOME环境变量?

    我已经有一段时间没有使用 python 虚拟环境了 但我也安装了虚拟环境包装器 我的问题是 在文档页面中它说要这样做 export WORKON HOME Envs mkdir p WORKON HOME source usr local
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • tf.print() vs Python print vs tensor.eval()

    看来在Tensorflow中 至少有三种方法可以打印出张量的值 我一直在读here https www freecodecamp org news debugging tensorflow a starter e6668ce72617 an
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM

随机推荐

  • 在 Swift 中实例化并呈现 viewController

    Issue 我开始看Swift Programming Language 不知怎的 我无法正确输入 a 的初始化UIViewController从具体的UIStoryboard In Objective C我简单地写 UIStoryboar
  • 如何使用 FFmpeg 从图像创建视频? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Rails 应用程序在服务器上速度很快,但从另一台机器访问时速度很慢

    我有一个 Rails 应用程序托管在服务器计算机上 运行 Webrick 当我登录到这台计算机并访问该应用程序 通过 localhost 3000 时 该应用程序运行顺利 但是 当我尝试从另一台计算机 通过主机名 3000 访问该应用程序时
  • 删除一行中重复的相同字符

    我正在尝试创建一种方法 该方法可以从字符串中删除所有重复项 或者根据参数仅在一行中保留相同的 2 个字符 例如 helllllllo gt helo or helllllllo gt hello 这保留了双字母 目前我通过执行以下操作删除重
  • Django 使用 sqlite3 设置?

    我正在尝试按照 django 网站上的演练进行操作 我下载了 sqlite 并将其保存在C Windows System32文件夹 当我编辑settings py文件我该放什么Name场地 我必须建立数据库吗 django 文献说 API
  • 使用 postgres 窗口函数重复行

    postgres 文档 http www postgresql org docs 9 1 static tutorial window html http www postgresql org docs 9 1 static tutoria
  • Argparse:来自文件的默认值

    我有一个 Python 脚本 它需要很多参数 我目前使用的是configuration ini文件 使用读取configparser 但希望允许用户使用命令行覆盖特定参数 如果我只有两个参数 我会使用类似的东西 if not arg1 ar
  • Java 8中basic和url base64编码的区别

    Java 8Base64 http docs oracle com javase 8 docs api java util Base64 html库有两种可用于 URI 构建的变体 基本 变体和 URL 和文件名安全 变体 该文档指出RFC
  • 外部调用的 Lambda 函数超时

    我有一个 Lambda 函数 需要从中进行外部 API 调用 我已将 Lambda 函数添 加到一个安全组 一个 VPC 和 2 个子网 它为我提供了以下文本 当您启用 VPC 时 您的 Lambda 函数将失去默认互联网 使用权 如果您需
  • 如何将字符串转换为 android.net.Uri

    问题 我发现java net URI有一个 create String uri 选项 但是android net uri才不是 进一步来说 我正在尝试获取 RingtoneManager 的输出RingtonePicker并将其设置为默认铃
  • 导入数据和事件溯源

    我目前正在开发一个整体系统 我希望将其引入现代并结合 DDD 和 CQRS 我收到了重新编写解决方案的导入机制的请求 并认为这可能是开始此重新架构过程的好机会 目前流程是 用户上传 CSV 系统解析 CSV 并在屏幕上显示每一行 对每一行以
  • AsyncSupportListenerAdapter primefaces 异常

    我是 jsf 的新人 我正在尝试使用 inf primefaces 做一些示例 当我尝试运行这个示例时 http www primefaces org showcase labs push chat jsf http www primefa
  • Angular 4 HttpClient 查询参数

    我一直在寻找一种将查询参数传递到 API 调用中的方法HttpClientModule s HttpClient并尚未找到解决方案 与旧的Http模块你会写这样的东西 getNamespaceLogs logNamespace Setup
  • 无法读取 null 属性“样式” - Google 登录按钮

    我正在尝试为我的网站实施 Google 登录 登录按钮正确显示 并且最初可以很好地进行登录 当我在使用网站后注销并尝试移至登录页面 我使用的是 React 所以都是一页 时 就会出现问题 我使用完全相同的函数来呈现登录页面 但它给了我一个
  • Furo Sphinx 主题在 API 文档中保留过多的大写字母

    我面临着这个问题中讨论的同样的问题 Furo Sphinx 主题在 API 文档中大写过多 https stackoverflow com questions 69873561 furo sphinx theme uppercases to
  • Angular2 ngOnDestroy,发出事件

    是否可以在 ngOnDestroy 上发出自定义事件 我尝试过 但似乎不起作用 我基本上需要知道指令何时从 UI 中删除 Output rowInit new EventEmitter Output rowDestroy new Event
  • 如何统计group by返回的组数?

    select count as count from table group by foreign id order by count 这将返回每个外部 ID 的多个匹配项 然而 我正在寻找的是总结结果 所以结果是 10 results g
  • 我需要双向创建 automapper createmap 吗?

    这可能是一个愚蠢的问题 n00b 到 AutoMapper 并且时间很短 我想使用 AutoMapper 从 EF4 实体映射到 ViewModel 类 1 如果我打电话 CreateMap
  • 表单位置位于屏幕右下角

    我正在使用 c WinForm 开发 sman 通知应用程序 我想将主窗体放置在屏幕工作区域的右下角 在多个屏幕的情况下 有没有办法找到最右边的屏幕来放置应用程序 或者至少记住上次使用的屏幕并将表单放置在其右下角 我目前没有多个显示器可供检
  • Python/Matplotlib - 快速更新轴上的文本

    我在 wxpython 窗口中有一个 matplotlib 图 画布 我想在鼠标移动时更新绘图上的一些信息 我已连接到 motion notify event 来获取此信息 在下面的代码中 绘制了大量随机数据 然后在窗口的状态栏中显示光标的