matplotlib 合理设置colorbar和子图的对应关系

article/2025/10/4 17:33:12

matplotlib 合理设置colorbar和子图的对应关系

文章目录

    • matplotlib 合理设置colorbar和子图的对应关系
      • 1. 介绍
      • 2 plt.contourf ()
        • 2.1 错误示范
        • 2.2 使用 norm实现颜色和数值之间的对应关系
        • 2.3 只显示最后一个的colorbar
        • 2.4 使用 levels 参数设置
      • 3. 使用plt.imshow()
      • 4 单独设置colorbar
        • 4.1 方式一
        • 4.2 方式二
        • 4.3 问题
        • 4.4 解决方法1:plt.contourf()
        • 4.5 解决办法2:plt.imshow()

1. 介绍

在有些情况下,需要画同一个变量不同时刻的等值面图。考虑到不同时刻的数值有大小差异,因而生成的图的colorbar的标签范围也是不一样的。为了方便比较,最好多个时刻共享一个colorbar,方便比较。下面会依次使用 plt.contourf() 和 plt.imshow()函数进行画图介绍。

2 plt.contourf ()

2.1 错误示范

import numpy as np
import matplotlib.pyplot as plt
import matplotlib#生成一定整数范围内的随机数
a1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))fig = plt.figure(figsize = (22,6))plt.subplot(1,3,1)
h1 = plt.contourf(a1,cmap = plt.cm.coolwarm)
c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.contourf(a2,cmap = plt.cm.coolwarm)
c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.contourf(a3,cmap = plt.cm.coolwarm)
c3 = plt.colorbar(h3) plt.show()

在这里插入图片描述
如上图,每个图上的相同的颜色表示的数值不一样,不方便比较;

2.2 使用 norm实现颜色和数值之间的对应关系

a1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))fig = plt.figure(figsize = (22,6))#将颜色映射到 vmin~vmax 之间
norm = matplotlib.colors.Normalize(vmin=0, vmax=15)plt.subplot(1,3,1)
h1 = plt.contourf(a1,cmap = plt.cm.coolwarm,norm = norm)
c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.contourf(a2,cmap = plt.cm.coolwarm,norm = norm)
c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.contourf(a3,cmap = plt.cm.coolwarm,norm = norm)
c3 = plt.colorbar(h3)plt.show()

在这里插入图片描述
如上图,可以实现相同数值大小对应相同的颜色;

但是这样还是不太好看。最好是能够 每个子图的 colorbar的范围都一样(即从0-15);

2.3 只显示最后一个的colorbar

那有同学想,是否可以只显示最后一个子图的colorbar,作为全局colorbar呢;这个当然也是可以的。

但是会带来一个问题,由于每个子图的大小(无论是否包含colorbar)是一样的,会使得图形大小看起来不一样,很不美观;

如下图:
在这里插入图片描述

2.4 使用 levels 参数设置

a1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))fig = plt.figure(figsize = (22,6))# norm = matplotlib.colors.Normalize(vmin=0, vmax=15)
#设置固定显示的colorbar刻度
levels = np.arange(0,17,2)plt.subplot(1,3,1)
h1 = plt.contourf(a1,cmap = plt.cm.coolwarm,levels = levels)
c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.contourf(a2,cmap = plt.cm.coolwarm,levels = levels)
c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.contourf(a3,cmap = plt.cm.coolwarm,levels = levels)
c3 = plt.colorbar(h3)plt.show()

在这里插入图片描述

3. 使用plt.imshow()

上面虽然设置了 norm,但是使用plt.contourf还是达不到我们的要求。链接3 给了我们一个示例,使用plt.imshow() + norm可以解决这个问题。按照他的思路,我们重复上面的试验。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib# matplotlib.rcParams['xtick.direction'] = 'out'
# matplotlib.rcParams['ytick.direction'] = 'out'a1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))fig = plt.figure(figsize = (22,6),dpi=72, facecolor="white")#将横纵坐标都映射到(0,1)的范围内
extent=(0,1,0,1)vmin=0
vmax=15
#将颜色映射到 vmin~vmax 之间
norm = matplotlib.colors.Normalize(vmin=0, vmax=15)ax1 = plt.subplot(1,3,1)
ax1.cla()
h1 = plt.imshow(a1,extent = extent,origin='lower',cmap = plt.cm.coolwarm,norm = norm)
c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.imshow(a2,extent = extent,origin='lower',cmap = plt.cm.coolwarm,norm = norm)
c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.imshow(a3,extent = extent,origin='lower',cmap = plt.cm.coolwarm,norm = norm)
c3 = plt.colorbar(h3)font = {'family' : 'serif','color'  : 'darkred','weight' : 'normal','size'   : 16,}c3.set_label('$T_B(K)$',fontdict=font)
c3.set_ticks(np.arange(vmin,vmax,2))
c3.set_ticklabels(np.arange(vmin,vmax,2))plt.show()

