在matplotlib中控制colorbar的长度

在matplotlib中控制colorbar的长度

使用matplotlib绘制带颜色的箭头图,有时想直接把颜色条拿来当比例尺条,就需要控制颜色条的长度。

1. pyplot.colorbar()参数说明

pyplot.colorbar(mappable, ax, cax, **kwargs)

mappable是一个ScalarMappble类型的对象,它包括了一个标准化方法norm和一个颜色映射cmap
cax是绘制colorbar的axes。若设置了此项参数,ax参数无效。这个参数与ax的区别见下一节
ax是一个或多个parent axes,意思是会从这几个parent axes中留出空间绘制颜色条。
location,可以取’right’(默认值)、‘left’、‘bottom’、‘top’。指定colorbar在图中的位置。
orientation,颜色条的方向,None or {‘vertical’, ‘horizontal’}
fraction, 浮点类型,默认值0.15。原始的轴有多少用于绘制colorbar。
shrink,浮点类型,颜色条的缩放比例。默认为1,若取0.1则绘制原来尺寸的0.1倍大小

2. cax参数与ax参数的区别

使用ax参数的示例代码如下:这段代码设置了两个子图,并在两个子图中用箭头绘制函数 Z = ( Z 1 − Z 2 ) ∗ 2 = ( e − x 2 − y 2 − e − ( x − 1 ) 2 − ( y − 1 ) 2 ) ∗ 2 Z=(Z1-Z2)*2=(e^{-x^2-y^2}-e^{-(x-1)^2-(y-1)^2})*2 Z=(Z1Z2)2=(ex2y2e(x1)2(y1)2)2的梯度分布。梯度箭头共30*30个,用红色和绿色表示过高、过低的Z值,并且过滤掉大于1.2的Z值。在两个子图分别以Normalize线性标准化BoundaryNorm边界标准化方式将Z映射到颜色值,并绘制对应的颜色条。

