news 2025/12/19 4:38:29

科研绘图中的色卡选择与高级 Colorbar 设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
科研绘图中的色卡选择与高级 Colorbar 设计

Matplotlib 进阶:做一个“两头尖尖”的竖直色条,并自动命名保存

在做论文图/报告图时,常规的矩形 colorbar 有时不够“视觉友好”。比如我最近需要一个竖直、窄而高、上下两端尖尖的色条(类似箭头端帽),同时希望:

  • 颜色映射可控(示例用cividis,也可替换为任何 colormap)
  • 色条范围可控(示例0 ~ 0.2
  • 字体统一(Times New Roman)
  • 自动按cmap + vmin + vmax生成文件名
  • 直接dpi=1000保存,适合论文排版

下面这段代码用到的核心技巧是:
Polygonax.transAxes坐标系里画一个“尖头形状”的剪裁路径,然后把 colorbar 的色块集合 clip 到这个路径里。


最终效果要点

  • 色条是竖直方向(orientation='vertical'
  • 画布很窄很高(figsize=(0.5, 5)
  • 上下端通过顶点坐标做成尖尖形状
  • 外轮廓线单独画一层黑色边框,线宽可控
  • 自动保存文件名,例如:colorbar_cividis_0_0p2.png

竖向色卡完整代码(可直接运行)

importnumpyasnpimportmatplotlib.pyplotaspltfrommatplotlib.colorsimportNormalizefrommatplotlib.cmimportScalarMappablefrommatplotlib.patchesimportPolygon# 设置字体plt.rcParams['font.family']='Times New Roman'plt.rcParams['font.size']=35# 创建颜色映射cmap=plt.get_cmap("cividis")norm=Normalize(vmin=0,vmax=0.2)# 创建画布:竖直(窄而高)fig,ax=plt.subplots(figsize=(0.5,5))fig.subplots_adjust(left=0.4)# 添加色条cb=plt.colorbar(ScalarMappable(norm=norm,cmap=cmap),cax=ax,orientation='vertical')# 定义“两头尖尖”的竖直路径(单位坐标)verts=[[0.5,0.00],[0.0,0.03],[0.0,0.97],[0.5,1.00],[1.0,0.97],[1.0,0.03],[0.5,0.00]]# 创建剪裁路径clip_path=Polygon(verts,closed=True,transform=ax.transAxes,facecolor='none')ax.add_patch(clip_path)# 应用剪裁路径cb.outline.set_visible(False)forcincb.ax.collections:c.set_clip_path(clip_path)# 添加黑色边框(细线)border=Polygon(verts,closed=True,transform=ax.transAxes,edgecolor='black',facecolor='none',linewidth=0.6)ax.add_patch(border)# 隐藏外框但保留刻度ax.tick_params(left=False,right=False,top=False,bottom=False)forspineinax.spines.values():spine.set_visible(False)# ========= 自动命名并保存 =========cmap_name=getattr(cmap,"name",str(cmap))vmin,vmax=float(norm.vmin),float(norm.vmax)def_fmt(x:float)->str:# 0.02 -> 0p02,-1 -> m1,避免文件名里出现 '.' 和 '-'s=f"{x:g}".replace("-","m").replace(".","p")returns save_name=f"colorbar_{cmap_name}_{_fmt(vmin)}_{_fmt(vmax)}.png"plt.savefig(save_name,dpi=1000,bbox_inches='tight')print("Saved:",save_name)plt.show()

横向色卡完整代码(可直接运行)

importnumpyasnpimportmatplotlib.pyplotaspltfrommatplotlib.colorsimportNormalizefrommatplotlib.cmimportScalarMappablefrommatplotlib.patchesimportPolygon# 设置字体plt.rcParams['font.family']='Times New Roman'plt.rcParams['font.size']=35# 创建颜色映射cmap=plt.get_cmap("seismic")norm=Normalize(vmin=-1,vmax=1)# 创建画布:横向(宽而矮)fig,ax=plt.subplots(figsize=(10,0.5))fig.subplots_adjust(bottom=0.4)# 添加色条:横向cb=plt.colorbar(ScalarMappable(norm=norm,cmap=cmap),cax=ax,orientation='horizontal')# “两头尖尖”横向路径(Axes 坐标)verts=[[0.00,0.5],[0.03,1.0],[0.97,1.0],[1.00,0.5],[0.97,0.0],[0.03,0.0],[0.00,0.5]]# 创建剪裁路径clip_path=Polygon(verts,closed=True,transform=ax.transAxes,facecolor='none')ax.add_patch(clip_path)# 应用剪裁cb.outline.set_visible(False)forcincb.ax.collections:c.set_clip_path(clip_path)# 黑色边框border=Polygon(verts,closed=True,transform=ax.transAxes,edgecolor='black',facecolor='none',linewidth=0.8)ax.add_patch(border)# 隐藏外框ax.tick_params(top=False,bottom=False,left=False,right=False)forspineinax.spines.values():spine.set_visible(False)# ========= 自动命名并保存 =========cmap_name=getattr(cmap,"name",str(cmap))vmin,vmax=float(norm.vmin),float(norm.vmax)def_fmt(x:float)->str:# 0.02 -> 0p02, -1 -> m1,避免文件名中的 '.' 和 '-'returnf"{x:g}".replace("-","m").replace(".","p")save_name=f"colorbar_horizontal_{cmap_name}_{_fmt(vmin)}_{_fmt(vmax)}.png"plt.savefig(save_name,dpi=300,bbox_inches='tight')print("Saved:",save_name)plt.show()

你最可能会改的 4 个参数

  1. 色卡
    cmap = plt.get_cmap("cividis")
    替换成viridis / plasma / inferno / magma / RdYlBu / jet ...

  2. 取值范围
    Normalize(vmin=0, vmax=0.2)
    对应你的误差范围、物理量范围等。

  3. 尖头“尖不尖”
    verts里的0.030.97控制端部收尖长度:

    • 想更尖:改成0.01 / 0.99
    • 想更钝:改成0.05 / 0.95
  4. 输出质量
    dpi=1000很清晰但文件大;一般论文300~600也够。


色卡说明(低值 → 高值)

在科研绘图和数值结果可视化中,色卡的选择会直接影响读者对数据结构和物理规律的理解。常用的连续型色卡如 plasma、viridis、inferno、magma 和 cividis,都具有较好的亮度单调性和感知一致性,能够真实反映标量场的连续变化。其中,viridis 和 cividis 对色觉缺陷更加友好,适合论文和正式报告;inferno 和 magma 在高值区域对比更强,适合突出极值或强梯度结构。单色系色卡如 Greys、Blues、Purples 和 Oranges 风格简洁,适合误差分布、权重场或辅助变量展示,不会干扰主体信息。对于存在正负对称或偏离参考值的结果,RdYlBu 这类发散型色卡更有助于区分不同符号和变化方向。相比之下,jet 虽然颜色丰富、对比强烈,但亮度变化不连续,容易引入视觉误判,一般不建议用于定量分析,仅适合定性示意。合理选择色卡,可以在不改变数据本身的前提下,显著提升结果的可读性与专业性。

  • plasma
    颜色从深紫色逐渐过渡到洋红色 / 橙色,最终到达亮黄色。整体对比强烈,高值区域亮度高,适合突出极大值结构。

  • viridis
    颜色从深蓝紫色开始,依次过渡为蓝色—绿色,最终到达明亮的黄绿色。亮度单调增加,感知一致性好,适合绝大多数连续标量场。

  • inferno
    颜色由黑紫色起始,逐渐过渡为深红色—橙色,最终到达亮黄色。低值区域非常暗,高值区域突出,适合强调极值和强梯度区域。

  • cividis
    颜色从深蓝色过渡到灰绿色,最终到达浅黄色。亮度变化平滑,对色觉缺陷友好,适合正式论文与工程报告。

  • magma
    颜色由深紫近黑色开始,逐渐过渡为暗红色—橙色,最终达到浅黄色 / 近白色。整体偏暖色调,层次分明,适合能量或强度分布。
    请添加图片描述

  • Greys
    颜色从黑色 / 深灰色逐渐过渡到浅灰色 / 白色。无色相干扰,适合误差场、权重分布或二值/半二值结果展示。

  • Blues
    颜色由浅蓝色逐渐过渡到深蓝色。常用于表示随数值增强的强度、浓度或概率分布。

  • Purples
    颜色从浅紫色逐渐过渡为深紫色。视觉柔和,适合辅助变量或次要物理量展示。

  • Oranges
    颜色由浅橙色逐渐过渡到深橙色。对比明显,适合强调正值或增长趋势的变量。

  • RdYlBu(发散型色卡)
    颜色从红色逐渐过渡到黄色(中值),再到蓝色。常用于展示正负对称分布或相对于参考值的偏差场。

  • jet
    颜色由深蓝色开始,依次过渡为蓝色—青色—绿色—黄色—红色。虽然对比强烈,但亮度变化不连续,可能引入视觉伪影,不推荐用于定量分析,仅适合定性展示

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 1:24:35

mybatis-动态sql语句-<foreach>

循环遍历集合/数组,把集合元素拼接成sql片段,动态处理多个参数的场景就比如:简单场景的:构建IN条件、批量查询用户列表、一次插入多个用户,多对多关联表等等属性属性作用collection要遍历的集合/数组/Map的keyitem …

作者头像 李华
网站建设 2025/12/17 1:22:34

6张表单,管好大客户销售从线索到赢单的全流程

大客户销售这几年越来越难。 需求不稳定、预算紧绷、竞争激烈不少企业这时候会想:“是不是得换 CRM?”其实你冷静一下会发现,问题不是系统,而是你根本没有把销售流程盘实,把关键信息结构化起来。CRM 再贵,再…

作者头像 李华
网站建设 2025/12/17 1:21:58

Leetcode刷题日记15(141-150)

目录 问题1:问题链接:问题描述:实例:代码: 问题2:问题链接:问题描述:实例:代码: 问题3:问题链接:问题描述:实例&#xff1…

作者头像 李华
网站建设 2025/12/17 1:21:39

LobeChat颁奖典礼获奖感言生成

LobeChat:开源时代下的AI交互新范式 在生成式AI席卷全球的今天,我们早已不再满足于“能对话”的聊天机器人。真正的挑战在于——如何让强大的语言模型变得真正可用、可定制、可信赖?当主流平台将用户锁定在封闭生态中时,一个来自开…

作者头像 李华
网站建设 2025/12/17 1:21:36

【必收藏】LLM大模型原理全解析:从预训练到RLHF,一文带你彻底搞懂大语言模型的神奇魔法

文章详细解析了大语言模型(LLM)的核心原理和训练流程,包括预训练阶段通过海量无标注数据建立通用知识,微调阶段针对特定任务进行参数调整,以及强化学习(RL)和基于人类反馈的强化学习(RLHF)如何使模型具备动态自适应能力。文章还介绍了从数据准…

作者头像 李华