news 2026/6/10 17:59:06

如何在 Matplotlib 中创建自定义颜色调色板 – 离散与线性颜色映射,解释说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 Matplotlib 中创建自定义颜色调色板 – 离散与线性颜色映射,解释说明

原文:towardsdatascience.com/how-to-create-custom-color-palettes-in-matplotlib-discrete-vs-linear-colormaps-explained-cfe4c5ba1215

如果有一件事能让好图表变得出色,那就是颜色选择。

您可以使用 Matplotlib 将任何一组十六进制颜色代码转换为颜色调色板,本文将向您展示如何操作。您还将了解离散和线性颜色调色板之间的区别,以及为什么一个比另一个更好。

如果您想要获得与我相同的数据可视化质量,请在继续之前先遵循本文中的步骤:

  • 现在必须立即更改的 3 个关键事项,以使您的图表脱颖而出

如何在 Matplotlib 中创建自定义颜色映射

这些是您需要跟踪的库:

importnumpyasnpimportpandasaspdimportmatplotlibasmplimportmatplotlib.pyplotasplt

Matplotlib 允许您创建两种类型的颜色调色板:

  • 离散– 调色板具有有限数量的颜色值。非常适合分类数据,但您需要确保调色板中的颜色数量至少与您具有的不同类别数量相同。

  • 线性(连续)– 调色板具有“无限”数量的值。非常适合连续和分类数据。您可以指定两种颜色,调色板将自动包含它们之间的所有值(例如:Photoshop 中的渐变)。

要在 Matplotlib 中创建离散颜色调色板,请运行以下代码:

cmap_discrete=mpl.colors.ListedColormap(name="discrete-monochromatic-blue",colors=["#051923","#003554","#006494","#0582ca","#00a6fb"])cmap_discrete

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/29a685bbb385aaaaccbda2505da3ef22.png

图像 1 – 离散颜色映射(作者图片)

要创建一个线性(连续)颜色调色板,请运行以下代码片段:

cmap_linear=mpl.colors.LinearSegmentedColormap.from_list(name="linear-monochromatic-blue",colors=["#051923","#003554","#006494","#0582ca","#00a6fb"])cmap_linear

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3a000093508d34bd6ad817afe883f10d.png

图像 2 – 线性颜色映射(作者图片)

你可以看到离散调色板有 5 种不同的颜色,而线性调色板则包含一个连续的值范围。

可视化数据时有什么区别?这正是你接下来要学习的。

对比 – 连续数据上的离散与线性颜色映射

在本节中,您将创建一个 0.0, 1.0)范围内的随机数字 10×10 矩阵,并将其可视化为图像。

运行以下代码片段来创建数据:

data=np.random.random(100).reshape(10,10)data

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc779f7d2c36992de6e20b1e5c918d2c.png

图像 4 – 离散与线性颜色映射(作者图片)

基础数据是相同的,但左侧的图表可以占用多达 5 种可能的颜色值。右侧的图表范围更广。

总结– 线性调色板可以用来可视化连续和分类数据,而离散调色板只能做到后者,且不会丢失信息。

实际图表 – 如何为你的图表添加自定义颜色

你现在将看到如何将自定义调色板应用于 Matplotlib 的条形图。

首先,复制以下代码片段以创建跨越 10 个部门和 5 个办公地点的模拟员工数量数据:

df=pd.DataFrame({"HR":[50,63,40,68,35],"Engineering":[77,85,62,89,58],"Marketing":[50,35,79,43,67],"Sales":[59,62,33,77,72],"Customer Service":[31,34,61,70,39],"Distribution":[35,21,66,90,31],"Logistics":[50,54,13,71,32],"Production":[22,51,54,28,40],"Maintenance":[50,32,61,69,50],"Quality Control":[20,21,88,89,39]},index=["New York","San Francisco","Los Angeles","Chicago","Miami"])df=df.T df=df.loc[df.sum(axis=1).sort_values().index]df

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/993b6306b461a2ca75352b9741f108a9.png

图像 5 – 自定义员工数据集(作者图片)

由于有 5 个办公地点,我们的离散调色板有 5 种颜色,这对于可视化来说是一个完美的匹配。

plot()函数中,你需要了解的唯一新参数是colormap。你必须提供你的调色板变量。我已经为每个条形段添加了员工数量,但考虑这部分是可选的:

ax=df.plot(kind="barh",colormap=cmap_discrete,width=0.8,edgecolor="#000000",stacked=True)forcontainerinax.containers:ax.bar_label(container,label_type="center",fontsize=10,color="#FFFFFF",fontweight="bold")plt.title("Employee Count Per Location And Department",loc="left",fontdict={"weight":"bold"},y=1.06)plt.xlabel("Office Location")plt.ylabel("Count")plt.show()

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a40575f9466cf63d56f8267973b5e1ec.png

图像 6 – 带自定义离散调色板的堆叠水平条形图(作者图片)

看起来不错,不是吗?

在比较这种可视化中的离散和线性调色板时,你不应该看到任何差异。为什么?因为离散调色板有 5 种颜色,而你的数据中有 5 组。

尽管如此,让我们定义一个函数来比较两种调色板类别:

