背景故事:

之前画热度图用的seaborn,里面好像有一个inversey的选项,可以把热度图直接做垂直翻转。结合numpy的histogram2d来看,这是十分实用的,因为histogram2d得到的2d heatmap直接用matplotlib.pyplot的Axes.imshow方法画出来的图,是上下颠倒的,如果用一次np.flip(heatmap, 0),会发现图放正了,但是纵坐标的刻度还是反的,需要反着写Axes.set_yticks与Axes.set_yticklabels来调正。很显然,plt作为使用如此广泛的库,没有理由这么搞人心态。

所以查了下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')

这是不加任何修饰,直接画出来的图。该图体现了一个最显然的问题,就是我的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')

现在看上去对劲了,但是纵坐标是反的,我们希望的图是横纵坐标都从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')

这么一看效果是达到了,实际上操作很麻烦而且思路很奇怪,如果把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')

修改一下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')

可以看出,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')

这就不再需要自己折腾了。以上就是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))

可以发现,成功地调换了坐标轴的顺序,但是轴变了,图没变,好像很离谱。这是因为,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))

然而实际上你也会发现,图虽然转起来了,但是图上的点和横纵坐标并不能对应上,以这四张图为例,只有图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))

其实只要设置好xlim和ylim就可以了,然后用extent来限定坐标范围(如果不设置的话,第一行、列和最后一行、列将很窄)。一个疑问也许是,为什么这里的extent=[0, 9, 9, 0]?因为默认的origin是upper,纵坐标是倒过来的;如果设置origin为lower,就可以把extent设置为更符合直觉的[0, 9, 0, 9]。

matplotlib的水真是深啊~


(完。)

origin画图_把heatmap翻一转:imshow的origin和extent相关推荐

  1. origin画图_3分钟浏览,Origin绘图中的12个经典问题集锦,早看早知道,躲坑没烦恼!!!...

    点击蓝字关注我们  1.  请教怎样反读出 origin 曲线上全部数据点? 如,我用 10个数据点画出了一条 origin 曲线,并存为 project的.OPJ 格式.但,现在我想利用 OPJ 文 ...

  2. 论文写作——origin画图

    一 origin的安装 详见下面网址,内涵下载路径和破解方法. http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址:https://thepc ...

  3. 记录origin画图遇到的问题及其软件bug解决

    记录origin画图遇到的问题及其软件bug解决 第一部分:画图问题 1.如何快速绘制框架 2.图层的合并 3.图例的修改 4.如何让页面变的紧凑 5.自定义函数绘制图像 6.如何查找origin自带 ...

  4. python画最简单的折线图,推荐origin画图软件

    1.因实际需要,需要画一些简单的折线图,详细代码见下: import matplotlib.pyplot as plt import numpy as nplist1=[1,2,3,4,5,6,7,8 ...

  5. origin画图记录

    origin画图记录 折线图 折线图 origin存放数据的Book其实和excel的sheet很相似,画图的操作也有一定的相似性,只是origin比excel的功能更加强大. 首先打开安装好的ori ...

  6. origin画图---学习时遇到的画图记录

    一.origin画图 使用步骤 1.origin出图有水印 demo字样的水印.我是正版学生教育版本的origin,安装好久都没用过,现在打开出图就有水印.查看网上回答,可能是没有安装完全,需要手动安 ...

  7. Origin画图标签常见语法

    Origin画图标签常见语法 下标:-(x) 上标:+(x) 斜体:\i(x) 加粗:\b(x) x下标y上标: \ =(x,y)

  8. origin画图——同一图中多组数据

    origin画图-同一图中多组数据(2维) 导入数据 分别确定X,Y轴列数据(选中列-[set as]-X/Y), 全选数据,点击下方绘图图标[]

  9. matlab拟合曲线与origin画图联合

    matlab拟合曲线与origin画图联合 需要用到matlab的拟合曲线中的smoothing spline功能,同时origin画的图又比较好看且可以后续做多条切线,因此记录下matlab与ori ...

最新文章

  1. KindEditor 在线编辑器
  2. solr java api_solr java api
  3. window.onload,body onload=function(), document.onreadystatechange, httpRequest.onreadystatechang
  4. pthread_mutex_init 互斥锁pthread_mutex_t的使用(转)
  5. LINUX SHELL中,变量如何加值
  6. RK3288-安卓5.1-AP6212-WIFI模组调试
  7. excel下拉列表值的设定方式
  8. 如何用电路实现检测过零点?这个简单电路就能搞定
  9. 电商网上购物成为非洲人喜欢的一种新颖购物方式
  10. linux centos 访问根目录 not accessable
  11. Jetson Xavier NX
  12. 图像恢复系列之(6)超分(7)反光去除(8)光斑去除 (9)阴影去除(10)水下图像失真去除 | ICCV2021生成对抗GAN...
  13. 电话销售话术模板有哪些 电话销售技巧
  14. SpringBoot-21-统一日志框架
  15. Android NDK 中堆栈日志 add2line 的分析实践
  16. MongoDB 杂事
  17. ​12个很棒的Pandas和NumPy函数,让分析事半功倍
  18. 在公司里如何写好一封电子邮件
  19. Java学习笔记(22)Developing Efficient Algorithms
  20. 三层架构中网关在核心与汇聚的区别和实验

热门文章

  1. c++中类的申明和定义
  2. 【小米校招笔试】在Excel中,列的名称是这样一个递增序列:seq={A、B、C、... Z、AA、AB、AC、... AZ、BA、BB、BC、... BZ、CA、... ZZ、AAA、AAB...
  3. python递归算法经典实例-Python递归算法详解
  4. The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon
  5. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
  6. 2.1.4 什么是ASCII码?汉字的表示和编码是怎样的?
  7. php过滤第一个逗号和最后一个逗号,PHP字符过滤函数去除字符串最后一个逗号(rtrim)...
  8. java是什么偏旁部首_Python实现获取汉字偏旁部首的方法示例【测试可用】
  9. C++ 正态分布、概率累积密度函数的使用(boost库)
  10. Cpp 对象模型探索 / 虚继承带虚函数的基类的子类的内存布局