matplotlib从起点出发(14)_Tutorial_imshow_origin_extent

0 总述

imshow()允许你将图像(将进行颜色映射——基于norm和cmap——的2D数组或将按原样使用的3D RGB(A)的数组)渲染到数据空间中的矩形区域。最终渲染中图像的方向由原点和范围关键字参数(以及生成的AxesImage实例上的属性)和Axes的数据限制控制。

extent关键字参数控制数据坐标中的边界框,图像将填充该边界框在数据坐标中指定为(左、右、上、下),origin关键字参数控制图像填充该边界框的方式,最终渲染图像中的方向也受Axes限制的影响。

提示
下面的大部分代码用于向绘图添加标签和信息文本,所描述的原点和范围的影响可以在图中看到,而无需遵循所有的代码细节。
为了快速理解,你可能希望跳过下面的代码详细信息,直接继续讨论结果。

import matplotlib.pyplot as plt
import numpy as npfrom matplotlib.gridspec import GridSpecdef index_to_coordinate(index, extent, origin):"""Return the pixel center of an index."""left, right, bottom, top = extenthshift = 0.5 * np.sign(right - left)left, right = left + hshift, right - hshiftvshift = 0.5 * np.sign(top - bottom)bottom, top = bottom + vshift, top - vshiftif origin == 'upper':bottom, top = top, bottomreturn {"[0, 0]": (left, bottom),"[M', 0]": (left, top),"[0, N']": (right, bottom),"[M', N']": (right, top),}[index]def get_index_label_pos(index, extent, origin, inverted_xindex):"""Return the desired position and horizontal alignment of an index label."""if extent is None:extent = lookup_extent(origin)left, right, bottom, top = extentx, y = index_to_coordinate(index, extent, origin)is_x0 = index[-2:] == "0]"halign = 'left' if is_x0 ^ inverted_xindex else 'right'hshift = 0.5 * np.sign(left - right)x += hshift * (1 if is_x0 else -1)return x, y, haligndef get_color(index, data, cmap):"""Return the data color of an index."""val = {"[0, 0]": data[0, 0],"[0, N']": data[0, -1],"[M', 0]": data[-1, 0],"[M', N']": data[-1, -1],}[index]return cmap(val / data.max())def lookup_extent(origin):"""Return extent for label positioning when not given explicitly."""if origin == 'lower':return (-0.5, 6.5, -0.5, 5.5)else:return (-0.5, 6.5, 5.5, -0.5)def set_extent_None_text(ax):ax.text(3, 2.5, 'equals\nextent=None', size='large',ha='center', va='center', color='w')def plot_imshow_with_labels(ax, data, extent, origin, xlim, ylim):"""Actually run ``imshow()`` and add extent and index labels."""im = ax.imshow(data, origin=origin, extent=extent)# extent labels (left, right, bottom, top)left, right, bottom, top = im.get_extent()if xlim is None or top > bottom:upper_string, lower_string = 'top', 'bottom'else:upper_string, lower_string = 'bottom', 'top'if ylim is None or left < right:port_string, starboard_string = 'left', 'right'inverted_xindex = Falseelse:port_string, starboard_string = 'right', 'left'inverted_xindex = Truebbox_kwargs = {'fc': 'w', 'alpha': .75, 'boxstyle': "round4"}ann_kwargs = {'xycoords': 'axes fraction','textcoords': 'offset points','bbox': bbox_kwargs}ax.annotate(upper_string, xy=(.5, 1), xytext=(0, -1),ha='center', va='top', **ann_kwargs)ax.annotate(lower_string, xy=(.5, 0), xytext=(0, 1),ha='center', va='bottom', **ann_kwargs)ax.annotate(port_string, xy=(0, .5), xytext=(1, 0),ha='left', va='center', rotation=90,**ann_kwargs)ax.annotate(starboard_string, xy=(1, .5), xytext=(-1, 0),ha='right', va='center', rotation=-90,**ann_kwargs)ax.set_title(f'origin: {origin}')# index labelsfor index in ["[0, 0]", "[0, N']", "[M', 0]", "[M', N']"]:tx, ty, halign = get_index_label_pos(index, extent, origin,inverted_xindex)facecolor = get_color(index, data, im.get_cmap())ax.text(tx, ty, index, color='white', ha=halign, va='center',bbox={'boxstyle': 'square', 'facecolor': facecolor})if xlim:ax.set_xlim(*xlim)if ylim:ax.set_ylim(*ylim)def generate_imshow_demo_grid(extents, xlim=None, ylim=None):N = len(extents)fig = plt.figure(tight_layout=True)fig.set_size_inches(6, N * (11.25) / 5)gs = GridSpec(N, 5, figure=fig)columns = {'label': [fig.add_subplot(gs[j, 0]) for j in range(N)],'upper': [fig.add_subplot(gs[j, 1:3]) for j in range(N)],'lower': [fig.add_subplot(gs[j, 3:5]) for j in range(N)]}x, y = np.ogrid[0:6, 0:7]data = x + yfor origin in ['upper', 'lower']:for ax, extent in zip(columns[origin], extents):plot_imshow_with_labels(ax, data, extent, origin, xlim, ylim)columns['label'][0].set_title('extent=')for ax, extent in zip(columns['label'], extents):if extent is None:text = 'None'else:left, right, bottom, top = extenttext = (f'left: {left:0.1f}\nright: {right:0.1f}\n'f'bottom: {bottom:0.1f}\ntop: {top:0.1f}\n')ax.text(1., .5, text, transform=ax.transAxes, ha='right', va='center')ax.axis('off')return columns

