防止 matplotlib 有状态

2023-11-21

如果我创建一个Axes对象在matplotlib并改变它(即通过绘制一些数据),然后我调用一个函数没有通过我的Axes反对该函数那么这个函数仍然可以改变我的Axes。例如:

import matplotlib.pyplot as plt
import numpy as np

def innocent_looking_function():
    #let's draw a red line on some unsuspecting Axes!
    plt.plot(100*np.random.rand(20), color='r')

fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20), color='b') #draw blue line on ax
#ax now has a blue line, as expected

innocent_looking_function()
#ax now unexpectedly has a blue line and a red line!

我的问题是:我可以阻止这种全局变量行为吗?我知道我可以打电话plt.close()在致电任何人之前innocent_looking_function()但有什么方法可以使其成为默认值吗?


当然!你需要做的是绕过pyplot当你制作图形时完全是状态机。

它更详细,因为你不能直接调用fig = plt.figure().


首先,让我解释一下如何plt.gca() or plt.gcf()作品。当使用pyplot接口,matplotlib 存储所有已创建但未显示的图形管理器。图形管理器基本上是图形的 GUI 包装器。

plt._pylab_helpers.Gcf是存储图窗管理器并跟踪当前处于活动状态的单例对象。plt.gcf()返回活动数字_pylab_helpers.Gcf. Each Figure对象跟踪它自己的轴,所以plt.gca()只是plt.gcf().gca().

通常,当您拨打电话时plt.figure(), it:

  1. 创建返回的图形对象
  2. 创建一个FigureManager对于该数字使用适当的后端
  3. 图形管理器创建一个FigureCanvas、GUI 窗口(根据需要)和NavigationToolbar2(缩放按钮等)
  4. 然后将图形管理器实例添加到_pylab_helpers.Gcf的数字列表。

这是我们想要绕过的最后一步。


这是一个使用非交互式后端的简单示例。请注意,因为我们不担心与绘图交互,所以我们可以跳过整个图形管理器,只创建一个Figure and FigureCanvas实例。 (从技术上讲,我们可以跳过FigureCanvas,但是当我们想要将绘图保存到图像等时就需要它。)

import matplotlib.backends.backend_agg as backend
from matplotlib.figure import Figure

# The pylab figure manager will be bypassed in this instance. `plt.gca()`
# can't access the axes created here.
fig = Figure()
canvas = backend.FigureCanvas(fig)
ax = fig.add_subplot(111)

只是为了证明这一点gca看不到这个轴:

import matplotlib.pyplot as plt
import matplotlib.backends.backend_agg as backend
from matplotlib.figure import Figure

# Independent figure/axes
fig = Figure()
canvas = backend.FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot(range(10))

# gca() is completely unaware of this axes and will create a new one instead:
ax2 = plt.gca()
print 'Same axes?:', id(ax) == id(ax2)

# And `plt.show()` would show the blank axes of `ax2`

有了交互式支持,事情就变得更加复杂了。你不能打电话plt.show(),所以你需要自己启动gui的主循环。您可以“从头开始”完成这一切(请参阅任何“嵌入 matplotlib”示例),但是FigureManager抽象出支持的特定部分:

作为使用 TkAgg 后端的示例:

import matplotlib.backends.backend_tkagg as backend
from matplotlib.figure import Figure

fig = Figure()
ax = fig.add_subplot(111)

manager = backend.new_figure_manager_given_figure(1, fig)
manager.show()
backend.show.mainloop()

要使用其他后端之一,只需更改后端导入即可。例如,对于 Qt4:

import matplotlib.backends.backend_qt4agg as backend
from matplotlib.figure import Figure

fig = Figure()
ax = fig.add_subplot(111)

manager = backend.new_figure_manager_given_figure(1, fig)
manager.show()
backend.show.mainloop()

这实际上甚至适用于nbaggIPython 笔记本中使用的后端。只需将后端导入更改为import matplotlib.backends.backend_nbagg as backend

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

防止 matplotlib 有状态 的相关文章

