news 2026/6/10 15:38:42

如何创建自定义 Matplotlib 主题,并让您的图表从无聊变得精彩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何创建自定义 Matplotlib 主题,并让您的图表从无聊变得精彩

原文:towardsdatascience.com/how-to-create-a-custom-matplotlib-theme-and-make-your-charts-go-from-boring-to-amazing-bb2998945c8f

每个 Matplotlib 图表都有可能走红。但不是使用默认主题。

让我们坦诚地说:默认样式不会阻止任何人停下来。如果您想让读者注意,您需要的不仅仅是分辨率提升或新字体。您需要一个自定义主题。

这是让您的图表看起来像您自己的唯一方法。这是让您的读者停止滚动查看的唯一方法。好消息是?Matplotlib 使从头开始编写自定义样式表变得极其简单。更好的是——您可以让您的自定义主题在系统范围内可用!

在今天的文章中,您将学习如何做到这一点。

您需要用于绘制条形图和折线图的两个函数

为了可重复性,我将为您提供两个用于绘制条形图和折线图的函数。

设置自定义 Matplotlib 主题的目标不是改变底层 Python 代码——而是让它保持原样——并看看视觉上的差异。

这里是您需要跟踪的库:

importnumpyasnpimportmatplotlibasmplimportmatplotlib.pyplotasplt

让我们来看看这两个函数。

条形图

plot_bar()函数创建了一个堆叠条形图,表示每个地点和部门的员工数量。

数据完全是虚构的,唯一“硬编码”的部分是标题的y位置。它略微增加,以在标题和绘图之间创造更多空间。

在调用此函数时,您可以调整legend_pos值。我故意使这部分可调整,以便您可以调整图例的偏移量。它总是会有所不同,所以有一些灵活性是很好的。

其他一切都是相当简约且不言自明的:

defplot_bar(legend_pos:tuple=(1.25,1)):x=np.array(["New York","San Francisco","Los Angeles","Chicago","Miami"])y1=np.array([50,63,40,68,35])y2=np.array([77,85,62,89,58])y3=np.array([50,35,79,43,67])y4=np.array([59,62,33,77,72])plt.bar(x,y1,label="HR")plt.bar(x,y2,bottom=y1,label="Engineering")plt.bar(x,y3,bottom=y1+y2,label="Marketing")plt.bar(x,y4,bottom=y1+y2+y3,label="Sales")plt.title("Employee Count Per Location And Department",y=1.06)plt.xlabel("Office Location")plt.ylabel("Count")plt.legend(bbox_to_anchor=legend_pos)plt.show()

折线图

plot_line()函数与它非常相似,但它显示了虚构的年度收入。

换句话说,它显示了从 2018 年到 2023 年每个办公地点产生的收入折线图:

defplot_line(legend_pos:tuple=(1.25,1)):x=[2018,2019,2020,2021,2023]ny=[100,124,154,133,167]sf=[89,95,109,139,155]la=[107,144,179,161,175]ch=[59,91,99,117,141]mi=[121,99,104,131,140]plt.plot(x,ny,label="New York")plt.plot(x,sf,label="San Francisco")plt.plot(x,la,label="Los Angeles")plt.plot(x,ch,label="Chicago")plt.plot(x,mi,label="Miami")plt.title("Yearly Revenue",y=1.06)plt.xlabel("Year")plt.ylabel("Revenue (M)")plt.legend(bbox_to_anchor=legend_pos)plt.show()

那么,这些图表默认看起来如何?

一个看起来糟糕的例子

正如标题所暗示的那样——糟糕。我的确是指糟糕。

您亲自看看,如果出现重叠,可以随意调整图例偏移量:

plot_bar(legend_pos=(1.32,1))plot_line(legend_pos=(1.05,1))

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

图片 1 – 丑陋的条形图(图片由作者提供)

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

图片 2 – 丑陋的折线图(图片由作者提供)

字体一般,颜色无聊,分辨率不合理低。

您不希望与您的同事分享,更不用说与您的老板分享了。自定义主题可以解决上述所有问题,甚至更多。

Matplotlib 样式表 – 如何创建自定义 Matplotlib 主题

首先,创建一个以.mplstyle扩展名的文件。我将其命名为custom.mplstyle

在此文件中,您可以调整所有与 Matplotlib 相关的内容(实际上是一切)。我会保持简单,并更改一些将产生巨大差异的事情:

  • 通用调整– 默认图形大小和分辨率,调色板(Tableau 颜色盲调色板),以及绘图边框。

  • 文本– 自定义字体(必须在您的系统上安装),字体大小,标题位置和样式,以及轴标签/刻度的尺寸。

  • 图例– 位置和表示单个项目的数据点数量。

  • 网格– 总是显示图表内容后面的浅灰色虚线。

  • 图表类型特定调整– 折线图中线的默认宽度,以及包括标记。

将以下内容粘贴到您的.mplstyle文件中:

# Generic figure tweaksfigure.figsize:10,6figure.dpi:125savefig.dpi:300savefig.bbox:tight axes.prop_cycle:cycler("color",["006ba4","ff800e","ababab","595959","5f9ed1","c85200","898989","a2c8ec","ffbc79","cfcfcf"])axes.spines.top:Falseaxes.spines.right:False# Textfont.size:14font.family:sans-serif font.sans-serif:IBM Plex Sans axes.titlesize:20axes.titleweight:bold axes.titlelocation:left axes.labelsize:large xtick.labelsize:medium ytick.labelsize:medium# Legendlegend.loc:"upper right"legend.numpoints:3legend.scatterpoints:3# Gridaxes.grid:Trueaxes.axisbelow:Truegrid.color:"#d3d3d3"grid.linestyle::grid.linewidth:1.0# Line chart onlylines.linewidth:3lines.marker:o lines.markersize:8

