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.hqwc.cn/news/506330.html

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

相关文章

复合机器人是一种集成了移动机器人

复合机器人是一种集成了移动机器人、协作机器人和机器视觉等多项功能的新型机器人。它的开发目的是为了解决工厂物流中最后一米的问题&#xff0c;提供智能搬运解决方案。复合机器人不仅集成了自主移动机器人&#xff08;AMR&#xff09;、机械臂等工作单元&#xff0c;还使用了…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

TypeScript08:在TS中使用模块化

前言&#xff1a;tsconfig.json中的配置 一、前端领域中的模块化标准 前端领域中的模块化标准有&#xff1a; ES6、commonjs、amd、umd、system、esnext 二、 TS中如何书写模块化语句 TS 中&#xff0c;导入和导出模块&#xff0c;统一使用 ES6 的模块化标准。 myModule.ts &a…

k8s-kubeapps图形化管理 21

结合harbor仓库 由于kubeapps不读取hosts解析&#xff0c;因此需要添加本地仓库域名解析&#xff08;dns解析&#xff09; 更改context为全局模式 添加repo仓库 复制ca证书 添加成功 图形化部署 更新部署应用版本 再次进行部署 上传nginx 每隔十分钟会自动进行刷新 在本地仓库…

云主机和传统主机到底有什么区别呢?

随着信息技术的快速发展&#xff0c;企业对IT基础设施的要求越来越高&#xff0c;许多问题等待解决&#xff1a;政府传统部署扩容升级麻烦、公司服务器维护周期长、建设和维护成本低等。运营成本高&#xff1b; 安全稳定性差、数据易丢失等问题亟待解决。 云主机的出现很大程度…

绘制一下包络线

clear clc close all % 生成衰减信号 % 生成衰减曲线带有随机信号 fs 50; % 采样率 t 0:1/fs:100; % 时间向量&#xff0c;总时长为5秒 frequency0.5; signal exp(-0.05* t).*sin(2*pi*frequency*t); % 衰减曲线带有随机信号 % 计算包络线 [upper_envelope, lower_…

6.5 共享数据

本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法&#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口&#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据&#xff0c;最后叙述如何利用内容解析器读写联系人信息&#xff0c;以…

LVS+Keepalived高可用群集

一、Keepalived简介 Keepalived 软件起初是专为LVS负载均衡软件设计的&#xff0c;用来管理并监控LVS集群系统中各个服务节点的状态&#xff0c;后来又加入了可以实现高可用的VRRP功能。因此&#xff0c;Keepalived除了能够管理LVS软件外&#xff0c;还可以作为其他服务&…

为什么健康的测试过程至关重要?附checklist

目录 单元测试&#xff1a;质量保证的基础 单元测试的优点 有效单元测试的最佳实践 应对常见挑战 简化单元测试的工具和框架 项目和测试文档&#xff1a;使用地图导航 有效项目文件的组成部分 如何维护项目文件 构成测试过程的测试文档类型 测试基础设施&#xff1a;…

基于JAVA的快递投保管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 软件2.2 布局2.3 技术框架 三、功能模块3.1 保险类型模块3.2 快递管理模块3.3 保险订单模块 四、系统展示五、核心代码5.1 查询快递5.2 查询快递保险5.3 新增快递保险5.4 快递投保5.5 查询保险订单 六、免责说明 一、摘…

Centos7:自动化配置vim | suoders信任列表添加普通用户

Centos7&#xff1a;自动化配置vim | suoders信任列表添加普通用户 一、vim 配置原理二、sudoers系统可信任列表中添加普通用户三、自动化配置vim四、缩进修改 一、vim 配置原理 在目录/etc下有一个vimrc文件&#xff0c;该文件是系统中公共的vim配置文件&#xff0c;对所有用户…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…