随机推荐

  • JQuery ajax 调用 httpget webmethod (c#) 不起作用

    我试图让 ajax 访问后面代码中的 webmethod 问题是我不断从 jQuery 收到错误 parserror onfail method 如果我将 GET 更改为 POST 一切正常 请参阅下面我的代码 阿贾克斯调用
  • 有reactive-banana-gtk吗?

    我找到了reactive banana wax 想知道是否还有一个类似的gtk包 因为reactive香蕉应该支持gtk 根据http www haskell org haskellwiki Reactive banana The reac
  • 用于诊断 .NET 中内存泄漏的工具(ASP.NET 应用程序)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我们需要一个工具来轻松检测 ASP NET 应用程序中的内存泄漏 我们有一个应用程序 它消耗大量内存 Thanks Using WinDbg不像使用
  • Thread.CurrentPrincipal.Identity vs HttpContext.User.Identity [重复]

    这个问题在这里已经有答案了 可能的重复 http context user 和 thread currentprincipal 之间的区别以及何时使用它们 这两者在 ASP NET 应用程序中有何区别 我知道HttpContext User
  • 如何将 CSS 用于 Vaadin 组件?

    我似乎看到了一些例子 人们回答了如何通过添加 CSS 代码从组件中获取某些特定行为的问题 但是似乎没有人解释如何使用该 CSS 代码将其连接到 Java 组件 v table body overflow hidden important 例
  • 一个目录中的多个 Git 存储库

    我想将一个目录部署给具有不同权限的多个开发人员 所以这是 Git 无法做到的一件事 如何在一个目录中创建两个存储库 并通过使用排除由另一个存储库管理的文件来为它们分配不同的文件列表 gitignore file 例子 www project
  • MySQL“NOT IN”查询3个表

    我有 3 个表格课程 成绩和评估 我想比较两个表的等级和评价 如果表等级中的数据在表评价中不存在 则该数据会出现 输出 select Grade ID Courses Course ID Courses Grade NAME Course
  • 如何使用 6 个按钮(如 Windows 磁贴)创建布局

    我正在尝试创建一个包含 6 个按钮的布局 可以像 Windows Phone 的平铺一样自动适应屏幕尺寸 在代码中 我动态创建了 6 个按钮 2 个用于行 但按钮应该适合填充后者的屏幕大小 我该如何继续
  • 在动态分配的二维数组上使用 realloc() 是个好主意吗?

    我主要对它的可行性感兴趣缩小这样的数组 我正在开发一个项目 其中我使用单个 malloc 调用来每个创建单独的中等大小的二维数组 每个阵列最多只有几十 MiB 问题是 在其中一个阵列的生命周期内 其内容的大小会急剧缩小 减少一半以上 显然
  • 了解合并排序优化:避免复制

    我在算法书中有下面的合并排序程序 其中提到主要问题是合并两个排序列表需要线性额外内存 并且在整个算法中复制到临时数组并返回所花费的额外工作会减慢速度大幅下降 通过在递归的交替级别明智地切换 a 和 tmp array 的角色可以避免这种复制
  • NVD3.js:ReferenceError:nv 未定义

    我正在使用 NVD3 js 库来生成图形 我尝试向其中添加折线图并收到上述错误 如何解决呢 我正在尝试这个here 实际上我发现问题出在文件夹结构上 Angular nvd3 网站附带的示例给出了路径 Bower components nv
  • Bootstrap 3 - 连续使用超过 12 列

    我遇到了一种情况 要求我不要限制一行中的列数 因为可能会将多个内容块从管理中的位置添加到该区域 默认情况下 BS3 的行为告诉 12 列 div 不要浮动 这会导致它们越过较小的浮动 div 的顶部 因此 我为我的系统编写了一个覆盖作为一个
  • 为什么我不能覆盖 `Array` 的原型 (`Array.prototype`)?

    我设定的原型是Array作为一个例子my 我认为book aa将显示 aa 但它显示 undefined 为什么 谢谢 h2 Array Properties h2
  • Keycloak:无法在 Spring Boot 应用程序中加载 URL

    我目前正在尝试开发一个使用 keycloak 保护的 Spring Boot Rest Api 当我尝试调用必须识别用户的 api 时 出现错误 错误信息如下 2020 04 10 16 09 00 324 WARN 44525 nio 8
  • XmlSerializer 可以反序列化为 Nullable 吗?

    这是重复的XmlSerializer 可以反序列化为 Nullable 吗 但我需要一个既不更改 xml 文档也不强迫我实现 IXmlSerialized 接口的解决方案 我不想实现 IXmlSerialized 因为旁边还有许多其他元素
  • jquery insertafter和insertbefore添加滑动动画

    如何为上下排序运动添加动画移动效果 您可以通过单击 向上 和 向下 文本链接来检查运动情况 这是我的代码 document ready function move up click function if this prev this pa
  • 当输入字段为空时显示 ng-repeat 列表时,AngularJS 过滤器比较器为 true

    我将通过这个示例小提琴来演示如何使用比较器参数来过滤精确匹配 http jsfiddle net api post library pure 优先级是 1 100 之间的数字 但我将其作为文本输入并作为字符串过滤 因此 任何包含子字符串的数
  • std::map::begin() 之前的 STL 迭代器

    在 C 11 中std map 是否有一些有效的迭代器x这样 x保证等于map begin 我想检测我刚刚调用的函数 我的 是否已将迭代器从函数的前面移走 该函数会将迭代器向后移动一位 这个答案适用于图书馆的其他部分吗 不 迭代器位于开头之
  • 仅在本地编辑跨域 Iframe 内容

    正如我们许多人所知 由于以下原因 无法编辑跨域 IFrame 同源政策 如果我们仅在本地使用时尚扩展等 有没有办法解决这个问题 以在 iframe 内启动的视频为例 我需要简单地添加 zoom 2 到 video21588864 ifram
  • 防止 matplotlib 有状态

    如果我创建一个Axes对象在matplotlib并改变它 即通过绘制一些数据 然后我调用一个函数没有通过我的Axes反对该函数那么这个函数仍然可以改变我的Axes 例如 import matplotlib pyplot as plt imp