那么,您如何在 Python 中引用此文件?

一个看起来很棒的例子

您只需添加一行代码即可使用您的自定义主题:

您只需添加一行代码即可使用您的自定义主题:

plt.style.use("custom.mplstyle")

做这件事的一个典型位置是在导入 Matplotlib 之后。这不是强制性的,只是最佳实践。

这就是您的图表现在将看起来像什么:

plot_bar()plot_line()

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

图像 3 – 精美的条形图(作者图片)

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

图像 4 – 精美的折线图(作者图片)

相同的代码,但视觉效果差异天差地别,至少可以说。

如何使您的自定义 Matplotlib 主题全局可用

mplstyle文件带到每个新项目中并不是什么大麻烦,但您可以做得更好。

“更好”的意思是使自定义样式表全局可用,或者至少在虚拟环境中可用。

首先,找出 Matplotlib 的安装位置:

mpl.__file__

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

图像 5 – 环境特定的 Matplotlib 位置

您需要整个路径,但不包括__init__.py部分。

假设您在笔记本环境中,运行以下命令(在替换路径后)将mplstyle文件复制到 Matplotlib 的样式库目录:

!cp custom.mplstyle/Users/dradecic/miniforge3/envs/py/lib/python3.11/site-packages/matplotlib/mpl-data/stylelib/custom-style.mplstyle

注意,我已经重命名了文件。

如果您不在笔记本环境中,只需省略开头的感叹号,然后从控制台运行该命令。

无论怎样,在重启内核后,您应该会看到您的样式表列在列表中:

importmatplotlib.pyplotasplt plt.style.available

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

图像 6 – 可用的 Matplotlib 主题(作者图片)

你现在可以从任何在虚拟环境中运行的脚本或笔记本中引用它:

plt.style.use("custom-style")

为了演示,我在另一个笔记本中创建了一个新的图表。它显示的数据是完全随机的。

重要的是自定义主题能够正常工作:

importmatplotlib.pyplotasplt plt.style.use("custom-style")x=[2019,2020,2021,2022,2023,2024]plt.plot(x,[100,125,200,150,225,250])plt.plot(x,[150,220,250,300,200,150])plt.plot(x,[200,150,275,175,250,300])plt.title("Custom Styles Demonstration Chart",y=1.06)plt.show()

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

图像 7 – 测试图表(作者提供)

就这样 – 只需一行代码就可以实现完全自定义的视觉风格。

总结

总结来说,默认的数据可视化主题很糟糕。

你应该尽你所能让你的视觉作品脱颖而出并吸引注意。如果你做不到这一点,你的信息质量将不再重要。没有人会多看一眼。没有人会分享它。

在 Matplotlib 中使用自定义样式表是吸引注意力的好方法。

你只需编写一次主题,然后通过一行额外的代码在任何地方使用它。这比将数十个rcParams粘贴到每个 Python 脚本或笔记本中要少得多摩擦。

你通常在你的可视化中包含哪些样式调整?在下面的评论部分告诉我。


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

使用 Python 进行数据涂鸦 | 达里奥·拉代奇 | Substack

最初发布于darioradecic.substack.com

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

LangFlow法律文书辅助撰写系统设计思路

LangFlow法律文书辅助撰写系统设计思路 在律师事务所的日常工作中,一份标准的民事起诉状往往需要数小时才能完成:从整理案情摘要、检索相关法条、比对类似判例,到逐项填写诉讼请求和事实理由。即便经验丰富的律师也难免因格式疏漏或引用过时法…

作者头像 李华
网站建设 2026/6/10 17:29:22

LangFlow社交媒体内容审核工具实现路径

LangFlow 构建社交媒体内容审核系统的实践路径 在社交平台每天产生数亿条用户评论的今天,如何高效识别侮辱、仇恨言论或隐晦违规内容,已成为风控团队的核心挑战。传统基于关键词和正则表达式的过滤方式,在面对“谐音黑话”、“缩写代称”甚至…

作者头像 李华
网站建设 2026/6/10 17:30:11

基于NX的智能制造解决方案:深度剖析

NX如何重塑智能制造:从设计到制造的全链路革新你有没有经历过这样的场景?一个紧急的设计变更通知突然下达,团队立刻陷入混乱:有人在重建三维模型,有人在手动修改图纸,仿真工程师抱怨几何体不兼容&#xff0…

作者头像 李华
网站建设 2026/6/10 19:01:12

LangFlow与Kubernetes集成实现弹性伸缩AI服务

LangFlow与Kubernetes集成实现弹性伸缩AI服务 在AI应用从实验室走向生产环境的过程中,一个常见的困境是:数据科学家能快速构建出功能原型,却难以将其稳定、高效地部署为可对外服务的系统。尤其是在面对突发流量时,手动扩容既慢又容…

作者头像 李华
网站建设 2026/6/10 15:04:33

基于协程的异步数据流Flow

1.什么是Flow 基于协程的异步数据流&#xff08;cold stream&#xff09;Flow在协程基础上构建的响应式流&#xff0c;用于处理异步数据序列 2.Flow的作用 异步返回多个值&#xff0c;不会阻塞线程 fun simpleFlow() flow {delay(1000)emit(1) }Test fun test()runBlocking<…

作者头像 李华
网站建设 2026/6/10 15:05:35

LangFlow数据分析助手:上传CSV自动生成洞察报告

LangFlow数据分析助手&#xff1a;上传CSV自动生成洞察报告 在企业日常运营中&#xff0c;一份销售报表可能藏着增长机会&#xff0c;也可能预示潜在风险。但问题在于——有多少人真正愿意逐行翻阅上千条记录的CSV文件&#xff1f;又有多少决策者因为“看不懂数据”而错失先机&…

作者头像 李华