defplot_employee_count_comparison(df,cmap1,cmap2):_,(ax1,ax2)=plt.subplots(1,2,figsize=(18,7),sharex=True,sharey=True)df.plot(kind="barh",colormap=cmap1,width=0.8,edgecolor="#000000",stacked=True,ax=ax1)forcontainerinax1.containers:ax1.bar_label(container,label_type="center",fontsize=10,color="#FFFFFF",fontweight="bold")ax1.set_title("Employee Count (Discrete Colormap)",loc="left",fontdict={"weight":"bold"},y=1.06)ax1.set_xlabel("Count")ax1.set_ylabel("Department")df.plot(kind="barh",colormap=cmap2,width=0.8,edgecolor="#000000",stacked=True,ax=ax2)forcontainerinax2.containers:ax2.bar_label(container,label_type="center",fontsize=10,color="#FFFFFF",fontweight="bold")ax2.set_title("Employee Count (Linear Colormap)",loc="left",fontdict={"weight":"bold"},y=1.06)ax2.set_xlabel("Count")ax2.set_ylabel("Department")# Adjust layoutplt.tight_layout()plt.show()plot_employee_count_comparison(df=df,cmap1=cmap_discrete,cmap2=cmap_linear)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/92c21225b58bdde2ba4a33f185d459ed.png

图像 7 – 离散与线性色图(相同结果)(作者图片)

两个图表是相同的。但情况并不总是这样。

当你在离散调色板中颜色少于类别时会发生什么?

好问题。让我们通过扩展 Pandas DataFrame 来包括两个额外的办公地点来回答它:

df=pd.DataFrame({"HR":[50,63,40,68,35,44,31],"Engineering":[77,85,62,89,58,56,59],"Marketing":[50,35,79,43,67,31,24],"Sales":[59,62,33,77,72,55,66],"Customer Service":[31,34,61,70,39,49,81],"Distribution":[35,21,66,90,31,67,81],"Logistics":[50,54,13,71,32,58,51],"Production":[22,51,54,28,40,41,62],"Maintenance":[50,32,61,69,50,49,41],"Quality Control":[20,21,88,89,39,66,32]},index=["New York","San Francisco","Los Angeles","Chicago","Miami","Las Vegas","Boston"])df=df.T df=df.loc[df.sum(axis=1).sort_values().index]df

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0761cc0a1ef3f43a896843e56e8a741c.png

图像 8 – 自定义员工数据集(2)(作者图片)

理论上,离散调色板应该会失败,因为它只有 5 种颜色值,而数据集有 7 个类别。

让我们使用plot_employee_count_comparison()函数来查看差异:

plot_employee_count_comparison(df=df,cmap1=cmap_discrete,cmap2=cmap_linear)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8aafb8da5c60ffacf5c011dfefdfa3d7.png

图像 9 – 离散与线性色图(不同结果)(作者图片)

左侧的图表不可用。

只看第一列的员工数量组合(77, 85)和(56, 59)。它们使用的是相同的颜色!Matplotlib 使用图表中心的颜色,边缘则取自邻近的点。

简而言之,不是你想要的。

即使只使用两种颜色构建,线性颜色调色板也不会出现这类问题。


总结

总结来说,自定义颜色调色板可能是你的图表需要的,使其成为值得发表的图表。

此外,如果你在一家公司工作,很可能他们已经定义了一套颜色。从一开始就使用它们是确保至少减少一次提交迭代的可靠方法。

Matplotlib 使得创建自定义的离散和线性颜色调色板变得轻而易举。两者都可以用于分类数据,但只有后者在连续数据上才能正常工作。在这个用例中,离散颜色调色板是过时的,因为你可以用线性调色板得到相同的结果(甚至更多)。

你最喜欢的数据可视化颜色组合是什么?请在下面的评论部分分享。


想要提升你的数据可视化技能?加入我的 Substack,与成千上万志同道合的人一起获取专家建议和独家内容。

使用 Python 进行数据涂鸦 | 达里奥·拉德齐克 | Substack

最初发布于darioradecic.substack.com

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

LangFlow代码生成辅助工具实战搭建

LangFlow代码生成辅助工具实战搭建 在大语言模型(LLM)迅速普及的今天,越来越多团队希望快速验证AI创意——比如构建一个能自动回答客户问题的智能客服,或是一个基于私有知识库的问答助手。然而,直接使用 LangChain 编程…

作者头像 李华
网站建设 2026/6/9 18:48:25

新手教程:手把手教你掌握DRC基本概念与使用场景

从零开始搞懂DRC:为什么你的版图总被“红标”?你有没有过这样的经历——辛辛苦苦画完一块模拟电路,信心满满点下“DRC检查”,结果屏幕上突然冒出几百个红色标记,满屏都是“Violation”?更离谱的是&#xff…

作者头像 李华
网站建设 2026/6/10 13:46:51

为什么你的Mac工作效率总是不高?窗口置顶工具Topit彻底改变工作方式

你是否经常在多个应用窗口间来回切换,只为找到那个被埋没的重要文档?或者因为终端窗口被浏览器覆盖而中断了关键的编译过程?这些看似微小的效率损失,正是Topit窗口置顶工具要为你解决的痛点。 【免费下载链接】Topit Pin any wind…

作者头像 李华
网站建设 2026/6/10 13:42:54

谷歌闪电突袭:Gemini 3免费开放引爆AI革命

一、闪电突袭:免费开放的战略核爆 2025年12月18日凌晨,谷歌以“无预告突袭”方式发布Gemini 3 Flash,并宣布即日起取代前代成为全球数亿Gemini用户的默认免费模型——这意味着普通用户无需付费即可享受Gemini 3系列的顶尖推理能力45。 狙击Op…

作者头像 李华
网站建设 2026/6/10 9:21:45

LangFlow网络安全态势感知系统雏形

LangFlow网络安全态势感知系统雏形 在当今企业网络边界日益模糊、攻击手段愈发隐蔽的背景下,安全团队每天面对的是TB级的日志数据、千变万化的攻击载荷,以及“黄金一小时”应急响应压力。传统的SIEM规则引擎虽然稳定,但面对APT攻击、凭证滥用…

作者头像 李华