资讯动态

seaborn cmap参数完全指南:颜色图分类、名称清单与实际选型

发布时间:2026/10/14 13:41:51 来源:尧图企业网站定制
1. 先拆清楚cmap到底在控制什么凡是接触过用Python画图的朋友早晚都会撞上cmap这个参数。不管你是用seaborn画热力图、密度图还是用matplotlib做散点图、等高线cmap都在后台悄悄决定同一批数值映到屏幕上是什么颜色。很多人第一次查cmap顺手就在搜索引擎里敲seaborn cmap 参数结果翻半天官档还是一头雾水。原因是seaborn里的cmap并不是seaborn自己发明的一套颜色表它默认直接透传给底层matplotlib的colormap接口。换句话说你问seaborn中cmap的全部参数名称本质上是在问matplotlib支持的全部颜色图名称再叠加上seaborn自带的两三个专用色板。把这条底层的传递关系搞明白后面所有参数名都顺理成章。那cmap到底是怎么工作的我这里用一个特别土的类比你把cmap想象成一把尺子尺子左端是颜色A右端是颜色B或者中间经过好几个色标绘图函数拿到你的数据的最小值和最大值之后把数值在这把尺子上一一对应找出每个数据点应该涂什么颜色。数据值小取尺子左端的颜色数据值大取尺子右端的颜色。所以选cmap不是在选好看的颜色而是在选数值到颜色的映射方案。不同的映射方案有不同的视觉语义有的强调由低到高的递进感有的强调两侧对比中央的偏离度有的干脆只做无序分类标记。理解了这一点你再看那一大堆参数名就不会晕。还有一个关键点是cmap的取值形式分两种直接传字符串名称比如cmapviridis这也是最常见、最省事的写法传入一个matplotlib.colors.Colormap对象例如cmapplt.cm.RdBu效果等价但注意plt.cm.RdBu和字符串RdBu指同一个颜色图。在实际操作里字符串写法的可读性更好也方便别人复制你的代码去复现所以我个人推荐一律用字符串。为了方便后续对照我先给你一张速查表把所有可用的cmap分类列清楚。这张表稍后我会逐类拆开细讲。大类典型cmap名称适用数据形态Perceptually Uniform Sequential感知均匀顺序色图viridis, plasma, inferno, magma, cividis有序数值从低到高Sequential单色渐变顺序色图Greys, Blues, Greens, Oranges, Reds, Purples, YlGnBu, BuPu 等有序数值强调递进Diverging发散色图RdBu, RdYlGn, coolwarm, bwr, seismic, PiYG, PRGn, BrBG 等有明确中点的偏离数据Qualitative定性分类色图Pastel1, Set2, tab10, Accent, Dark2, Paired 等无序类别标记Cyclic循环色图twilight, twilight_shifted, hsv首尾相接的循环数据Miscellaneous杂项flag, prism, gist_rainbow, cubehelix, terrain, ocean 等特殊用途后面你会看到seaborn的heatmap、kdeplot、histplot、scatterplot、lineplot这些常用函数全都可以用上表中的名称。你只要把这个表消化掉cmap参数对你来说就不存在还有什么名字的问题了。2. 我把seaborn可用的cmap参数名称按类别全列出来这一节是全文的核心清单部分。我把全部可用的颜色图名称按类别列成表格并在每个表格后面补上该系列的视觉特征和使用注意点。下面这份清单以matplotlib 3.x为基准seaborn的cmap参数能接收的就是这些少一个都不全。2.1 感知均匀顺序色图默认首选系列viridis恐怕是你在各种教程里见到最多的一个词。当年它被设计出来就是为了替代老旧的jet因为jet在亮度上存在明显不连续的带状干扰会让同数值区域看起来像是分成了好几段而viridis在感知上是均匀变化的也就是说数值每增加相同幅度你感知到的颜色变化幅度也差不多。这个系列包含cmap名称颜色走向备注viridis深紫 → 蓝绿 → 黄最均衡无脑首选plasma深紫 → 红 → 橙 → 浅黄偏暖暗部细节略好inferno黑 → 紫红 → 橙 → 浅黄暗部更“压得住”magma黑 → 紫红 → 橙 → 浅米白亮部偏柔和cividis深蓝紫 → 黄针对色觉缺陷优化我在实测中的感受是如果你只打算记住一个cmap那就记viridis。不仅仅是因为它好看更重要的是它对印刷、投影、灰度转换都相对友好。cividis是这里面比较低调的一个它专为红绿色盲人群优化颜色跨度不如viridis那么鲜艳但在需要面向大众展示的场合它反而是更稳妥的选项。2.2 单色渐变顺序色图最常用的大族单色渐变系列是一个非常庞大的族几乎所有颜色都按“浅 → 深”排布用来表达数值从低到高的积累感。这个族里有些名字连带着地理或者传统制图风格比如Blues、Greens、Reds非常直观。完整清单如下cmap名称基色适用场景Greys灰出版灰度图Purples紫通用序列Blues蓝水质、温度、覆盖率类Greens绿植被、增长类Oranges橙热量、速率类Reds红风险、热度类YlOrBr黄→橙→棕含高亮段的序列YlOrRd黄→橙→红预警、热度OrRd橙→红紧凑序列PuRd紫→红生物医学常用RdPu红→紫偏冷感序列BuPu蓝→紫高雅渐变GnBu绿→蓝海洋与生态PuBu紫→蓝科技感序列YlGnBu黄→绿→蓝经典气象配色PuBuGn紫→蓝→绿冷色渐深BuGn蓝→绿冷色序列YlGn黄→绿农业、增长率bone蓝黑→白医学影像类gray纯黑→白灰度图像binary白→黑二值信号gist_yarg黑→白反转灰度gist_gray各向同性灰度低频细节hot黑→红→黄→白温度、能量copper黑→铜棕老旧工程图风格Wistia浅黄→深黄柔和渐变autumn红→橙→黄季节、暖色序列spring品红→黄暖色亮调summer绿→黄冷转暖渐变winter蓝→绿冷色渐变cool青→品红光谱渐变gist_heat黑→红→橙→黄热力图经典这个系列最大的特点是“方向性强”。数值越小颜色越接近底色通常是白/浅色数值越大颜色越深。在seaborn的heatmap里如果用Blues那么低值区域几乎接近白色高值区域偏深蓝这种天然的低调背景非常适合做汇报用的图。2.3 发散色图有中点、有对比发散色图专门用来表达“偏离”的概念数据存在一个中间点通常为0或平均值向两侧分别是相反的意义。比如温度正负、增长率上下、情绪正负评分都需要这种色图。完整清单cmap名称中点颜色两端颜色RdBu白红/蓝RdYlBu米白红/蓝RdYlGn米白红/绿RdGy白红/灰PiYG浅米白品红/黄绿PRGn浅米白紫/绿BrBG浅米白棕/蓝绿PuOr浅米白紫/橙coolwarm灰白蓝/红bwr白蓝/红seismic白深蓝/深红spectral黄红/蓝绿用发散色图时有一个很常见的坑如果不把数据的vmin和vmax对齐到对称的范围中点颜色对应的不一定是数值的中点图形会把读者带偏。比如一组数据范围是-5到15直接用RdBu白色出现在0附近而不是数值范围的中点视觉上的“零值”位置就和实际数据的平衡点错位了。所以用发散色图之前建议先看数据的分布必要时手动设置vmin-15, vmax15之类对称边界。2.4 定性分类色图谁是谁不排队分类数据没有大小、先后、高低之分只有“是不是同一个类别”的区别。因此分类色图的颜色之间不追求渐变而是追求彼此差异尽量大。seaborn和matplotlib里的分类色图名称主要来自tab系列和Set系列cmap名称类别数上限特征tab1010matplotlib默认分类色类似Excel配色tab202010对颜色每对有深浅两种tab20b20另一种20色调色板tab20c20更柔和的20色板Pastel19粉嫩轻柔Pastel28偏灰粉彩Set19鲜艳但第6色偏黄Set28粉彩但更有区分度Set312粉彩多类别时好用Accent8高饱和点缀Dark28深色系适用于有白底的图Paired12配对深浅适合对照前后状态有一个容易混淆的点在seaborn里分类数据的颜色通常不是通过cmap控制的而是通过palette参数控制的。cmap参数主要用在数值型映射的场景比如heatmap的数值色块、kdeplot的密度色带。但如果你偏要用cmap去给一组分类类别上色用上面这批定性色图也能达到效果只是要注意类别数最好不超过色图的类数上限否则相邻类别容易撞色。2.5 循环色图和杂项循环色图表示的是首尾相接的数据比如一天内的时间变化、方位角度、周期性波形。这类数据用普通顺序色图会在首尾相接处产生一个突兀的颜色跳变用循环色图就能让颜色自然接上。cmap名称特征twilight首尾同色从蓝到红再到蓝twilight_shiftedtwilight的相位偏移版hsv完整色相环饱和度最高HSVhsv的连续平滑版hsv_r反向hsv杂项色图用途比较特殊cmap名称特征flag红白蓝黑四色锯齿状交替prism六色棱镜交替gist_rainbow彩虹渐变旧式绚烂色rainbow彩虹匀色版jet经典彩虹色但存在亮度伪影cubehelix亮度渐变的螺旋色图terrain地形的海拔渐变绿→黄→棕→白ocean海洋蓝→绿→白gist_earth低饱和地球调gist_stern蓝黑渐变带白色高亮gist_ncar彩色科学绘图nipy_spectral类无垠光谱版turbojet的改进版颜色更均匀且不刺眼这些杂项里我特别说一下cubehelix。它是一条螺旋式扫过色轮的亮度渐变带颜色从深到浅但因为每转一个角度色相就变一次能在黑白印刷和彩色显示下同时保持一定的区分度做地形、密度表达都挺有意思。3. 如何按数据形态选对cmap匹配原则和实测体会上面的清单虽然全但每个人打开绘图软件第一反应还是一个问题我到底该选哪个这一节我把选型逻辑拆成几个看得见摸得着的判断规则顺便放上我自己的实测感受。3.1 三问法快速锁定候选集合拿到数据之后先问自己三个问题第一数据有没有大小顺序如果只是“苹果、香蕉、西瓜”这种类别直接看定性分类色图如果有大小顺序进入第二问。第二数据是否存在天然的中点比如变化率、差值、涨跌幅这类带符号的数据选择发散色图如果是计数、百分比、浓度选择顺序色图。第三你希望读者第一眼关注哪个区域如果希望高值区最醒目选YlOrRd、Reds这类亮色收尾的色图如果希望低值区不压抑选Blues、Purples这类浅色开头的色图如果希望全面均衡直接viridis。这三个问题几乎能应对90%的日常画图需求。我自己的经验是不要一上来就纠结选哪个具体的名字先确定大类大类定下来以后同类色图之间换个名字只是调调色相影响远没有想象中那么大。3.2 发散色图的对称边界我对这个点特别有感触因为前几年做一个模拟项目时我拿到一组预测误差范围是-8到12当时图省事直接cmapRdBu往heatmap里一丢结果出来的图中间白色部分被推到靠近色带左端的位置看起来好像是“数据整体偏高”误导了我整整一个下午。之后的教训是用发散色图之前先算一下数据的绝对值上限手动把vmin和vmax对称设置。import numpy as np import seaborn as sns import matplotlib.pyplot as plt data np.random.normal(2, 5, size(10, 10)) # 手动对称边界 max_abs np.max(np.abs(data)) sns.heatmap(data, cmapRdBu, vmin-max_abs, vmaxmax_abs) plt.show()这样色带中点的白色才能真正代表数值0图才不会骗人。3.3 色觉安全与打印安全很多人在屏幕上看得津津有味的色图一旦投影到教室大屏或者打印成黑白稿立刻就“糊成一团”。这里我要提名两个相对安全的系列viridis和cividis是色觉安全的Greys是纯灰度最保险的RdBu在彩色下很好用但如果要打印成黑白红蓝两端的亮度几乎拉不开差距这时候就要考虑RdGy。实操中最简单的自检方法是把图转成灰度看看还能不能读出趋势。import matplotlib.pyplot as plt fig, ax plt.subplots(1, 2, figsize(10, 4)) # 原图 sns.heatmap(data, cmapRdBu, axax[0]) ax[0].set_title(Color) # 模拟灰度 from matplotlib import image # 如果是在notebook里直接对图形对象的canvas做一次灰度处理也可以 # 更简单的验证方法是直接保存图片后用看图软件去色查看这个步骤虽然土但效果立竿见影。3.4 类别数限制的硬约束定性色图都有一个“类数上限”。Set1只有9个有效色第10个类别开始就会循环tab10最多10个tab20名义上20个但事实上中间有很多颜色非常接近远看容易混淆。我个人的建议是类别在8个以内的用Set2或tab10类别在8到12个之间的用Set3或tab20类别超过12个别为难色图了先想想是不是该合并类别或者换其他视觉通道来区分。4. seaborn常用绘图函数里cmap的真实用法清单背熟了选型逻辑也会了但很多人还是会把cmap写错位置。seaborn不同函数对cmap的支持程度不一样我挑最常用的几个逐个说明。4.1 heatmap最直接的cmap消费大户heatmap是seaborn里最依赖cmap的函数。基本用法要么直接传字符串要么用cmap配合center参数使发散色图居中import seaborn as sns import numpy as np import matplotlib.pyplot as plt data np.random.randn(8, 8) # 顺序色图 sns.heatmap(data, cmapviridis, annotTrue, fmt.2f) plt.show() # 发散色图并指定中心值 sns.heatmap(data, cmapcoolwarm, center0) plt.show()heatmap里还可以通过vmin和vmax手动限定色带范围特别适合多张热力图横向比较时统一尺度。否则每张图都各自把最大最小值当成色带两端两张图就会有色差误导。4.2 histplot / kdeplot密度分布的颜色编码histplot和kdeplot用cmap来给密度值着色。一个常见需求是画出双变量分布的核密度估计这个时候cmap就需要传给fill模式import seaborn as sns import numpy as np x, y np.random.randn(2, 500) sns.kdeplot(xx, yy, cmapmagma, fillTrue, thresh0) plt.show()注意这两个函数在seaborn 0.12之后对palfill的显示逻辑有细微调整如果你发现颜色没有像预期那样布满整个区域可以检查是否传了thresh0。thresh不设为0时低密度区域可能直接被截断成白色。4.3 scatterplot / lineplot连续数值映射到颜色scatterplot里用cmap的场景是“点的颜色随某一个数值列变化”比如地理坐标点上标的污染物浓度import seaborn as sns import pandas as pd df pd.DataFrame({ x: np.random.rand(100), y: np.random.rand(100), value: np.random.rand(100) * 100 }) sns.scatterplot(datadf, xx, yy, huevalue, paletteviridis, size20) plt.show()这里注意一个非常容易踩的坑在scatterplot里如果你想用一个连续变量映射颜色参数名不是cmap而是palette。paletteviridis的效果本质上是借用了viridis这个色图但关键字是palette。只有在matplotlib的scatter中连续映射才直接使用cmap参数名。# matplotlib原生方式 plt.scatter(df[x], df[y], cdf[value], cmapviridis) plt.colorbar() plt.show()lineplot的逻辑类似当hue对应一个连续数值列时也可以通过palette进行颜色渐变但线条图里用渐变色的情况不多更多是用palette配合分类变量。4.4 PairGrid和FacetGrid中cmap的传递seaborn高阶绘图里PairGrid或FacetGrid通过map方法将绘图函数应用到多个子图cmap自然也能传递进去import seaborn as sns iris sns.load_dataset(iris) # 这里以内置数据为例 g sns.PairGrid(iris, diag_shareyFalse) g.map_upper(sns.scatterplot, ciris[sepal_length], cmapplasma)这类用法虽然复杂但理解了cmap只是被最终传给底层散点函数之后就不难举一反三。5. 常见误区与实战踩坑记录最后这部分是我多年来反复看到的坑也是很多人查cmap参数名称时真正想解决的问题。5.1jet和rainbow到底能不能用能但要分场合。jet在数据量小、变化简单的图里没什么问题但数据一旦平滑过渡就会在黄绿、青蓝交界处产生带状伪影让读者误以为那里存在“分层”或“突变”。如果你是在严谨的数据分析报告里用强烈建议避开jet、rainbow、hsv这些高饱和度的彩虹类色图。turbo算是jet的改进版颜色同样鲜艳但亮度曲线比jet平滑得多如果甲方就是喜欢彩色丰富的图turbo是个不错的折中方案。5.2_r反向后缀所有颜色图名称后面都可以加_r变成反序版本比如viridis_r就是从黄到深紫的反向排列。这个后缀极其实用比如你想让高值显示成深色、低值显示成浅色直接cmapBlues_r即可不用重排数据。在实际操作中反向色图还经常用来和原版形成对比图。比如两个并排的热力图左边用RdBu右边用RdBu_r可以直观表达相反的意义。5.3 heatmap默认参数对cmap的影响heatmap里有个square参数如果设成True单元格变成正方形视觉上颜色面积更大对亮色区域更敏感如果不设单元格矩形拉伸长宽同样一块颜色在视觉上的冲击力会弱一些。不要在还没设置square和cbar之前就评价一张热力图“颜色太丑了”往往换个参数显示效果就完全不一样。5.4 自定义色图的边界如果你实在找不到合心意的颜色图seaborn提供了color_palette来创建自定义色图然后传给cmap使用import seaborn as sns import matplotlib.pyplot as plt my_colors sns.color_palette(light:#5A9, as_cmapTrue) sns.heatmap(data, cmapmy_colors) plt.show()或者用LinearSegmentedColormap.from_list按自己的颜色列表生成from matplotlib.colors import LinearSegmentedColormap import numpy as np colors [#2b83ba, #abdda4, #ffffbf, #fdae61, #d7191c] custom_cmap LinearSegmentedColormap.from_list(my_cmap, colors) sns.heatmap(data, cmapcustom_cmap)自定义色图适合品牌色统一、企业模板定制等场景但注意不要让自定义色图破坏感知均匀性如果只是想换个色相优先在官方色图里找。5.5 终极大坑cmap写错关键字的后果cmap是matplotlib风格的关键字seaborn里有的函数接受它有的接受palette有的两者都接受。比如heatmap(cmap...)没问题scatterplot(palette...)没问题但你把scatterplot(cmapviridis)一写某些版本会直接报错或静默忽略。最好在写代码前用plt.cm.get_cmap(viridis)确认一下这个名称是否存在import matplotlib.pyplot as plt try: cmap plt.get_cmap(viridis) print(存在类型, type(cmap)) except ValueError: print(这个名称不合法)彩色的名字是小事但代码能不能跑通就是另一回事了。每次换新环境、新版本之前这条光速检查能帮你省下不少折腾时间。用cmap这件事说穿了就是“先懂语义再记名字”。色图名称背全了分类逻辑也清楚了真正画图的时候反而不需要刻意回忆名字数据的长相会直接告诉你该翻哪个分类。我最常用的组合其实是viridis处理探索阶段、RdBu处理带中心值的对比、tab10处理分类清单建议你也从这三个开始用起把它们的手感彻底摸透之后再去尝试更多花式颜色图踩坑的概率会小很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