在这里插入图片描述

如上图,虽然使用plt.imshow可以解决这个问题,但是用带来了一些新问题:

  • 在画子图的时候,colorbar的长度和子图的长度不一致;在单独画一个图的时候,并不存在这样的问题
  • plt.imshow()是逐像素画图的,相比plt.contourf,分辨率很低,并不适合科研上的等值线作图。

4 单独设置colorbar

import numpy as np
import matplotlib.pyplot as plt
import matplotliba1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))#也可以通过这样 levels 进行设置
#h = plt.contourf(a1,levels = [0,1,2,3,4,5,6,7,8,9,10], cmap = plt.cm.coolwarm)fig = plt.figure(figsize = (22,6))norm = matplotlib.colors.Normalize(vmin=0, vmax=15)plt.subplot(1,3,1)
h1 = plt.contourf(a1,cmap = plt.cm.coolwarm,norm = norm)
# c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.contourf(a2,cmap = plt.cm.coolwarm,norm = norm)
# c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.contourf(a3,cmap = plt.cm.coolwarm,norm = norm)
# c3 = plt.colorbar(h3)
# c3.set_clim(vmax = 15)#前面三个子图的总宽度 为 全部宽度的 0.9;剩下的0.1用来放置colorbar
fig.subplots_adjust(right=0.9)#colorbar 左 下 宽 高 
l = 0.92
b = 0.12
w = 0.015
h = 1 - 2*b #对应 l,b,w,h;设置colorbar位置;
rect = [l,b,w,h] 
cbar_ax = fig.add_axes(rect) 
cb = plt.colorbar(h3, cax=cbar_ax)#设置colorbar标签字体等
cb.ax.tick_params(labelsize=16)  #设置色标刻度字体大小。
font = {'family' : 'serif',
#       'color'  : 'darkred','color'  : 'black','weight' : 'normal','size'   : 16,}
cb.set_label('T' ,fontdict=font) #设置colorbar的标签字体及其大小plt.show()

在这里插入图片描述
如上,是不是很漂亮了。后续适当做一些 坐标、字体等的基本设置,就完成了一张科研图的绘制!

4.1 方式一

import numpy as np
import matplotlib.pyplot as plt
import matplotliba1 = np.random.randint(1,10,size=(10,10))
a2 = np.random.randint(1,13,size=(10,10))
a3 = np.random.randint(1,16,size=(10,10))#也可以通过这样 levels 进行设置
#h = plt.contourf(a1,levels = [0,1,2,3,4,5,6,7,8,9,10], cmap = plt.cm.coolwarm)fig = plt.figure(figsize = (22,6))norm = matplotlib.colors.Normalize(vmin=0, vmax=15)plt.subplot(1,3,1)
h1 = plt.contourf(a1,cmap = plt.cm.coolwarm,norm = norm)
# c1 = plt.colorbar(h1)plt.subplot(1,3,2)
h2 = plt.contourf(a2,cmap = plt.cm.coolwarm,norm = norm)
# c2 = plt.colorbar(h2)plt.subplot(1,3,3)
h3 = plt.contourf(a3,cmap = plt.cm.coolwarm,norm = norm)
# c3 = plt.colorbar(h3)
# c3.set_clim(vmax = 15)#前面三个子图的总宽度 为 全部宽度的 0.9;剩下的0.1用来放置colorbar
fig.subplots_adjust(right=0.9)#colorbar 左 下 宽 高 
l = 0.92
b = 0.12
w = 0.015
h = 1 - 2*b #对应 l,b,w,h;设置colorbar位置;
rect = [l,b,w,h] 
cbar_ax = fig.add_axes(rect) 
cb = plt.colorbar(h3, cax=cbar_ax)#设置colorbar标签字体等
cb.ax.tick_params(labelsize=16)  #设置色标刻度字体大小。
font = {'family' : 'serif',
#       'color'  : 'darkred','color'  : 'black','weight' : 'normal','size'   : 16,}
cb.set_label('T' ,fontdict=font) #设置colorbar的标签字体及其大小plt.show()

在这里插入图片描述
如上,是不是很漂亮了。后续适当做一些 坐标、字体等的基本设置,就完成了一张科研图的绘制!

4.2 方式二

import numpy as np
import matplotlib.pyplot as plt
import matplotlib#设置子图个数 和 整个图片的大小
fig, axes = plt.subplots(nrows=2, ncols=2,figsize = (12,10))a_list = [5,10,15,20]#设置colorbar的范围
vmin = 0
vmax = 20norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)for a,ax in zip(a_list,axes.flat):#设置每个子图data = np.random.randint(0,a,size = (20,20))im = ax.contourf(data,norm = norm)#fig 的位置为[0,1],设置前面4个子图的占的位置为[0,0.8]
fig.subplots_adjust(right=0.8)#在原fig上添加一个子图句柄为cbar_ax, 设置其位置为[0.85,0.15,0.05,0.7]
#colorbar 左 下 宽 高 
l = 0.85
b = 0.12
w = 0.05
h = 1 - 2*b 
#对应 l,b,w,h;设置colorbar位置;
rect = [l,b,w,h] 
cbar_ax = fig.add_axes(rect)cb = fig.colorbar(im, cax = cbar_ax) #设置colorbar标签字体等
cb.ax.tick_params(labelsize=16)  #设置色标刻度字体大小。
font = {'family' : 'serif',
#       'color'  : 'darkred','color'  : 'black','weight' : 'normal','size'   : 16,}
cb.set_label('T' ,fontdict=font) #设置colorbar的标签字体及其大小plt.show()

在这里插入图片描述

4.3 问题

上述两种方式都存在一个潜在的问题。

在这里插入图片描述

​ 在添加colorbar的时,是使用最后一个子图的所在的数值范围。我们来看几种情况。

  • 情况一:

    norm = [5,20], 对应colorbar上 5以下颜色一致。

在这里插入图片描述

在这里插入图片描述

  • 情况二:

    最后一张子图的数值范围为 [0,15),colorbar范围只能在15以内。

在这里插入图片描述

在这里插入图片描述

结论:

最后一张子图的数据范围决定了colorbar上显示的刻度的范围。

norm范围决定了colorbar颜色变化范围。

4.4 解决方法1:plt.contourf()

为了保证colorbar能覆盖所有子图的范围,应该使得 norm范围与设置colorbar时对应的子图im 的数值范围一致,并且所有子图的数值范围应该都在norm范围之内。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bI7GRXmn-1582701105492)(matplotlib 合理设置colorbar和子图的对应关系.assets/image-20200226135804785.png)]

