如何将 AxesImage 中的坐标映射到保存的图像文件中的坐标?

2024-01-09

I use 绘图库 http://matplotlib.sourceforge.net/要将数字矩阵显示为图像,请沿轴附加标签,然后将绘图保存到 PNG 文件。为了创建 HTML 图像映射,我需要知道 imshow 显示的图像中某个区域的 PNG 文件中的像素坐标。

我已经发现一个例子 http://hackmap.blogspot.com/2008/06/pylab-matplotlib-imagemap.html如何使用常规绘图执行此操作,但是当我尝试使用 imshow 执行相同操作时,映射不正确。这是我的代码,它保存图像并尝试打印对角线上每个正方形中心的像素坐标:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
axim = ax.imshow(np.random.random((27,27)), interpolation='nearest')
for x, y in  axim.get_transform().transform(zip(range(28), range(28))):
    print int(x), int(fig.get_figheight() * fig.get_dpi() - y)
plt.savefig('foo.png', dpi=fig.get_dpi())

下面是生成的 foo.png,以屏幕截图形式显示,以便包含标尺:

脚本的输出开始和结束如下:

73 55
92 69
111 83
130 97
149 112
…
509 382
528 396
547 410
566 424
585 439

正如您所看到的,y 坐标是正确的,但 x 坐标被拉伸:它们的范围从 73 到 585,而不是预期的 135 到 506,并且它们的间距为 19 个像素。而不是预期的 14.我做错了什么?


这是尝试从 matplotlib 获取精确像素值时最令人困惑的部分之一。 Matplotlib 将处理精确像素值的渲染器与绘制图形和轴的画布分开。

基本上,最初创建图窗(但尚未显示)时存在的渲染器不一定与显示图窗或将其保存到文件时使用的渲染器相同。

您所做的事情是正确的,但它使用的是初始渲染器,而不是保存图形时使用的渲染器。

为了说明这一点,下面是代码的稍微简化的版本:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

for i in range(28):
    x, y =  ax.transData.transform_point([i,i])
    print '%i, %i' % (x, fig.bbox.height - y)

fig.savefig('foo.png', dpi=fig.dpi)

这会产生与上面类似的结果:(差异是由于您的机器和我的机器之间的渲染后端不同所致)

89, 55
107, 69
125, 83
...
548, 410
566, 424
585, 439

但是,如果我们做完全相同的事情,但在显示坐标之前绘制图形,我们就会得到正确的答案!

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

fig.canvas.draw()

for i in range(28):
    x, y =  ax.transData.transform_point([i,i])
    print '%i, %i' % (x, fig.bbox.height - y)

fig.savefig('foo.png', dpi=fig.dpi)

得出:(请记住,图形的边缘位于<-0.5, -0.5>在数据坐标中,不是<0, 0>。 (即绘制图像的坐标以像素为中心)这就是为什么<0, 0> yields 143, 55, 并不是135, 48)

143, 55
157, 69
171, 83
...
498, 410
512, 424
527, 439

当然,绘制图形只是为了在保存时再次绘制它是多余的并且计算量大。

为了避免绘制两次,您可以将回调函数连接到绘制事件,并在该函数内输出 HTML 图像映射。举个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

def print_pixel_coords(event):
    fig = event.canvas.figure
    ax = fig.axes[0] # I'm assuming there's only one subplot here...
    for i in range(28):
        x, y = ax.transData.transform_point([i,i])
        print '%i, %i' % (x, fig.bbox.height - y)

fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(np.random.random((27,27)), interpolation='nearest')

fig.canvas.mpl_connect('draw_event', print_pixel_coords)

fig.savefig('foo.png', dpi=fig.dpi)

这会产生正确的输出,而在保存时只绘制一次图形:

143, 55
157, 69
171, 83
...
498, 410
512, 424
527, 439

另一个优点是您可以在调用中使用任何 dpifig.savefig无需手动设置fig预先指定对象的 dpi。因此,在使用回调函数时,你可以这样做fig.savefig('foo.png'), (or fig.savefig('foo.png', dpi=whatever)),您将获得与保存的 .png 文件匹配的输出。 (保存图形时的默认 dpi 为 100,而图形对象的默认 dpi 为 80,这就是为什么您必须将 dpi 指定为与fig.dpi首先)

希望这至少有点清楚!

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

如何将 AxesImage 中的坐标映射到保存的图像文件中的坐标? 的相关文章

  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • 字典的嵌套列表

    我正在尝试创建dict通过嵌套list groups Group1 A B Group2 C D L y x 0 for y in x if y x 0 for x in groups d k v for d in L for k v in
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们

