matplotlib 将 x 轴与缩放时自动缩放的 y 轴链接起来

2024-04-26

如何创建一堆具有链接(共享)x 轴的绘图,以便在缩放期间自动缩放所有“从属”绘图的 y 轴?例如:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1)
ax1.plot([0,1])
ax2.plot([2,1])
plt.show()

当我放大 ax1 时,这也会更新 ax2 的 x 轴(到目前为止一切顺利),但我也希望 ax2 的 y 轴根据现在可见的数据范围自动缩放。所有自动缩放设置均已启用(默认情况下)。创建 ax2 后手动设置自动缩放设置没有帮助:

ax2.autoscale(enable=True, axis='y', tight=True)
ax2.autoscale_view(tight=True, scalex=False, scaley=True)

print ax2.get_autoscaley_on()
-> True

我错过了什么?


在研究了 matplotlib 的axes.py 的详细细节之后,似乎没有任何规定可以根据数据视图自动缩放轴,因此没有高级方法来实现我想要的。

然而,有一些“xlim_changed”事件,可以附加一个回调:

import numpy as np

def on_xlim_changed(ax):
    xlim = ax.get_xlim()
    for a in ax.figure.axes:
        # shortcuts: last avoids n**2 behavior when each axis fires event
        if a is ax or len(a.lines) == 0 or getattr(a, 'xlim', None) == xlim:
            continue

        ylim = np.inf, -np.inf
        for l in a.lines:
            x, y = l.get_data()
            # faster, but assumes that x is sorted
            start, stop = np.searchsorted(x, xlim)
            yc = y[max(start-1,0):(stop+1)]
            ylim = min(ylim[0], np.nanmin(yc)), max(ylim[1], np.nanmax(yc))

        # TODO: update limits from Patches, Texts, Collections, ...

        # x axis: emit=False avoids infinite loop
        a.set_xlim(xlim, emit=False)

        # y axis: set dataLim, make sure that autoscale in 'y' is on 
        corners = (xlim[0], ylim[0]), (xlim[1], ylim[1])
        a.dataLim.update_from_data_xy(corners, ignore=True, updatex=False)
        a.autoscale(enable=True, axis='y')
        # cache xlim to mark 'a' as treated
        a.xlim = xlim

for ax in fig.axes:
    ax.callbacks.connect('xlim_changed', on_xlim_changed)

不幸的是,这是一个相当低级的黑客行为,很容易被破坏(除线、反转或对数轴之外的其他对象,...)

似乎不可能挂钩axes.py中的更高级别的功能,因为更高级别的方法不会将emit = False参数转发给set_xlim(),这是避免在set_xlim()和set_xlim()之间进入无限循环所必需的“xlim_changed”回调。

此外,似乎没有统一的方法来确定水平裁剪对象的垂直范围,因此在axes.py中有单独的代码来处理线条、补丁、集合等,这些代码都需要在回调中复制。

无论如何,上面的代码对我有用,因为我的图中只有线条,并且我对ight=True 布局感到满意。看来,只需对axes.py进行一些更改,就可以更优雅地适应这一功能。

Edit:

我错误地认为无法连接到更高级别的自动缩放功能。它只需要一组特定的命令来正确分隔 x 和 y。我更新了代码以在 y 中使用高级自动缩放,这应该使其更加健壮。特别是,tight=False 现在可以工作(毕竟看起来好多了),并且反转/对数轴不应该成为问题。

剩下的一个问题是确定所有类型对象在裁剪到特定 x 范围后的数据限制。此功能实际上应该内置于 matplotlib 中,因为它可能需要渲染器(例如,如果放大得足够远以至于屏幕上仅保留 0 或 1 个点,则上面的代码将会中断)。 Axes.relim() 方法看起来是一个不错的候选者。如果数据已更改,它应该重新计算数据限制,但目前仅处理线和补丁。 Axes.relim() 可能有可选参数,用于指定 x 或 y 中的窗口。

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

matplotlib 将 x 轴与缩放时自动缩放的 y 轴链接起来 的相关文章

