matplotlib 合理设置colorbar和子图的对应关系
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官网例子
matplotlib 合理设置colorbar和子图的对应关系相关推荐
- Matplotlib 系列:colorbar 的设置
转载于:Matplotlib 系列:colorbar 的设置 该文为我很及时的解决了我的烦恼,再次向作者致意~ 作者一直在持续更新python系列,请支持原作者,文章来源:炸鸡人博客 0. 前言 承接 ...
- 用matplotlib的imshow显示图像,设置colorbar的颜色范围
注意:这里用imshow显示的矩阵,矩阵的每个元素,是一个单通道的值,而不是RGB这样多通道的值,这样设置colorbar才有意义. 经常我们用imshow来显示矩阵数据,这样看起来比较直观.比如下面 ...
- matplotlib自定义设置plt.colorbar函数配置颜色条的刻度数实战:自定义设置颜色条刻度、并为刻度值进行命名和标签化
matplotlib自定义设置plt.colorbar函数配置颜色条的刻度数实战:自定义设置颜色条刻度.并为刻度值进行命名和标签化 目录
- matplotlib之pyplot模块——清除子图、清除图形、删除子图、设置当前子图(cla()、clf()、delaxes()、sca())
当前有效matplotlib版本为:3.4.1. cla函数 cla函数的作用是清空当前子图(相当于将当前子图格式化为默认空子图,子图本身并没有被删除). 函数的定义签名为matplotlib.pyp ...
- bar图设置距离 python_python画图设置坐标轴的位置及角度及设置colorbar
用python画图 设置y轴在右边显示 f, ax = plt.subplots(figsize = (14, 10)) sns.heatmap(corr,cmap='RdBu', linewidth ...
- python自定义colorbar_python可视化 matplotlib画图使用colorbar工具自定义颜色
python matplotlib画图使用colorbar工具自定义颜色 colorbar(draw colorbar without any mapple/plot) 自定义colorbar可以画出 ...
- python可视化 matplotlib画图使用colorbar工具自定义颜色
python matplotlib画图使用colorbar工具自定义颜色 colorbar(draw colorbar without any mapple/plot) 自定义colorbar可以画出 ...
- matplotlib之pyplot模块——调整子图布局(subplots_adjust、tight_layout)
在pyplot模块中,与调整子图布局的函数主要为subplots_adjust和tight_layout,其中subplots_adjust是修改子图间距的通用函数,tight_layout默认执行一 ...
- python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体、自定义设置图像标题使用的字体类型
python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体.自定义设置图像标题使用的字体类型 目录
最新文章
- The constructor JedisPool(GenericObjectPoolConfig, String, int, int, String) refers to the missing t
- JZOJ 3.10 1542——跑步(树状数组+模拟+排序/归并排序)
- Vue.js 单元测试
- 搭建QT和VS2010集成开发环境
- I/O复用的 select poll和epoll的简单实现
- android:#FFFFFFFF 颜色码解析
- 【对讲机的那点事】安装中继台天馈系统如何制作同轴电缆BNC接头?
- poj 1011 - sticks - dfs + 剪枝
- 收集几个企业内部的沟通工具
- springboot 对接海康设备
- java内存模型JMM理解整理
- 进安全模式提示”Press ENTER to continue loading SPTD.sys”
- 设计模式笔记——代理模式
- 腾讯副总裁曾宇:谈谈腾讯的技术价值观与技术人才修炼
- winscp开启ftp_Linux 之WinSCP连接FTP
- 中专计算机英语词汇,中职英语新课标词汇表.doc
- matlab中sign函数的使用(提取符号)
- 商城系统搭建支付通道
- 计算机在艺术娱乐的应用,计算机技术在艺术领域的应用
- 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表