如何在Python脚本运行时操作图形?

2023-11-25

介绍

因为我来自matlab,我习惯了交互式界面,其中脚本可以在运行时更新图形。在处理过程中,每个图形都可以调整大小甚至关闭。这可能意味着每个图形都在自己的线程中运行,这显然不是这样的绘图库.

IPython可以使用magic命令模仿Matlab行为%pylab or %matplotlib它做了一些我还不明白的事情,这正是我问题的重点。

我的目标是允许独立的 Python 脚本像 Matlab 一样工作(或者像 IPython 一样工作)%matplotlib做)。换句话说,我希望从命令行执行该脚本。我期待每 3 秒弹出一个新的数字。在执行过程中,我可以缩放、调整大小甚至关闭图形。

#!/usr/bin/python
import matplotlib.pyplot as plt
import time

def do_some_work(): 
    time.sleep(3)

for i in range(10):
    plt.plot([1,2,3,4])
    plt.show() # this is way too boilerplate, I'd like to avoid it too. 
    do_some_work()

有什么替代方案%matplotlib当脚本在 Python(不是 IPython)中运行时,我可以用来操作数字吗?

我已经研究过哪些解决方案?

我目前找到了 3 种获得情节展示的方法。

1. %pylab / %matplotlib

As tom说,使用%pylab应避免,以防止名称空间被污染。

>>> %pylab
>>> plot([1,2,3,4])

这个解决方案很贴心,剧情无阻塞,不需要额外的show(),我仍然可以添加一个网格grid()之后,我可以关闭、调整或缩放我的图形,而不会出现其他问题。

不幸的是%matplotlib命令仅在 IPython 上可用。

2. from pylab import * or from matplotlib.pyplot import plt

>>> from pylab import *
>>> plot([1,2,3,4])

这里的情况完全不同。我需要添加命令show()显示我被阻挡的图形。除了关闭图形以执行下一个命令之外,我无能为力,例如grid()由于该图现已关闭,因此不会产生任何影响......

** 3. from pylab import * or from matplotlib.pyplot import plt + ion()** 一些建议建议使用ion()命令如下:

>>> from pylab import *
>>> ion()
>>> plot([1,2,3,4])
>>> draw()
>>> pause(0.0001)

不幸的是,即使绘图显示,我也无法手动关闭该图。我需要执行close()在终端上,这不是很方便。此外还需要两个额外的命令,例如draw(); pause(0.0001)不是我所期待的。

Summary

With %pylab,一切都很棒,但我无法在 IPython 之外使用它

With from pylab import *随后是一个plot,我遇到了阻塞行为,IPython 的所有功能都被浪费了。