随机推荐

  • 在 Mobile Safari 中重用 HTML5 音频对象

    我希望在 iPad 上的 Mobile Safari 中运行的 Web 应用程序上播放一个简短 小于 1 秒 的音频文件 以响应用户输入 同时将事件和音频播放之间的延迟降至最低 在页面重新加载之间可以多次触发播放 因此我想缓存音频文件 以下
  • Django allauth Facebook 本地开发

    我在用着Django allauth https github com pennersr django allauth对于正在开发的网站的 Facebook 身份验证 并进行了相应的设置 在 facebook 的 facebook 应用程序
  • 在 PyGTK 中,显示 PNG 文件的简单方法是什么?

    以下 PyGTK 代码在窗口中显示 PNG 文件 是否有更简单或更好的方式来显示 PNG 文件 例如使用 gtk DrawingArea 例如 如何调整文件大小 import gtk import pygtk pygtk require 2
  • 使用 datashader、holoviews 和 bokeh 进行地理映射时出现问题

    我正在尝试使用全息视图 数据着色器和散景将谷歌手机历史记录位置映射到地图上 大部分与 datashader 网站中给出的示例非常相似 但是当我这样做时 地图叠加不起作用 因为纬度 经度被破坏了 import datashader as ds
  • igraph (R) 中仅在根和终端顶点上添加标签?

    inst2 c 2 3 4 5 6 motherinst2 c 7 8 2 10 11 km c 20 30 40 25 60 df2 data frame inst2 motherinst2 df2 cbind df2 km g2 gra
  • 带有任意 AND 子句的动态 spring data jpa 存储库查询

    我在用着Spring data jpa repositories 需要提供不同字段的搜索功能 搜索前输入字段是可选的 我有 5 个字段EmployeeNumber Name Married Profession and DateOfBirt
  • java中如何销毁进程

    我写了下面的代码 要从 Java 应用程序运行 bat 文件 我使用 process exec 但蝙蝠有时可能会挂起 所以我需要为此过程设置一个超时 我启动一个新线程并在线程中新建一个进程 我在线程中设置超时 并在超时时杀死线程 但我发现超
  • 在 React 组件中使用绝对路径

    如何使用根目录中的绝对路径并更改根目录来导入组件 import Modal from project app src Components Modal import Main from Constants 我想要将根目录更改为我可以从 sr
  • 如何通过更新和多重选择将多个输入构建到我闪亮的应用程序中?

    我正在构建一个flex dashboard shiny应用程序与datatable并尝试建立两个输入作为此选择datatable每个选项都有一个 全部 选项 第一个问题是如何限制第二个选择 user 通过选择第一选择 team 然后 使用这
  • Javascript 生成器:理解它们

    我很确定我对生成器的理解本质上是被破坏的 所有在线资源似乎都是冲突的 这导致了极其困难和令人困惑的学习体验 据我了解 yield关键字使当前正在执行的代码块能够等待一个值而不是抛出要在回调内执行的剩余代码 因此 正如大多数教程所指出的 您可
  • URI/URL 和 String 有什么区别?

    这是出于好奇 不需要代码 我尝试使用世界上最好的搜索引擎来获取答案 但没有发现任何有价值的东西 有什么区别URI URL以及表示该 URI URL 的字符串 为什么我们必须解析它 将字符串解析成什么URI URL对字符串进行不同的处理 为什
  • 为什么 Mocha 测试用例应该是无状态的?

    这是一个常见的建议 即Mocha 测试用例不应共享状态 鉴于 Mochas 测试用例执行的强烈顺序性 我真的不理解这个建议 还有更多 我认为这很可疑 如果测试用例 即使是异步测试用例 严格地一个接一个地执行 则不存在时间竞争问题或其他不可预
  • 因登录失败 3 次而禁用帐户 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 嵌套 svn 存储库

    我在存储库中有一个 项目 A 但在该项目中 我使用了一个托管在 Google Code 上的库 我的问题是 有什么办法可以让该库文件 挂钩 到 Google Code SVN 同时将我的项目放在我的存储库中 它是该库的父级 这样我就可以在决
  • 玉服务器端传递的变量在浏览器中为空

    我有一个奇怪的问题 即传递给 jade 的变量在浏览器中为空 似乎传递的变量为空 但事实并非如此 Nodejs代码 整个路由代码 exports sensorsettings function req res if req session
  • SQL Server 的国家/地区、州列表 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您好 在一个应用程序中 我需要列出世界上的所有国家 我们选择一个国家 则应列出与其对应的所有州 如果我选
  • 如何使用从后端检索的字符串作为Angular2中的模板?

    在 Angular2 应用程序中 我想使用 ajax 从后端检索 html 标签字符串并将其用作 Angular2 中的模板 The str I get from server by ajax is var str
  • 将绘图对象存储在列表中

    I asked this https stackoverflow com questions 1816480 generating names iteratively in r for storing plots昨天关于在对象中存储绘图的问
  • .Net 中的舍入数字到下一个 0.25 [重复]

    这个问题在这里已经有答案了 如何将小数向上 而不是向下 舍入为 0 25 1 26 gt 1 50 1 45 gt 1 50 1 15 gt 1 25 1 00 gt 1 00 1 55 gt 1 75 1 77 gt 2 00 我尝试过以
  • matplotlib 将 x 轴与缩放时自动缩放的 y 轴链接起来

    如何创建一堆具有链接 共享 x 轴的绘图 以便在缩放期间自动缩放所有 从属 绘图的 y 轴 例如 import matplotlib pyplot as plt fig plt figure ax1 fig add subplot 211