当前位置: 首页 > news >正文

科研绘图中的色卡选择与高级 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
    颜色由深蓝色开始,依次过渡为蓝色—青色—绿色—黄色—红色。虽然对比强烈,但亮度变化不连续,可能引入视觉伪影,不推荐用于定量分析,仅适合定性展示

http://www.gsyq.cn/news/112598.html

相关文章:

  • Git撤销修改:git restore . 与 git reset --hard 万字详解
  • 本周GitHub九大神级项目推荐,轻松入门大模型技术,错过就是遗憾!
  • Leetcode刷题日记17(161-170)
  • TensorFlow调试报错看不懂?LobeChat帮你解读
  • Leetcode刷题日记18(171-180)
  • LobeChat百度收录加速方法
  • 软件测试基础知识最强总结
  • python的fastapi+uvicorn的linux离线部署
  • LobeChat镜像部署指南:快速搭建属于你的开源ChatGPT聊天界面
  • 1、掌握 Linux 脚本编程:从基础到高级应用
  • vue基于Springboot框架的健身房私教预约系统的设计与实现ee3c45b3
  • 4、创建交互式脚本
  • 5、交互式脚本创建与条件语句使用指南
  • 7、深入理解 Linux 网络名称服务与解析器配置
  • Windows 查看本次开机时间
  • 基于SpringBoot的农村人口信息管理系统
  • C#属性访问器Set与Get详解
  • K8S总结与展望:Service Mesh、Serverless 及 K8S 发展趋势
  • 唾液基乳糖-N-四糖 A 铵盐— 赋能下一代营养与疗法的关键母乳寡糖 CAS:64003-53-8
  • 网络爬虫相关操作--selenium库(超详细版)
  • 麒麟系统运行LobeChat是否流畅?实测告诉你答案
  • 二唾液酸乳糖—赋能婴幼儿营养与免疫调节的明星母乳寡糖 CAS号: 18409-15-9
  • LobeChat留学申请文书辅助撰写
  • 480万人才缺口下的机遇:零基础如何靠“实战力”闯入网络安全?
  • 分享夸克网盘解析不限速下载的工具网站
  • 第三次个人博客作业
  • 2025零基础通关网络安全:一篇涵盖从入门到精通的保姆级指南
  • 0基础转行网络安全,到底行不行?附全网最全人才发展路线图
  • 零基础转行网络安全:一份2025年最新学习路线图与入门指南
  • 15、Red Hat Linux实用指南:设备连接、软件应用与多媒体体验