因此有一个蠢办法:

  • 即另外建一个fig2 , 这个fig2对应的数据范围包括fig1的数据范围。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib#设置子图个数 和 整个图片的大小
    fig1, axes = plt.subplots(nrows=2, ncols=2,figsize = (10,8))a_list = [5,10,20,15]#设置colorbar的范围
    vmin = 0
    vmax = 20
    norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)for a,ax in zip(a_list,axes.flat):#设置每个子图的数据范围data = np.random.randint(0,a,size = (20,20))im = ax.contourf(data,norm = norm)#fig1 的位置为[0,1],设置前面4个子图的占的位置为[0,0.8]
    fig1.subplots_adjust(right=0.8)#在原fig1上添加一个子图句柄为cbar_ax, 设置其位置为[0.85,0.15,0.05,0.7]
    #colorbar 左 下 宽 高 
    l = 0.85
    b = 0.12
    w = 0.05
    h = 1 - 2*b 
    #对应 l,b,w,h;设置colorbar位置;
    rect = [l,b,w,h] 
    cbar_ax = fig1.add_axes(rect)##设置一个fig2,其数值范围涵括fig1所有子图的数值范围
    fig2 = plt.figure(figsize = (18,6))
    all_data = np.random.randint(vmin,vmax,size = (20,20))
    h4 = plt.contourf(all_data,norm = norm)#设置fig1的colorbar对应fig2的数据范围
    cb = fig1.colorbar(h4, cax = cbar_ax) #设置colorbar标签字体等
    cb.ax.tick_params(labelsize=16)  #设置色标刻度字体大小。
    font = {'family' : 'serif',
    #       'color'  : 'darkred','color'  : 'black','weight' : 'normal','size'   : 16,}
    cb.set_label('T' ,fontdict=font) #设置colorbar的标签字体及其大小plt.show()
    

在这里插入图片描述

对比上述情况2的图片,情况有所改善,但是吊了一个尾巴。

4.5 解决办法2:plt.imshow()

import numpy as np
import matplotlib.pyplot as plta_list = [5,10,20,15]#设置colorbar的范围
vmin = 0
vmax = 20
norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)fig, axes = plt.subplots(nrows=2, ncols=2)
for a,ax in zip(a_list,axes.flat):#设置每个子图data = np.random.randint(0,a,size = (20,20))im = ax.imshow(data , vmin = vmin, vmax = vmax )fig.colorbar(im, ax=axes.ravel().tolist())plt.show()