from pylab import *其次是ion提供了一个很好的替代前一个的方法,但我必须使用奇怪的pause(0.0001)命令导致我无法手动关闭窗口(我知道pause某些后端不需要。我在用WxAgg这是唯一一个效果很好的Cygwin x64.

This question使用建议matplotlib.interactive(True)。不幸的是,它不起作用并给出与以下相同的行为ion() does.


改变你的do_some_work函数如下,它应该可以工作。

def do_some_work(): 
    plt.pause(3)

对于交互式后端plt.pause(3)启动事件循环 3 秒,以便它可以处理您的调整大小事件。注意文档说这是一个实验性功能,对于复杂的动画,您应该使用动画模块.

The, %pylab and %matplotlib魔法命令还会启动事件循环,这就是用户可以与绘图进行交互的原因。或者,您可以使用以下命令启动事件循环%gui wx,然后将其关闭%gui。您可以使用IPython.lib.guisupport.is_event_loop_running_wx()函数来测试它是否正在运行。

使用理由ion() or ioff()中得到了很好的解释‘什么是交互模式’页。原则上,无需 IPython 即可进行用户交互。但是,我无法从该页面获取交互式示例来使用Qt4Agg后端,仅与MacOSX后端(在我的 Mac 上)。我没有尝试过WX后端。

Edit

我确实设法通过使用 PyQt4 而不是 PySide 让交互式示例与 Qt4Agg 后端一起使用(因此通过设置backend.qt4 : PyQt4 in my ~/.config/matplotlibrc文件)。我认为该示例并不适用于所有后端。我提交了一个问题here.

Edit 2

恐怕我想不出一种在运行长时间计算时操作图形而不使用线程的方法。正如您所提到的:Matplotlib 不会启动线程,IPython 也不会。 %pylab 和 %matplotlib 命令在处理读取-评估-打印循环中的命令和让 GUI 短时间处理事件之间交替。他们按顺序执行此操作。

事实上,即使使用 %matplotlib 或 %pylab 魔法,我也无法重现您的行为。 (需要明确的是:在ipython我首先打电话%matplotlib进而%run yourscript.py)。 %matplotlib 魔法将 Matplotlib 置于交互模式,这使得plt.show()调用非阻塞以便do_some_work函数立即执行。然而,在此期间time.sleep(3)打电话时,人物没有反应(如果我增加睡眠时间,这种情况会变得更加明显)。我不明白这对你来说是如何运作的。

除非我错了,否则你必须将计算分解为较小的部分并使用plt.pause(或者更好的是动画模块)来更新人物。

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

如何在Python脚本运行时操作图形? 的相关文章

随机推荐

  • 使用公制前缀格式化数字? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的工程符号 无论是公制前缀优于科学计数法可能有争议 但我认为它有其物理单位的用例 我环顾四周 但似乎 NET 没有内置类似的东西 还是我弄错了 任何实现这一目标的方法都可以 澄清一下 目标是将任
  • Linux下virtualenv中安装wxPython

    我正在尝试在 virtualenv 中设置一个 wxpython 正如许多地方所详述的 easy install pip install 不起作用 因为 setup py 不存在 我看到了有关如何在 Mac 上设置它的说明 但没有找到适用于
  • Bootstrap 3 Glyphicons CDN

    注意 Bootstrap 图标又回来了 after 这个拉取请求合并 经过过去几周的反复思考 我决定将 Glyphicons 图标字体恢复到主存储库 考虑到图标在 UI 中的流行程度 如果不将它们 或其他一些图标字体 包含在与 CSS 和
  • Javafx旋转标签问题

    当我尝试将标签旋转 270 度时遇到问题label setRotate 270 但标签文字消失 这就是代码示例 LineChart chart new LineChart new CategoryAxis new NumberAxis ch
  • Visual Studio 自动格式损坏

    我在 Windows 7 Build 7100 32 位上运行 Visual Studio 2008 sp1 我以前从未遇到过这个问题 即使是在不同的 Windows 7 RC 安装上也是如此 当我用 结束一个语句时或 或其他东西 通常VS
  • Visual Basic,如何读取数据网格中的每一行?

    我有一个名为 DataGridView1 的数据网格 A 列包含名称 B 列包含文件路径 如何为每一行运行一些代码 以这种方式遍历数据网格的正确术语是什么 我需要的示例 For each row in DataGridView1 Messa
  • 如何对因素水平进行分组?

    我有一个包含足球位置缩写的因子列 大约有 17 个唯一值和 220 个观察值 我只想拥有包含 17 个唯一值的三个因子级别 levels nfldraft Pos lt list Linemen c C OG OT TE DT DE Sma
  • 如何将 Twitter Bootstrap 工具提示绑定到动态创建的元素?

    我正在使用带有 JavaScript 的 Twitter 引导工具提示 如下所示 a rel tooltip tooltip 我的标记如下所示 a title Not implemented class btn i class icon f
  • 如何使用 Playground 在 Swift 中读取数据并将其写入文本文件? [复制]

    这个问题在这里已经有答案了 我通读了这些SO链接来寻找答案 1 在 Swift 中逐行读取文件 URL 2 从文本文件中读取和写入数据 链接 2 为我提供了解决方案 但问题是目录 默认是当前项目的Document目录 所以如果我想从中读取文
  • XCode 6.3 警告:“myObject”地址不等于空指针的比较始终为 true

    更新到 XCode 6 3 后 编译器开始发出此警告 Comparison of address of myObject not equal to null pointer is always true 这是我的一段代码 挠头 但没有找到任
  • 为什么 quarto 的 pdf 输出中没有显示从属关系?

    In the yaml of a quarto我有的文件 title Hey author name Birdy Bird affiliations University of Birds University of Hummingbird
  • 用于在 iOS 中扫描条形码(代码 39 格式)的免费 SDK [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想使用 iphone ipad 的相机扫描 Code 39 格式的 VIN 条形码 我尝试了 zxing 和 zbar 但它们效果不佳 大多数时候
  • 应用程序未显示在最近使用的应用程序列表中

    每当我将以下代码放入活动的清单条目中时 我的应用程序永远不会显示在 最近使用的应用程序 列表中
  • 在 OS X 上调试 MacPorts GCC 的问题

    对于使用 GCC 4 7 MacPorts 构建编译的程序 我似乎无法获得可读的调试输出 我尝试过 GDB 6 3 和 GDB 7 3 每个都有自己的问题 尝试使用 GDB 7 3 MacPorts 使用 GDB 7 3 我在启动时得到以下
  • Spark - 读取带有引号的 csv 文件

    我有一个 CSV 文件 其中的数据包含在双引号 中 0001 A 001 2017 01 01 12 0001 B 002 2017 01 01 13 我只想读取纯数据 没有 符号 spark read option encoding en
  • Android Room 一对多关系

    我正在尝试建立一对多关系 我在线检查了各种文章和教程 但所有示例都显示一个表与另一个表具有一对多关系 在我的要求中 我有两个表与另一个表具有一对多关系 检查下图 学生表有来自班级和学校表的 FK 大多数示例通过班级 学生或学校 学生解释一对
  • 此表单不安全自动填充仅在 Chrome 中关闭

    I get this error when trying to fill the form from chrome in my website 这是我提交表格后的结果 这种情况在任何其他浏览器中都不会发生 我需要做什么才能确保表单安全 我已
  • glDrawArrays 与 glDrawElements

    好吧 我仍然在努力让它发挥作用 我的代码的重要部分是 def init self vertices normals triangles self bufferVertices glGenBuffersARB 1 glBindBufferAR
  • Android:跟踪鼠标指针移动

    假设我使用通用鼠标 是否可以在android中跟踪鼠标指针的X和Y坐标 你需要一个OnGenericMotionListener OnGenericMotion MotionEvent me if me getToolType 0 Moti
  • 如何在Python脚本运行时操作图形?

    介绍 因为我来自matlab 我习惯了交互式界面 其中脚本可以在运行时更新图形 在处理过程中 每个图形都可以调整大小甚至关闭 这可能意味着每个图形都在自己的线程中运行 这显然不是这样的绘图库 IPython可以使用magic命令模仿Matl