origin画图_把heatmap翻一转:imshow的origin和extent
![](/assets/blank.gif)
背景故事:
之前画热度图用的seaborn,里面好像有一个inversey的选项,可以把热度图直接做垂直翻转。结合numpy的histogram2d来看,这是十分实用的,因为histogram2d得到的2d heatmap直接用matplotlib.pyplot的Axes.imshow方法画出来的图,是上下颠倒的,如果用一次np.flip(heatmap, 0),会发现图放正了,但是纵坐标的刻度还是反的,需要反着写Axes.set_yticks与Axes.set_yticklabels来调正。很显然,plt作为使用如此广泛的库,没有理由这么搞人心态。
![](/assets/blank.gif)
所以查了下np.histogram2d的文档,发现范例里有用到extent,再去看了看matplotlib的文档,发现了extent的具体用法,在这里记录一下。
官方原文点上面那个“extent的具体用法”,有超链接的,点进去就可以看了,下面的内容是我自己写的范例。
首先看看背景故事里说的麻烦的情况:
import numpy as np
import matplotlib.pyplot as pltx = np.random.normal(0, 1, (100,))
y = np.random.normal(0, 1, (100,))
heatmap, xedge, yedge = np.histogram2d(x, y, bins=(100, 10), range=((-4, 4), (-3, 3)))fig, ax = plt.subplots()
fig.set_size_inches(4, 12)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.imshow(heatmap)
fig.savefig('./bad1.png')
![](/assets/blank.gif)
这是不加任何修饰,直接画出来的图。该图体现了一个最显然的问题,就是我的x应该是100个bin,y应该是10个bin,应该是一个矮胖的形状而不是一个高瘦的。
这是因为np.histogram2d的返回值就是这样设定的,如果需要画图,要先转置一下:
heatmap = heatmap.T
那么再画一次:
fig, ax = plt.subplots()
fig.set_size_inches(12, 4)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.imshow(heatmap)
fig.savefig('./bad2.png')
![](/assets/blank.gif)
现在看上去对劲了,但是纵坐标是反的,我们希望的图是横纵坐标都从0开始。那么怎么解决呢?
fig, ax = plt.subplots()
fig.set_size_inches(12, 4)
ax.set_xlabel('x')
ax.set_ylabel('y')
heatmap_inverse = np.flip(heatmap, 0)
ax.imshow(heatmap)
ax.set_yticks([5, 9])
ax.set_yticklabels(['5', '0'])
fig.savefig('./bad3.png')
![](/assets/blank.gif)
这么一看效果是达到了,实际上操作很麻烦而且思路很奇怪,如果把code给别人看别人可能会疑惑。所以就需要用到imshow的origin参数。
先在一个简单的2d heatmap上测试,产生一个长这样的方阵:
test_map = np.eye(10)
test_map *= np.arange(1, 11, 1)
就是对角元为1到10的对角矩阵,画出来是这样的:
test_fig, test_ax = plt.subplots()
test_ax.imshow(test_map)
test_fig.savefig('./test_default.png')
![](/assets/blank.gif)
修改一下origin参数试试:
test_fig, test_ax = plt.subplots()
test_ax.imshow(test_map, origin='upper')
test_ax.set_title('origin = upper')
test_fig.savefig('./test_upper.png')
test_ax.imshow(test_map, origin='lower')
test_ax.set_title('origin = lower')
test_fig.savefig('./test_lower.png')
![](/assets/blank.gif)
![](/assets/blank.gif)
可以看出,origin默认值的就是upper,它的意思是从上往下画;对应地,lower就是从下往上画。不难发现,不论怎样规定,横坐标都是从左往右的,这也确实比较符合人们的习惯。
那么之前的热度图就好画了,指定origin为lower即可。
fig, ax = plt.subplots()
fig.set_size_inches(12, 4)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.imshow(heatmap, origin='lower')
fig.savefig('./good.png')
![](/assets/blank.gif)
这就不再需要自己折腾了。以上就是origin的设置。然后可能有人就想说了,我不喜欢横坐标从左到右,我要复古一下,从右到左,怎么办呢?那就需要用到extent了。
首先给出四个不同的extent,保存在列表里:
extent = [[0, 9, 0, 9], [0, 9, 9, 0], [9, 0, 0, 9], [9, 0, 9, 0]]
extent参数接受1个array-like的参数,也就是有sequence概念的输入(tuple、list、1darray均可)。这个array-like的参数分别代表了左右下上,也就是[横轴最左边的值,横轴最右边的值,纵轴最下面的值,纵轴最上面的值]这样。
然后画图看一下效果:
for idx in range(4):test_fig, test_ax = plt.subplots()test_ax.imshow(test_map, extent=extent[idx])test_ax.set_title('extent%d'%(idx+1))test_fig.savefig('./test_extent%d.png'%(idx+1))
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
可以发现,成功地调换了坐标轴的顺序,但是轴变了,图没变,好像很离谱。这是因为,extent的作用是改变横纵坐标展示的范围,如果你去看官方的文档,会发现它可以搭配Axes.set_xlim与Axes.set_ylim使用,来让图片转起来,就像下面这样:
for idx in range(4):test_fig, test_ax = plt.subplots()test_ax.imshow(test_map, extent=extent[idx])test_ax.set_title('extent_with_xylim%d'%(idx+1))test_ax.set_xlim([0, 9])test_ax.set_ylim([0, 9])test_fig.savefig('./test_extent%d_with_xylim.png'%(idx+1))
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
然而实际上你也会发现,图虽然转起来了,但是图上的点和横纵坐标并不能对应上,以这四张图为例,只有图2(extent_with_xylim2)是对的,而它等价于指定origin='lower'。那么我们想要的那种,图转起来,坐标也对应上,应该怎么操作呢?
xylim = [[[0, 9], [0, 9]], [[0, 9], [9, 0]], [[9, 0], [0, 9]], [[9, 0], [9, 0]]]
for idx in range(4):test_fig, test_ax = plt.subplots()test_ax.imshow(test_map, extent=[0, 9, 9, 0])test_ax.set_title('xylim%d'%(idx+1))test_ax.set_xlim(xylim[idx][0])test_ax.set_ylim(xylim[idx][1])test_fig.savefig('./test_xylim%d.png'%(idx+1))
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
其实只要设置好xlim和ylim就可以了,然后用extent来限定坐标范围(如果不设置的话,第一行、列和最后一行、列将很窄)。一个疑问也许是,为什么这里的extent=[0, 9, 9, 0]?因为默认的origin是upper,纵坐标是倒过来的;如果设置origin为lower,就可以把extent设置为更符合直觉的[0, 9, 0, 9]。
matplotlib的水真是深啊~
(完。)
origin画图_把heatmap翻一转:imshow的origin和extent相关推荐
- origin画图_3分钟浏览,Origin绘图中的12个经典问题集锦,早看早知道,躲坑没烦恼!!!...
点击蓝字关注我们 1. 请教怎样反读出 origin 曲线上全部数据点? 如,我用 10个数据点画出了一条 origin 曲线,并存为 project的.OPJ 格式.但,现在我想利用 OPJ 文 ...
- 论文写作——origin画图
一 origin的安装 详见下面网址,内涵下载路径和破解方法. http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址:https://thepc ...
- 记录origin画图遇到的问题及其软件bug解决
记录origin画图遇到的问题及其软件bug解决 第一部分:画图问题 1.如何快速绘制框架 2.图层的合并 3.图例的修改 4.如何让页面变的紧凑 5.自定义函数绘制图像 6.如何查找origin自带 ...
- python画最简单的折线图,推荐origin画图软件
1.因实际需要,需要画一些简单的折线图,详细代码见下: import matplotlib.pyplot as plt import numpy as nplist1=[1,2,3,4,5,6,7,8 ...
- origin画图记录
origin画图记录 折线图 折线图 origin存放数据的Book其实和excel的sheet很相似,画图的操作也有一定的相似性,只是origin比excel的功能更加强大. 首先打开安装好的ori ...
- origin画图---学习时遇到的画图记录
一.origin画图 使用步骤 1.origin出图有水印 demo字样的水印.我是正版学生教育版本的origin,安装好久都没用过,现在打开出图就有水印.查看网上回答,可能是没有安装完全,需要手动安 ...
- Origin画图标签常见语法
Origin画图标签常见语法 下标:-(x) 上标:+(x) 斜体:\i(x) 加粗:\b(x) x下标y上标: \ =(x,y)
- origin画图——同一图中多组数据
origin画图-同一图中多组数据(2维) 导入数据 分别确定X,Y轴列数据(选中列-[set as]-X/Y), 全选数据,点击下方绘图图标[]
- matlab拟合曲线与origin画图联合
matlab拟合曲线与origin画图联合 需要用到matlab的拟合曲线中的smoothing spline功能,同时origin画的图又比较好看且可以后续做多条切线,因此记录下matlab与ori ...
最新文章
- 【Qt】Qt中调用python接口
- IOS UILabel 根据内容自适应高度
- WinForm数据源分页技术
- PAT甲级1045 Favorite Color Stripe (30 分):[C++题解]最佳彩色带、DP、公共子序列变形
- Android 截屏监听(截图分享功能实现)
- 反编译工具的使用和字节码文件的查看(Binary Viewer)
- 文件夹选择对话框 JS实现(转)
- [业余项目]黄金点游戏
- VMWare安装苹果Mac OS X
- springboot源码解析autoconfigure之AopAutoConfiguration
- SAP HANA - 企业管理软件数据库表结构完整文档
- 键盘连接计算机接口,终于明白电脑如何连接键盘
- css fixed定位失效问题
- java爬虫爬取B站弹幕
- Python爬虫,爬取快看漫画每日更新模块
- ICLR 2022 | 商汤提出cosFormer:在注意力中重新思考Softmax
- win2d 渐变颜色
- 通信教程 | USB接口、标准和基础原理
- 树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测
- 三级无刷交流发电机matlab模型,三级无刷交流发电机调压系统的建模及其仿真分析...
热门文章
- HTTP 中POST GET 区别
- 内存管理代码分析 stm32
- 1.3.1 操作系统的运行机制和体系结构(大内核、小内核)
- 面向对象1(super、this)
- 判断给定的整数数组是不是某二叉搜索树的后序遍历的结果
- android自定义组件属性,android自定义控件并添加属性的方法以及示例
- tableau中文版教程pdf_PDF 文件
- python读取路径中字符串_python实现提取str字符串/json中多级目录下的某个值
- java当前时间转化毫秒_Java学习笔记-时间相关类
- php jquery实现弹窗,jquery 弹出层实现代码_jquery