在matplotlib中控制colorbar的长度

news2024/11/15 11:24:24

在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 np

import 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 plt

from matplotlib import cbook


def get_demo_image():
    z = cbook.get_sample_data("axes_grid/bivariate_normal.npy")  # 15x15 array
    return 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, SubplotDivider

    divider = SubplotDivider(fig, 2, 2, 2, aspect=True)

    # axes for image
    ax = fig.add_subplot(axes_locator=divider.new_locator(nx=0, ny=0))
    # axes for colorbar
    ax_cb = fig.add_subplot(axes_locator=divider.new_locator(nx=2, ny=0))

    divider.set_horizontal([
        Size.AxesX(ax),  # main axes
        Size.Fixed(0.05),  # padding, 0.1 inch
        Size.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_locatable

    divider = 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_locatable

    divider = 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 & colorbar
    ax = fig.add_subplot(2, 2, 1)
    demo_simple_image(ax)

    # PLOT 2
    # image and colorbar with draw-time positioning -- a hard way
    demo_locatable_axes_hard(fig)

    # PLOT 3
    # image and colorbar with draw-time positioning -- an easy way
    ax = 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 mpl


USER_FONT_SZ=22
COORD_MIN=0
COORD_MAX=50

if __name__ == '__main__':
    # subplot SETUP
    gs_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]=ax
        elif ax.get_label()=='right image':
            axes[1]=ax
        elif ax.get_label()=='colorbar':
            axes[2]=ax
    ax1, 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 axes
    ax1.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().width
    print(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.coloradmin.cn/o/1617021.html

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

相关文章

C# 图像旋转一定角度后,对应坐标怎么计算?

原理分析 要计算图像内坐标在旋转一定角度后的新坐标,可以使用二维空间中的点旋转公式。假设图像的中心点(即旋转中心)为 (Cx, Cy),通常对于正方形图像而言,中心点坐标为 (Width / 2, Height / 2)。给定原坐标点 (X, …

【Linux学习】使用 git 命令行

🌂文章目录 🌂git的介绍🌂gitte与github是什么?🌂git的安装与使用🌂git三板斧🌂git其他命令 🌂git的介绍 Git是一个版本管理控制系统(Version ControlSystem,VCS)&#…

Linux内核驱动开发-001字符设备开发-003独立按键杂项驱动

1驱动程序 /*************************************************************************> File Name: key_misc.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月22日 星期一 17时20分42秒**********************************************…

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境: MATLAB 2022a 1、算法描述 NOA(Network Optimization Algorithm,网络优化算法)是一个针对网络覆盖率优化的算法,它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

【三维地图无人机路径规划】基于标准A星算法+平滑度优化

课题名称: 基于标准A星算法平滑度优化的无人机三维地图路径规划 版本时间: 2024-04-22 程序运行: 直接运行AStar.m 文件即可 代码获取方式: QQ:491052175 VX:Matlab_Lover 特殊说明: …

zabbix“专家坐诊”第237期问答

问题一 Q:在一台虚拟机安装了mysql数据库服务器上安装了agent,将MySQL by Zabbix agent模板联接上去了,但增加的mysql监控项,全部显示为不支持的,这是什么原因? A:这个是自定义脚本的形式&#…

Java中使用Graphics2D实现字符串- 竖直并居中排序显示算法

效果: 代码: public static void drawMyString(Graphics textGraphics, String text) {// 每列显示的汉字数量int columnSize 7;// 文字之间的垂直间距int verticalSpacing 75;// 获取字体渲染上下文FontMetrics fm textGraphics.getFontMetrics();//…

STC15L2K60S2-28I-LQFP44 单片机芯片 STC宏晶

STC15L2K60S2-28I-LQFP44 规格信息: 产品类型STC(宏晶) UART/USART2 额定特性- SPI1 USB Device0 USB Host/OTG0 PWM3 I2C(SMBUS/PMBUS)0 LCD0 工作电压2.4V ~ 3.6V EEPROM 尺度1KB Ethernet0 A/D8x10bit CAN0 D/A3x10bit CPU…

网站被SmartScreen标记为不安全怎么办?

在互联网时代,网站的安全性和可信度是用户选择是否继续访问的重要因素之一,然而,网站运营者偶尔会发现使用Edge浏览器访问网站时,会出现Microsoft Defender SmartScreen(以下简称SmartScreen)提示网站不安全…

代理设置方法 ubuntu git

目录 ubuntu设置代理方法 git 中 ubuntu设置代理方法 (1) .bashrc中写 或者 (2) 当自己的 虚拟机选择default switch,保持了虚拟机与本机的联通性(host模式好像),这时&#xff0…

SAM5916B 法国追梦DREAM 音频DSP芯片

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板,方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 一、全系列芯片: SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 二、原厂开发套…

大厂常见算法50题-反转链表

专栏持续更新50道算法题,都是大厂高频算法题,建议关注。 文章目录 解法参考链接题目解法一 双指针解法二 递归解法三 妖魔化的双指针总结 解法参考链接 题目 解法一 双指针 定义两个指针: pre 和 cur。pre 在前 cur 在后。每次让 pre的 nex…

React 19 带来了 JSX 运行时的重要更新

在 React 的发展历程中,JSX 运行时一直扮演着重要的角色。在以前的的版本,JSX 运行时会克隆传入的 props 对象,这背后有着两大原因。 历史原因 React 保留了一些特殊的 prop 名称,如 key 和在 React 19 之前的 ref。这些 prop 并…

【Docker】Docker基本操作

docker 发展历史 https://www.cnblogs.com/rongba/articles/14782624.html Docker概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容…

指针专题(4)【qsort函数的概念和使用】

1.前言 上节我们学习了指针的相关内容,本节我们在有指针的基础的条件下学习一下指针的运用,那么废话不多说,我们正式进入今天的学习 2.回调函数 我们既然已经学习了指针的相关基础,那么我们此时就可以用指针来实现回调函数 而回…

轻松学会微信小程序开发(一)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Java常见面试题总结

文章目录 1. 什么是线程和进程?2. 请简要描述线程与进程的关系,区别及优缺点?3. 什么是堆和方法区?4. 并发与并行的区别5. 同步和异步的区别6.为什么要使用多线程? 优点?(重要)7. 使用多线程可能带来什么问题?8. 如…

javaWeb中的classpath

参考:https://www.cnblogs.com/StarbucksBoy/p/11375475.html 日常开发过程中的项目目录结构 打包后的war包,解压缩后的目录结构 打包前后文件的映射关系如下:

ElasticSearch查询时修改打分

原生的ES打分基于BM25算法,相比于TF-IDF已经有了较大的改进,但是在实际场景中往往最终的排序效果还是需要进行调整。由于直接修改索引的权重往往代价较大,比较经济的方式还是在查询时即时修改得分以实现排序控制。 注:案例测试数据…

MO DOCKER - Docker synopsis - Huge

Docker synopsis website addressDocker series2.1 今日课程介绍2.2 初始docker - 什么是docker website address url address Docker series 2.1 今日课程介绍 2.2 初始docker - 什么是docker 项目部署的问题 大型项目组件较多, 运行环境也较为复杂,部署时会碰到一些问题…