1 默认范围

首先,让我们看一下默认范围 default extent = None

generate_imshow_demo_grid(extents=[None])

在这里插入图片描述

通常,对于形状(M, N)的数组,第一个索引沿垂直方向运行,第二个索引沿水平方向运行。像素中心位于整数位置,水平范围为0到N'= N - 1,垂直范围为0到M'= M - 1。origin确定如何在边界框中填充边框。

对于origin = 'lower':

  • [0, 0]对应的是(左,下)
  • [M', 0]对应的是(左,上)
  • [0, N']对应的是(右,下)
  • [M', N']对应的是(右,上)

对于origin = 'upper' 将会反转垂直轴的方向和填充:

  • [0, 0]对应的是(左,上)
  • [M', 0]对应的是(左,下)
  • [0, N']对应的是(右,上)
  • [M', N']对应的是(右,下)

总之,[0, 0]的位置和范围受到origin的影响:

origin[0, 0]位置范围
upper上左(-0.5, numcols-0.5, numrows-0.5, -0.5)
lower下左(-0.5, numcols-0.5, -.05, numrows-0.5)

origin的默认值由rcParams["image.origin"](默认值为’upper’)设置,默认为’upper’以匹配数学和计算机图像索引约定中的矩阵索引约定。

2 显式范围

通过设置范围,我们定义图像区域的坐标。对基础图像数据进行插值/重采样以填充该区域。

如果Axes设置为自动缩放,则Axes的视图限制将设置为范围匹配,从而确保(left, bottom)设置的坐标位于Axes的左下角。但是,这可能会反转轴,因此它们不会在“自然”方向上增加:

extents = [(-0.5, 6.5, -0.5, 5.5),(-0.5, 6.5, 5.5, -0.5),(6.5, -0.5, -0.5, 5.5),(6.5, -0.5, 5.5, -0.5)]columns = generate_imshow_demo_grid(extents)
set_extent_None_text(columns['upper'][1])
set_extent_None_text(columns['lower'][0])

在这里插入图片描述

3 显式确定范围和Axes极限

如果我们通过显式设置set_xlim/set_ylim来固定Axes极限,我们会强制Axes的一定大小和方向。这可以将图像的“左-右”和“上-下”感觉与屏幕上的方向分离。

在下面的示例中,我们选择了略大于范围的极限(注意Axes内的白色区域)。

虽然我们保留了前面示例中的范围,但坐标(0,0)现在显式地放在左下角,值向上和向右增加(从查看者的角度来看)。我们可以看到:

  • 坐标(左,下)锚定图像,然后填充朝向数据空间中(右,上)点的框;
  • 第一列始终最靠近“左”;
  • 原点控制第一行是最接近“顶部”还是“底部”;
  • 图像可以沿任一方向反转;
  • 图像的“左-右”和“自上-下”感觉可能与屏幕上的方向无关。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一.数据分析简介

目录 一、了解数据分析 1.1 什么是数据分析 1.2 数据分析的重要性 1.3 数据分析的基本流程 数据获取 数据处理 1.4 数据分析的应用场景 客户分析 营销分析 二、数据分析工具 jupyter 2.1 编辑器安装 2.2 Jupyter快捷使用 一、了解数据分析 学习数据分析&#xff0…

FPGA之加法逻辑运算

由于FPGA需要被反复烧写&#xff0c;它实现组合逻辑的基本结构不可能像ASIC 那样通过固定的与非门来完成&#xff0c;而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求&#xff0c;目前主流FPGA都采用了基于SRAM 工艺的查找表结构。LUT本质上就是一个RAM。它把…

HarmonyOS-卡片页面能力说明和使用动效能力

卡片页面能力说明 开发者可以使用声明式范式开发ArkTS卡片页面。如下卡片页面由DevEco Studio模板自动生成&#xff0c;开发者可以根据自身的业务场景进行调整。 ArkTS卡片具备JS卡片的全量能力&#xff0c;并且新增了动效能力和自定义绘制的能力&#xff0c;支持声明式范式的…

汇编语言程序设计实验三 数据串传送和查表程序

实验目的和要求 1、堆栈。堆栈指示器SP和堆栈操作指令PUSH。POP。 2、段寄存器和物理地址计算。 3、查表法和查表指令XLAT。 4、数据串传送程序和数据串传送指令MOVS。STOS及重复前辍REP。 5、循环指令ROL。逻辑与指令AND和清方向位指令CLD。 6、伪操作指令DB。 实验环境…

五步法搞定 BI 业务需求梳理

五步法搞定 BI 业务需求梳理。高手就是把复杂的事情简单化&#xff0c;简单的东西重复做、认真做。 01 五步法是哪五步 第一、明确用户 五步法搞定 BI 业务需求梳理。高手就是把复杂的事情简单化&#xff0c;简单的东西重复做、认真做。 第二、明确指标 在明确需求用户的前…

LeetCode 2125.银行中的激光束数量

银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank &#xff0c;表示银行的平面图&#xff0c;这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布&#xff0c;由若干 ‘0’ 和若干 ‘1’ 组成。‘0’ 表示单元格是空的&#xff0…

网盘拉新如何对接?盘点最靠谱的一手渠道平台

2024网盘行业再次重燃战火。字节旗下产品头条搜索极速版APP、悟空浏览器APP推出对应的网盘功能&#xff0c;刚刚开放了拉新推广&#xff0c;现在是一个不能错过新项目的好时机。 如果你对网盘拉新推广充满热情&#xff0c;千万不要错过星子助推联合字节推出的网盘项目机会。小…

python自动化之如何利用allure生成测试报告

Allure测试报告框架帮助你轻松实现”高大上”报告展示。本文通过示例演示如何从0到1集成Allure测试框架。重点展示了如何将Allure集成到已有的自动化测试工程中、以及如何实现报表的优化展示。Allure非常强大&#xff0c;支持多种语言多种测试框架&#xff0c;无论是Java/Pytho…

成功的交易没有对错,只有逻辑

大部分人将交易失败归咎于心态&#xff0c;但其实我们是否认真思考过自己的基本功是否扎实呢&#xff1f;这篇文章将引导你换个角度看待交易&#xff0c;让你明白自己应该努力的方向。 曾经&#xff0c;你或许认为资金体量小、信息不对称、技术不过关、心态不过硬是阻碍交易发展…

TikTok外贸系统的核心功能及其源代码分享!

随着全球化的不断推进&#xff0c;外贸业务成为越来越多企业的增长动力&#xff0c;TikTok作为一个全球性的社交媒体平台&#xff0c;其用户基数庞大、活跃度高&#xff0c;为外贸业务提供了无限的商机。 为了帮助企业在TikTok上更好地开展外贸业务&#xff0c;TikTok外贸系统…

【DDD】学习笔记-聚合和聚合根:怎样设计聚合?

今天我们来学习聚合&#xff08;Aggregate&#xff09;和聚合根&#xff08;AggregateRoot&#xff09;。 我们先回顾下上一讲&#xff0c;在事件风暴中&#xff0c;我们会根据一些业务操作和行为找出实体&#xff08;Entity&#xff09;或值对象&#xff08;ValueObject&…

xss.haozi.me:0x0B

<svg><script>(1)</script>

洛谷 B3620 x 进制转 10 进制

题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码&#xff0c;用 A&#xff0c;B&#xff0c;…… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数&#xff0c;表示答案。 输入输出样例…

【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝 引入 浅拷贝和深拷贝应该是面试时非常常见的问题了&#xff0c;为了能将这两者说清楚&#xff0c;于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词&#xff0c;有种莫名的熟悉感&#xff0c;感觉跟某个英文很相似&#xff…

局域网如何搭建服务器?

随着网络的普及和应用场景的不断拓展&#xff0c;局域网搭建服务器逐渐成为大家关注的话题。在日常生活和工作中&#xff0c;我们经常需要通过局域网和互联网进行文件共享、资源访问等操作&#xff0c;而搭建服务器则是实现这些功能的重要手段之一。本文将针对局域网搭建服务器…

SwiftUI 如何在运行时从底层动态获取任何 NSObject 对象实例

概览 众所周知,SwiftUI 的推出极大地方便了我们这些秃头码农们搭建 App 界面。不过,有时我们仍然需要和底层的 UIKit 对象打交道。比如:用 SwiftUI 未暴露出对象的接口改变视图的行为或外观。 从上图可以看到,我们 SwiftUI 代码并没有设置视图的背景色,那么它是怎么变成绿…

vscode 本地/远程添加python解释器

文章目录 1. 背景2. 增加python解释器 1. 背景 我们在使用 vscode 去远程调试代码时&#xff0c;如果环境存在多个 Python 版本&#xff08;如用 conda 管理&#xff09;&#xff0c;没有选择正确的 Python 解释器会导致少包、库不适配等各种问题 2. 增加python解释器 windo…

鸿蒙系统适配的流程

鸿蒙系统适配的流程通常涉及以下关键步骤&#xff0c;以下是鸿蒙系统适配的一般流程&#xff0c;具体流程可能会根据项目的具体需求和开发团队的情况进行调整和优化。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 准备工作&#…

盘点:国家智能算力中心

文章目录 1. Main2. My thoughtsReference 1. Main 按照《中国算力白皮书&#xff08;2022年&#xff09;》的定义&#xff0c;算力主要分为四部分&#xff1a;通用算力、智能算力、超算算力、边缘算力。通用算力以CPU芯片输出的计算能力为主&#xff1b;智能算力以GPU、FPGA、…

【一起学习Arcade】(6):属性规则实例_约束规则和验证规则

一、约束规则 约束规则用于指定要素上允许的属性配置和一般关系。 与计算规则不同&#xff0c;约束规则不用于填充属性&#xff0c;而是用于确保要素满足特定条件。 简单理解&#xff0c;约束规则就是约束你的编辑操作在什么情况下可执行。 如果出现不符合规则的操作&#…