import matplotlib.pyplot as plt
import numpy as npimport matplotlib.colors as colors# compute some interesting data
x0, x1 = -3, 3
y0, y1 = -3, 3
x = np.linspace(x0, x1, 30)
y = np.linspace(y0, y1, 30)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2
U = 4*(-X*Z1+(X-1)*Z2)
V = 4*(-Y*Z1+(Y-1)*Z2)
# Set up a colormap:
palette = plt.cm.gray.with_extremes(over='r', under='g', bad='b')Zm = np.ma.masked_where(Z > 1.2, Z)# set up the Axes objects
fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(6, 5.4))# plot using 'continuous' colormap
im = ax1.quiver(X,Y,U,V,Zm, #interpolation='bilinear',cmap=palette,norm=colors.Normalize(vmin=-1.0, vmax=1.0),scale=20)
ax1.set_title('Green=low, Red=high, Blue=masked')
cbar = fig.colorbar(im, extend='both', shrink=0.9, ax=ax1)
cbar.set_label('uniform')
ax1.tick_params(axis='x', labelbottom=False)# Plot using a small number of colors, with unevenly spaced boundaries.
im = ax2.quiver(X,Y,U,V,Zm,# interpolation='nearest',cmap=palette,norm=colors.BoundaryNorm([-1, -0.5, -0.2, 0, 0.2, 0.5, 1],ncolors=palette.N),scale=20)
ax2.set_title('With BoundaryNorm')
cbar = fig.colorbar(im, extend='both', spacing='proportional',shrink=0.9, ax=ax2)
cbar.set_label('proportional')fig.suptitle('quiver, with out-of-range and masked data')
plt.show()

绘制结果如图所示:

在这里插入图片描述

上面的代码中,绘图区有两个子图,每个子图各有一个axes。任何一个axes传给cax参数,会导致这个axes负责的绘图区都用来画颜色条。下面,我们将第一个子图的axes传递给coloarbar的cax参数看看效果:

### 上略
cbar = fig.colorbar(im, extend='both', shrink=0.9, cax=ax1)# 修改这里
cbar.set_label('uniform')
### 下略

效果如图所示:
在这里插入图片描述

这就是设置cax的效果。它有什么好处呢?注意,ax参数的axes都会被适当调整以容纳颜色条。当我们想保持绘图的axes布局不变时,就不希望将
颜色条加到当前的axes中,也就是说,不希望设置ax参数。这时,往往会创建第三个子图,用来绘制颜色条。使用cax参数的示例代码:

import matplotlib.pyplot as pltfrom matplotlib import cbookdef get_demo_image():z = cbook.get_sample_data("axes_grid/bivariate_normal.npy")  # 15x15 arrayreturn z, (-3, 4, -4, 3)def demo_simple_image(ax):Z, extent = get_demo_image()im = ax.imshow(Z, extent=extent)cb = plt.colorbar(im)cb.ax.yaxis.set_tick_params(labelright=False)def demo_locatable_axes_hard(fig):from mpl_toolkits.axes_grid1 import Size, SubplotDividerdivider = SubplotDivider(fig, 2, 2, 2, aspect=True)# axes for imageax = fig.add_subplot(axes_locator=divider.new_locator(nx=0, ny=0))# axes for colorbarax_cb = fig.add_subplot(axes_locator=divider.new_locator(nx=2, ny=0))divider.set_horizontal([Size.AxesX(ax),  # main axesSize.Fixed(0.05),  # padding, 0.1 inchSize.Fixed(0.2),  # colorbar, 0.3 inch])divider.set_vertical([Size.AxesY(ax)])Z, extent = get_demo_image()im = ax.imshow(Z, extent=extent)plt.colorbar(im, cax=ax_cb)ax_cb.yaxis.set_tick_params(labelright=False)def demo_locatable_axes_easy(ax):from mpl_toolkits.axes_grid1 import make_axes_locatabledivider = make_axes_locatable(ax)ax_cb = divider.append_axes("right", size="5%", pad=0.05)fig = ax.get_figure()fig.add_axes(ax_cb)Z, extent = get_demo_image()im = ax.imshow(Z, extent=extent)plt.colorbar(im, cax=ax_cb)ax_cb.yaxis.tick_right()ax_cb.yaxis.set_tick_params(labelright=False)def demo_images_side_by_side(ax):from mpl_toolkits.axes_grid1 import make_axes_locatabledivider = make_axes_locatable(ax)Z, extent = get_demo_image()ax2 = divider.append_axes("right", size="100%", pad=0.05)fig1 = ax.get_figure()fig1.add_axes(ax2)ax.imshow(Z, extent=extent)ax2.imshow(Z, extent=extent)ax2.yaxis.set_tick_params(labelleft=False)def demo():fig = plt.figure(figsize=(6, 6))# PLOT 1# simple image & colorbarax = fig.add_subplot(2, 2, 1)demo_simple_image(ax)# PLOT 2# image and colorbar with draw-time positioning -- a hard waydemo_locatable_axes_hard(fig)# PLOT 3# image and colorbar with draw-time positioning -- an easy wayax = fig.add_subplot(2, 2, 3)demo_locatable_axes_easy(ax)# PLOT 4# two images side by side with fixed padding.ax = fig.add_subplot(2, 2, 4)demo_images_side_by_side(ax)plt.show()
demo()

在上面的代码中,新建了subplot,并把它的axes传递给cax参数以便绘制颜色条。
绘制效果如图所示:

在这里插入图片描述

3. 控制colorbar的长度实例

通过调整shrink参数,控制了colorbar的长度为ax2的1/5。示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import matplotlib as mplUSER_FONT_SZ=22
COORD_MIN=0
COORD_MAX=50if __name__ == '__main__':# subplot SETUPgs_kw = dict(width_ratios=[1,1], height_ratios=[17, 1])fig, axd = plt.subplot_mosaic([['left image','right image'],['colorbar','colorbar']],gridspec_kw=gs_kw,figsize=(16, 9),layout='constrained')axes=[None, None, None]for k, ax in axd.items():if ax.get_label()=='left image':axes[0]=axelif ax.get_label()=='right image':axes[1]=axelif ax.get_label()=='colorbar':axes[2]=axax1, ax2, ax3 = axes# 设置三个坐标轴的尺寸ax1.set_position([0.01,0.15,0.48,0.8])ax2.set_position([0.51,0.15,0.48,0.8])ax3.set_position([0.01,0.00,0.98,0.1])#准备绘制颜色条的axes不显示轴、标签ax3.xaxis.set_visible(False)#不显示标签ax3.yaxis.set_visible(False)#不显示标签ax3.set_axis_off()#不显示轴ax1.set_xlim(COORD_MIN, COORD_MAX)ax1.set_ylim(COORD_MIN, COORD_MAX)ax1.set_aspect(1)ax2.set_xlim(COORD_MIN, COORD_MAX)ax2.set_ylim(COORD_MIN, COORD_MAX)ax2.set_aspect(1)ax1.set_title('left plot', fontsize=USER_FONT_SZ)ax2.set_title('right plot', fontsize=USER_FONT_SZ)jet_cm = mpl.colormaps['hot']# 随机生成50*50数据u1 = np.random.randn(50,50)v1 = np.random.randn(50,50)u2 = np.random.randn(50,50)v2 = np.random.randn(50,50)x,y=np.meshgrid(np.arange(50), np.arange(50))# plot in each axesax1.quiver(x,y,u1,v1,np.sqrt(u1**2+v1**2),cmap = jet_cm, scale=20)ax2.quiver(x,y,u2,v2,np.sqrt(u2**2+v2**2),cmap = jet_cm, scale=20)# 设置colorbar的长度等同于1/5的ax2宽度# ax2.get_position().width获取ax2的宽度(宽度单位是fig宽度的比例,例如0.1表示fig宽度的0.1)len_in_fig = ax2.get_position().width/5# 宽度转换为缩放比例,传给shrink参数user_shrink=len_in_fig/ax3.get_position().widthprint(len_in_fig)print(user_shrink)cbar = plt.colorbar(ScalarMappable(norm=None, cmap=jet_cm), ax=ax3,#[ax1,ax2],#orientation='horizontal', location='bottom',fraction=1.0, shrink=user_shrink)cbar.set_ticks(ticks=[0,1],labels=['short','long'], fontsize=USER_FONT_SZ-6)cbar.ticklocation='top'plt.show()

绘制结果:
在这里插入图片描述

4.参考

一个使用cax参数的官方示例
控制颜色条位置和尺寸的官方示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2138.shtml

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

相关文章

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(2)——服务端架构

1.架构选型 B/S架构:支持PC、平板、手机等多个平台 2.技术选型 (1)客户端web技术: HTML5 Canvas:支持基于2D平铺的图形引擎 Web workers:允许在不减慢主页UI的情况下初始化大型世界地图。 localStorag…

同旺科技 USB TO SPI / I2C适配器读写24LC256--字节写

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版; 00地址写入一个字节数据AA,并读回验证; 单字节写时序: 读字节时序: …

MTK6775/MT6775/曦力P70联发科处理器性能参数资料

联发科MT6775(曦力P70)芯片搭载强大的Arm Cortex-A73/A53八核CPU,并采用台积电12纳米FinFET制程工艺,相较于其他14纳米级别产品,功耗节省达到了15%。此外,曦力P70还配备了高效能的Arm Mali-G72 GPU,相比上一代产品曦力…

C++ | Leetcode C++题解之第43题字符串相乘

题目&#xff1a; 题解&#xff1a; class Solution { public:string multiply(string num1, string num2) {if (num1 "0" || num2 "0") {return "0";}int m num1.size(), n num2.size();auto ansArr vector<int>(m n);for (int i …

算法——BFS算法

1. 什么是BFS算法 BFS&#xff08;广度优先搜索&#xff0c;Breadth-First Search&#xff09;算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始&#xff0c;逐层地向外扩展搜索&#xff0c;直到找到目标节点或遍历完整个图。 BFS算法的基本思想是…

idea连接远程服务器并同步代码

idea连接远程服务器并同步代码 打开我们的idea。 tool -> deployment -> configuration 新建连接 -> sftp host输入你的远程服务器ip&#xff0c;输入用户名、密码、测试连接 连接成功 选择服务器根目录 web链接&#xff08;无需要不用&#xff09; 点击mappin…

【学习笔记二十一】EWM仓库两步拣配配置及操作展示

一、EWM两步拣配配置 1.定义两步拣配的WPT ①第一步:标准WPT2020,目标仓位是2010两步拣配的仓位,并创建存储类型2010的两步拣配的仓位 ②第二步,标准WPT2010,目标仓位9020发货区和发货的仓位 2.定义确定仓库处理类型的控制标识 3.确定仓库处理类型 4.仓库编码级别需要允…

Qt 集成OSG

Qt 你好 | 专注于Qt的技术分享平台 一&#xff0c;新建一个 QOsgWidget 类&#xff0c;继承自osgQOpenGLWidget #ifndef QOSGWIDGET_H #define QOSGWIDGET_H#include <QObject> #include <osgViewer/Viewer> #include <osgQOpenGL/osgQOpenGLWidget> class…

【ES】springboot集成ES

1. 去Spring官方文档确认版本兼容性 这一版的文档里没有给出springboot的版本对应&#xff0c;但我在一个博主的文章里看到的es8.0以前的官方文档中就有给出来&#xff0c;所以还需要再去寻找spring framework和springboot的对应关系&#xff1f;&#xff1f;&#xff1f; 还…

MySQL及SQL语句

SQL语句 数据库相关概念数据查询语言&#xff08;DQL&#xff09;基本查询数据类型条件查询多表查询子查询 数据操作语言&#xff08;DML&#xff09;数据定义语言&#xff08;DDL&#xff09;数据控制语言&#xff08;DCL&#xff09;MySQL数据库约束视图练习题 数据库相关概念…

如何在linux+4090显卡安装和使用Stable Diffusion

目录 前言一、配置软件环境1.启动界面2.SD功能新体验 总结 前言 Stable Diffision火得一塌糊涂&#xff0c;作为开源阵营里文生图的典型代表&#xff0c;是跟闭源的Dall-E&#xff0c;midjourney分庭抗礼的利器。不体验一把&#xff0c;怎么能说自己是搞生成模型的呢&#xff…

基于K-means和FCM算法的合成纹理图像及SAR图像的分割

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

WPF4 数据模板

数据模板 数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式。 2.针对列表类型的控件, 例如树形控件&#xff0c;下拉列表&#xff0c;列表控件, 可以修改其中的ItemTemplate。 3.修改ContentT…

Python读取influxDB数据库(二)(influxDB2.X版本)

1. influxDB连接 首先在浏览器中输入influxDB的IP和端口&#xff0c;然后输入账号密码进入到influxDB数据库来进行数据的相关操作&#xff1a; 里面的bucket相当于sql中的数据库&#xff0c;_measurement相当于sql中的表 2. 获取influxDB数据库的token方法 3. 写查询语句来查询…

【C++学习】STL之空间配置器之一级空间配置器

文章目录 &#x1f4ca;什么是空间配置器✈STL 提供六大组件的了解&#x1f440;为什么需要空间配置器&#x1f44d;SGI-STL空间配置器实现原理&#x1f302;一级空间配置器的实现 &#x1f4ca;什么是空间配置器 空间配置器&#xff0c;顾名思义就是为各个容器高效的管理空间…

关于Developers网站的一些使用分享

Android Developers 官网使用分享 语音切换android studio 版本下载最新版本下载位置历史版本下载位置 android studio 版本和 AGP 对应关系API 和 android studio 版本和 AGP 对应关系android studio 版本android 版本API levelandroid.hardware.camera2 语音切换 Developers…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点&#xff08;非鼠标手动点击&#xff09; 四、jsApi地图事…

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…

vscode 解决无法创建临时文件。

报错&#xff1a; Fatal error: cant create C:\Users???y\AppData\Local\Temp\ccqkCS9j.o: No such file or directory 右击此 电脑 -> 属性 打开 系统信息 -> 高级系统设置 系统属性 -> 高级 -> 环境变量 将temp 和 tmp 改为其它英文路径 只更改用户变量…

docker-MySQL 8 主从搭建

一.目录结构&#xff1a; 我是在/home目录下&#xff0c;建立个sql文件夹&#xff1a; 二、配置文件 1.mysql配置 mysql-master下.conf文件配置 ###### [mysqld] server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…