随机推荐

  • QLPreviewController 隐藏底部工具栏

    I use QLPreviewController在我的应用程序中 想要隐藏底部工具栏 该工具栏允许在其数据源项目中移动 有可能以某种方式做吗 我尝试将其搜索为subview of QLPreviewController s view但它只
  • 如何捕获 TDataModule.OnCreate 事件中的异常?

    我在 Delphi 中遇到了以下问题try except block 我有一个简单的应用程序 一个名为 MainFormfr MAIN和一个TDataModule named DM DM不是自动创建的 而是在运行时创建的fr MAIN s
  • 如何在 Rails 4 中重新加载路线 /config/routes/* ?

    如何强制rails 4重新加载所有路线文件 也就是说 无需重新启动应用程序即可从 config routes 创建路由 rb 已加载 我在 config routes 中将它们分开 rb 但是这些 config routes 文件不会重新加
  • Azure Blob - 503 出口超出帐户限制

    所以我偶尔会收到这个错误 初始化流读取器时出错或未找到 Blob 响应状态 代码不表示成功 503 出口超过该帐户 限制 我不知道帐户限制 并且文件不应大到足以突破吞吐量限制 Blob 存储具有一些令人惊讶的高吞吐量限制 有谁见过这个并知道
  • X11 为什么我无法绘制任何文字?

    我正在努力学习X11 这对我来说非常困难 因为我没有 Linux 上的窗口应用程序的经验 我写了一些简单的代码 但无法解决这个不可见的文本问题 一切可能都工作正常 当我尝试使用 DrawRectangle 函数绘制矩形时 它正在工作 这是代
  • 仅将对话中的最新回复复制到剪贴板

    我有以下 Outlook VBA 代码 可将所选电子邮件的正文复制到 Windows 剪贴板 Sub CopyMailToClipboard On Error GoTo HandleErr Copies the selected messa
  • PHP继承和MySQL

    所以我尝试在 PHP 中采用良好的面向对象编程技术 我的大多数 阅读全部 项目都涉及 MySQL 数据库 我眼前的问题涉及我需要开发的用户模型 我当前的项目有代理和潜在客户 代理和潜在客户都是拥有许多相同信息的用户 因此 显然 我想要一个
  • 通过 Opengl 和 GLUT 在 Haskell 中编程

    每次我尝试编译并运行我找到的教程时 都会收到一条消息 提示 找不到模块 GL 或 找不到模块 GLUT 我尝试用 import Graphics Rendering OpenGL 和 import Graphics UI GLUT 替换 i
  • 无法加载 SqlServerSpatial.dll

    我正在尝试在 C Net 项目中使用 Sql Server Spatial CLR 类型 我想使用 Sql Geometry 从数据库中查询空间记录 我在本地计算机上运行 Visual Studio 2010 中运行的单元测试 并访问远程
  • PHP 是否有检测其运行操作系统的功能?

    我不知道在 PHP 数据库中使用什么关键字查找此内容 所以我在这里询问 我想知道的原因是不同的操作系统如何处理文本文档中的新行 我在 Windows 中使用 CSV 文件 但每次我想添加新行时 实际发生的情况是新行被粘贴到最新行的后面 原因
  • Bing 地图 V8 API 中不再有鸟瞰图吗?

    V8 中似乎不再提供鸟瞰图 谁能确认一下事实确实如此 或者是否有任何方法在新版本中仍然使用鸟瞰图 微软关于这方面的文档非常糟糕 所以我只是从各种来源拼凑信息 例如 1 在他们的MapTypeId 枚举 https msdn microsof
  • python字典中有多个键,可能吗?

    我想用 python 构建一个字典 其中不同的键引用相同的元素 我有这本词典 persons George G MacDonald Luke G MacDonald Larry G MacDonald 键全部引用相同的字符串 但字符串在程序
  • 将 Brownfield PHP Web 应用程序转换为 Zend Framework

    我们正在考虑将 PHP Web 应用程序从不使用框架 这会害死我们 转变为使用 Zend 框架 由于应用程序的规模 我认为从头开始对于管理来说不是一个可行的选择 因此我想开始研究如何慢慢地将当前站点结构转换为使用 Zend Framewor
  • 在 MapKit 中沿着弧线对视觉元素进行动画处理

    如何沿着我创建的圆弧添加视觉元素并为其设置动画地图套件内 下面的代码将在两点之间创建一个漂亮的圆弧 想象一个动画视觉效果 代表一架飞机沿着这条弧线飞行 void addArc CLLocationCoordinate2D sanFranci
  • 如何在postgresql中为regexp_matches创建索引?

    我有一张桌子product product id desciption 322919 text add 185 add text 322920 text add 184 add text add 185 add text 322921 te
  • 通过将两个系列相乘来创建 pandas 中的数据框

    假设我在 pandas 中有两个系列 系列 A 和系列 B 如何创建一个数据框 其中所有这些值相乘 即系列 A 位于左侧 系列 B 位于顶部 基本上与此相同的概念 其中系列 A 是左侧的黄色 系列 B 是顶部的黄色 并且中间的所有值都将通过
  • 为phonegap构建闪屏的横向和纵向图像?

    我想知道是否可以在 PhoneGap 构建应用程序中为启动屏幕提供 2 个单独的图像 一张用于肖像 一张用于风景 目前 当我打开应用程序时 它会显示启动屏幕 如果我更改方向 它会像素化 我现在已经在 config xml 文件中得到了这个
  • python 根据元组第一个值求和元组列表

    假设我有以下列表元组 myList 0 2 1 3 2 4 0 5 1 6 我想根据相同的第一个元组值对该列表求和 n m n k m l m z m k l z For myList sum 2 5 3 6 28 我怎样才能得到这个 您可
  • 如何设置 iTunes 中歌曲的声音本地通知?

    我尝试创建闹钟应用程序 但我不知道如何将 iTunes 中的歌曲设置为本地通知的声音 现在我使用此代码来调用 iTunes void tableView UITableView tableView didSelectRowAtIndexPa
  • 如何将 AxesImage 中的坐标映射到保存的图像文件中的坐标?

    I use 绘图库 http matplotlib sourceforge net 要将数字矩阵显示为图像 请沿轴附加标签 然后将绘图保存到 PNG 文件 为了创建 HTML 图像映射 我需要知道 imshow 显示的图像中某个区域的 PN