当前位置: 首页 > 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.jsqmd.com/news/101799/

相关文章:

  • 基于Java Swing的排序算法可视化器(1)
  • 大语言模型(LLM)学习秘籍:从初学者到专家的必经之路,数学基础与工程实战全解析!
  • RAG聊天机器人终极优化指南
  • Git撤销修改:git restore . 与 git reset --hard 万字详解
  • LobeChat + GPU算力 高效私有化部署AI聊天系统
  • 电子邮件营销模板:LobeChat编写个性化正文
  • mybatis-动态sql语句-<foreach>
  • Leetcode刷题日记15(141-150)
  • LobeChat文件上传功能详解:图文混合输入不再是难题
  • Leetcode刷题日记16(151-160)
  • 本周GitHub九大神级项目推荐,轻松入门大模型技术,错过就是遗憾!
  • Leetcode刷题日记17(161-170)
  • TensorFlow调试报错看不懂?LobeChat帮你解读
  • Leetcode刷题日记18(171-180)
  • LobeChat研究方向建议生成AI
  • 基于PLC控制的四路抢答器设计
  • 【Java SE 基础学习打卡】25 循环结构 - for
  • 2025年度最佳远控软件评选:十佳品牌出炉,国产软件居多!
  • 自动化测试:Java+Selenium自动化测试环境搭建
  • LobeChat百度收录加速方法
  • 软件测试基础知识最强总结
  • python爬虫学习(搜索)
  • DownKyi终极指南:5步掌握B站视频批量下载技巧
  • python的fastapi+uvicorn的linux离线部署
  • 9、循环迭代与函数构建:脚本编程的核心技巧
  • LobeChat与IPFS结合实现去中心化聊天存档
  • LobeChat镜像部署指南:快速搭建属于你的开源ChatGPT聊天界面
  • Jmeter+Jenkins接口压力测试持续集成
  • 从 JavaScript 到 Python:前端工程师的完全转换指南
  • 大雪深埋强化课划重点|保号性专题