在这里插入图片描述

使用这个方法可以解决上述情况2的问题,不需要吊个尾巴啦!

至于使用plt.imshow 和 plt.contourf,看各自喜好!另外,建议多看看官网例子。

参考链接

[1] 解决python画图中colorbar设置刻度和标签字体大小

[2] 使用matplotlib的示例:调整字体-设置刻度、坐标、colormap和colorbar等

[3] matplotlib官网例子


http://chatgpt.dhexx.cn/article/JfFnmRxn.shtml

相关文章

matlab关于colorbar的整理(绘制不等间距colorbar, colorbar的大小位置调节, colorbar加单位等)

matlab关于colorbar的整理(绘制不等间距colorbar, colorbar的大小位置调节等 1. 绘制不等间距colorbar2. colorbar的大小位置调节3. 更改colorbar上的刻度、给colorbar加单位 对matlab关于colorbar的一些小细节进行整理,希望对一些人能够有所帮助~ 1. 绘制不等间距c…

matlab中的colorbar用法(显示色阶的颜色栏)

原文 matlab画平面分布图时colorbar的设置是非常重要的,好的colorbar不仅使图像更美观,而且能够使人更容易捕捉图上传递的信息。用过matlab的同学都知道matlab默认的colormap是jet, 也就是你画完图后输入“colorbar” 它所显示出来的颜色。此外&#xff…

Matlab的图像操作——colorbar的各项细节操作

最近在论文中用matlab生成高度场,网上搜了很多,自己做一个小小的总结。 首先,如果想在生成的图片中加上colorbar,有两种方式: 1:在生成的Figure图像的菜单栏: Insert—Colorbar, 或者单击上方快捷区添加colorbar,见下图: 2:命令行直接写上 colorbar; 如果想随意指定…

Matplotlib 系列:colorbar 的设置

转载于:Matplotlib 系列:colorbar 的设置 该文为我很及时的解决了我的烦恼,再次向作者致意~ 作者一直在持续更新python系列,请支持原作者,文章来源:炸鸡人博客 0. 前言 承接 Matplotlib 系列&#xff1a…

Chrome谷歌浏览器,清除css或js文件缓存的方法

在写网站首页界面的时候&#xff0c;css文件中给新建的<div>增加了class类的样式&#xff0c;但是无论怎样刷新都没有这个样式的效果。 F12打开开发模式&#xff0c;对比这个<div>与其他的区别&#xff0c;发现右下角的尺寸图中没有position的值&#xff0c;而pos…

浏览器-清理页面中js的缓存

【问题分析】 修改完 js文件中的代码后&#xff0c;页面刷新好几次并没有重新加载 js的文件&#xff0c;开始以为是文件设置没有修改成功&#xff0c;后来想到应该是浏览器对于 js文件的缓存机制引起的。 【解决方案】 清理浏览器的缓存 1.按“F12” 或者 右键单击页面“检查”…

js 浏览器缓存机制

什么是浏览器缓存 Web缓存是指一个Web资源&#xff08;如html页面&#xff0c;图片&#xff0c;js&#xff0c;数据等&#xff09;存在于Web服务器和客户端&#xff08;浏览器&#xff09;之间的副本。缓存会根据进来的请求保存输出内容的副本&#xff1b;当下一个请求来到的时…

哈希表和红黑树

哈希表 哈希表顾名思义是一张表&#xff0c;可以用它来存储键值对这种对应的数据&#xff0c;大家都知道&#xff0c;哈希表的查找速度很快&#xff0c;时间复杂度伪O(1)&#xff0c;那么它的查找速度为什么很快呢&#xff1f;   实际上&#xff0c;哈希表将键值变为数组的下…

3.1 哈希算法

哈希算法在区块链系统中的应用很广泛&#xff1a;比特币使用哈希算法通过公钥计算出了钱包地址、区块头以及交易事务的哈希值&#xff0c;梅克尔树结构本身就是一棵哈希树&#xff0c;就连 挖矿算法都是使用的哈希值难度匹配&#xff1b;以太坊中的挖矿计算也使用了哈希算法&am…

高效的搜索方式:哈希

前言 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。顺序结构查找时间复杂度为O(N)&#xff0c;平衡树查找时间复杂度为O(logN)&#xff0c;搜索的效率取决于搜索过程中…

默克尔树入门

目录 什么是默克尔树构建默克尔树的过程默克尔树验证的原理参考 什么是默克尔树 默克尔树&#xff08;Merkle tree&#xff09;是一种数据结构&#xff0c;以它的提出者默克尔命名&#xff0c;根据默克尔树的性质也可以叫哈希树&#xff0c;是一种典型的二叉树。 默克尔树由根…

java merkle树,使用Merkle树检测数据不一致(翻译)

背景 Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致。 定义 Merkle树是一种哈希树&#xff0c;其中的叶子包含各个数据块的哈希值&#xff0c;父节点包含其各自的子节点的哈希值。它提供了一种有效的方法来查找副本上存储的数据块中的差异&#xff0c;并减少了传…

区块链 — 默克尔树

文章目录 默克尔树生成过程应用场景在区块链中的应用 默克尔树 默克尔树&#xff08;又叫哈希树&#xff09;是一种典型的二叉树结构&#xff0c;有一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由 Merkle Ralf 在 1980 年提出&#xff0c;曾广泛用于文件系统和P2P…

哈希算法的原理以及代码实现

哈希函数&#xff1a; 简单来说就是把红框内的数字根据 一定规律 存放到下方白色的数组中 &#xff08;称为哈希表&#xff09; 这里它的一定规律是 取余法 H&#xff08;key&#xff09;key%p &#xff08;还有其他方法&#xff0c;这里采用的是取余法&#xff09;,p为这个…

二、哈希算法和Merkle Tree

章节系列目录&#xff1a;点击跳转 文章目录 哈希算法哈希函数的定义可靠哈希函数需满足的要求哈希函数的主要作用哈希实际例子 Merkle Tree默克尔树完整性校验的方法哈希列表 Hash ListMerkle Tree 哈希树总结 哈希算法 哈希函数的定义 哈希函数&#xff1a;给一个任意大小的…

Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树

上一篇说AVB内存装不下的较大分区&#xff08;如文件系统&#xff09;可能会使用哈希树&#xff0c;还提到了dm-verity。这篇来看看这两个是啥&#xff1f; dm-verity 1、dm-verity 1、能不能将多个硬盘&#xff0c;映射成一个逻辑的硬盘&#xff0c;那样我们程序就不用关心复…

哈希表与树的介绍

前言 该篇文章&#xff0c;主要带我们认识什么哈希表和树&#xff0c;为我们在研究各个数据结构的实现及扩展算法&#xff0c;有个基本的认识。 哈希表 特点 数组 &#xff1a;寻址容易 &#xff1b;数据连续存储空间链表&#xff1a;插入与删除容易 &#xff1b;放在堆内…

简单哈希树

哈希树 在各种介绍里的都比较抽象&#xff0c;其实没有那么难&#xff0c;这里进行一个最简单的说明。 在将一个数进行哈希的时候&#xff0c;我曾经写过关于哈希的这么些东西&#xff1a;对于数&#xff0c;当一个质数不够用的时候&#xff0c;可以加上第二个质数&#xff0c;…

查找——图文翔解HashTree(哈希树)

引 在各种数据结构&#xff08;线性表、树等&#xff09;中&#xff0c;记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各种…