Matplotlib(四)- 图表样式美化

文章目录

  • 一、Matplotlib图表样式介绍
    • [1. 图表样式简介](#1. 图表样式简介)
    • [2. 默认图表样式](#2. 默认图表样式)
      • [2.1 查看默认配置](#2.1 查看默认配置)
      • [2.2 常用的配置](#2.2 常用的配置)
    • [3. 图表样式修改](#3. 图表样式修改)
      • [3.1 局部修改](#3.1 局部修改)
        • [3.1.1 通过绘图方法设置参数修改](#3.1.1 通过绘图方法设置参数修改)
        • [3.1.2 通过rcParams修改](#3.1.2 通过rcParams修改)
        • [3.1.3 通过rc()方法修改](#3.1.3 通过rc()方法修改)
      • [3.2 全局修改](#3.2 全局修改)
  • 二、颜色设置
    • [1. 颜色的三种表示方式](#1. 颜色的三种表示方式)
      • [1.1 颜色单词](#1.1 颜色单词)
      • [1.2 16进制数](#1.2 16进制数)
      • [1.3 RGB和RGBA元组](#1.3 RGB和RGBA元组)
      • [1.4 颜色转换工具网站](#1.4 颜色转换工具网站)
    • [2. 颜色映射表](#2. 颜色映射表)
      • [2.1 颜色映射表简介](#2.1 颜色映射表简介)
      • [2.2 查看内置的颜色映射表](#2.2 查看内置的颜色映射表)
      • [2.3 常用的颜色映射表](#2.3 常用的颜色映射表)
      • [2.4 自定义颜色映射表](#2.4 自定义颜色映射表)
        • [2.4.1 创建连续渐变颜色映射表](#2.4.1 创建连续渐变颜色映射表)
        • [2.4.2 创建离散颜色映射表](#2.4.2 创建离散颜色映射表)
      • [2.5 使用颜色映射表](#2.5 使用颜色映射表)
        • [2.5.1 使用绘图方法中的 cmap 参数](#2.5.1 使用绘图方法中的 cmap 参数)
        • [2.5.2 使用 set_cmap() 方法](#2.5.2 使用 set_cmap() 方法)
      • [2.6 示例:绘制账单饼图](#2.6 示例:绘制账单饼图)
  • 三、线型设置
    • [1. 线型介绍](#1. 线型介绍)
    • [2. 常用线型](#2. 常用线型)
    • [3. 示例:绘制多条折线图](#3. 示例:绘制多条折线图)
  • 四、数据标记设置
    • [1. 数据标记介绍](#1. 数据标记介绍)
    • [2. 内置数据标记](#2. 内置数据标记)
    • [3. 数据标记相关参数](#3. 数据标记相关参数)
    • [4. 示例:绘制多条折线图](#4. 示例:绘制多条折线图)
  • 五、字体样式设置
    • [1. 字体样式介绍](#1. 字体样式介绍)
    • [2. 字体样式相关方法及属性](#2. 字体样式相关方法及属性)
      • [2.1 全局字体配置方法](#2.1 全局字体配置方法)
      • [2.2 局部文本设置函数](#2.2 局部文本设置函数)
      • [2.3 示例:绘制多条折线图](#2.3 示例:绘制多条折线图)
  • 六、主题样式设置
    • [1. 主题样式介绍](#1. 主题样式介绍)
    • [2. 查看预定义的主题样式](#2. 查看预定义的主题样式)
    • [3. 使用主题样式](#3. 使用主题样式)
      • [3.1 全局应用:style.use()方法](#3.1 全局应用:style.use()方法)
      • [3.2 临时应用:style.context()方法](#3.2 临时应用:style.context()方法)
      • [3.3 示例:绘制分区柱形图](#3.3 示例:绘制分区柱形图)
  • 七、填充区域

一、Matplotlib图表样式介绍

1. 图表样式简介

Matplotlib 的图表样式是指图表的整体视觉呈现风格,包括颜色搭配、线条样式、字体类型、网格线样式、背景色等一系列视觉元素的组合。它决定了图表的美观度、专业性以及信息传递的效率。

合理的图表样式能够让数据可视化效果更符合展示场景(如学术报告、商业演示、日常分析等),同时也能帮助读者更快速地聚焦于数据本身。Matplotlib 提供了丰富的样式管理功能,既支持使用内置的预设样式,也允许用户根据需求自定义样式,从而满足不同的视觉偏好和业务需求。

2. 默认图表样式

2.1 查看默认配置

在 Matplotlib 中,matplotlib.rc_params() 函数用于获取当前所有的默认配置参数,返回一个包含全局配置的字典。这些参数决定了图表的默认样式(如字体、颜色、线条、坐标轴等),是 Matplotlib 绘制图表时的"默认规则"。

通过运行以下代码,可以查看完整的默认配置:

python 复制代码
import matplotlib
# 获取并打印所有默认配置参数
default_config = matplotlib.rc_params()
print(default_config)

2.2 常用的配置

Matplotlib 的默认配置包含大量参数,以下是实际应用中最常用的配置项:

配置项分类 具体参数名 默认值 含义说明
字体设置 font.family ['sans-serif'] 全局字体族,默认使用无衬线字体(如 Arial、SimHei 等)
font.size 10 全局默认字体大小(单位:磅)
axes.titlesize large 图表标题字体大小(相对值,可选 'xx-small' 至 'xx-large')
axes.labelsize medium 坐标轴标签字体大小
xtick.labelsize medium x 轴刻度标签字体大小
ytick.labelsize medium y 轴刻度标签字体大小
legend.fontsize medium 图例标签字体大小
线条样式 lines.linewidth 1.5 线条宽度(单位:点)
lines.linestyle '-' 线条样式('-' 实线、'--' 虚线、':' 点线等)
lines.marker 'None' 数据点标记样式('o' 圆圈、's' 正方形等,默认无标记)
坐标轴设置 axes.edgecolor 'black' 坐标轴边框颜色
axes.grid False 是否显示网格线(默认不显示)
grid.linestyle '--' 网格线样式(默认虚线)
grid.alpha 0.7 网格线透明度(0-1,值越小越透明)
xtick.direction 'in' x 轴刻度线方向('in' 向内、'out' 向外)
ytick.direction 'in' y 轴刻度线方向
图例设置 legend.loc 'best' 图例位置('best' 自动选择最优位置,或指定 'upper right' 等)
legend.frameon True 是否显示图例边框(默认显示)
图像输出 figure.figsize (6.4, 4.8) 图表默认尺寸(宽×高,单位:英寸)
figure.dpi 100 图表分辨率(每英寸像素数)
savefig.dpi 100 保存图片时的分辨率
中文显示 font.sans-serif ['DejaVu Sans', ...] 无衬线字体列表(需添加 'SimHei' 等中文字体以支持中文显示)
axes.unicode_minus True 是否使用 Unicode 负号(设置为 False 可解决负号显示异常问题)

3. 图表样式修改

图表样式修改是Matplotlib数据可视化中的重要环节,通过调整样式可以使图表更符合展示需求和审美要求。根据修改范围的不同,可分为局部修改和全局修改两类。

3.1 局部修改

局部修改指的是仅对当前绘制的单个图表生效的样式调整,不会影响其他图表的默认样式。

3.1.1 通过绘图方法设置参数修改

这是最直接的样式修改方式,在调用绘图函数(如plot()bar()scatter()等)时,通过传递参数来指定当前图表元素的样式。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
plt.plot(x, y, linewidth=5)

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

3.1.2 通过rcParams修改

rcParams是一个字典对象,存储了Matplotlib的所有默认配置。通过临时修改rcParams中的参数,可以对当前代码块中后续绘制的图表生效,但不会影响全局默认设置。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
plt.rcParams['lines.linewidth'] = 5
plt.plot(x, y)

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

3.1.3 通过rc()方法修改

matplotlib.rc()方法是修改配置的另一种方式,它可以一次性设置多个参数,语法上更简洁。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
plt.plot(x, y)

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

3.2 全局修改

全局修改指的是修改Matplotlib的默认配置文件matplotlibrc,使所有使用Matplotlib绘制的图表都应用新的默认样式,包括新启动的程序。

Matplotlib的配置文件位置可以通过以下代码查询:

python 复制代码
import matplotlib
print(matplotlib.matplotlib_fname())

二、颜色设置

在数据可视化中,颜色是传递信息、区分数据系列和提升图表美观度的重要元素。Matplotlib 支持多种颜色表示方式,灵活掌握这些方式能让图表配色更精准、更符合需求。

1. 颜色的三种表示方式

1.1 颜色单词

颜色单词是通过英文单词直接表示颜色的方式,其特点是简单直观、易于理解和书写,无需记忆复杂的数值,例如 "red""blue""green" 等,能快速应用于图表元素的颜色设置;但这种方式支持的颜色单词数量有限(约 140 种标准颜色),无法精确表达所有细微差别的色调,适用于对颜色精度要求不高的快速绘图场景。

查看Matplotlib可用的颜色单词:

python 复制代码
from matplotlib import colors
print(colors.cnames.keys())

运行结果如下:

text 复制代码
dict_keys(['aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'rebeccapurple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'])

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
plt.plot(x, y, color='blue')

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

1.2 16进制数

16 进制数表示颜色的格式为#RRGGBB#RRGGBBAA(其中RR"GG""BB" 分别代表红、绿、蓝三色通道数值,AA代表透明度,取值范围为00-FF,对应十进制 0-255),其特点是可表示约 1677 万种颜色,能精准匹配任意色调,且透明度可选(00完全透明,FF完全不透明),通用性强;但该方式对字符串格式要求严格,较难记忆,适用于需要精准配色的网页或印刷图表等场景。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
plt.plot(x, y, color='#56a8ffa5')

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

1.3 RGB和RGBA元组

RGB 通过红(Red)、绿(Green)、蓝(Blue)三原色组合表示颜色,有整数格式(R, G, B)(R、G、B 为 0-255 的整数)和浮点数格式(R, G, B)(R、G、B 为 0-1 的浮点数,由 0-255 范围归一化而来)两种形式,其特点是颜色丰富,数值直观,支持归一化处理,能精确控制三通道强度;不过整数格式需注意数值范围,使用时稍显繁琐,适用于程序中动态生成颜色、需要精确控制三通道的场景。

RGBA 元组是在 RGB 三原色基础上增加了 Alpha(透明度)通道的颜色表示方式,格式为(R, G, B, A),其中前三个值(R、G、B)分别代表红、绿、蓝三原色的强度,第四个值(A)代表透明度。其数值格式有两种:整数格式中,R、G、B、A 的取值范围为 0-255(A=0 表示完全透明,A=255 表示完全不透明);浮点数格式中,所有值的取值范围为 0-1(A=0 表示完全透明,A=1 表示完全不透明),这种格式在 Matplotlib 中更为常用。RGBA 元组的特点是既保留了 RGB 模式对颜色的精准控制能力,又通过 Alpha 通道实现了对透明度的灵活调节,能轻松处理图表元素的叠加显示效果,避免因元素重叠导致的信息遮挡;但相比单纯的 RGB,它需要多设置一个透明度参数,且整数格式需注意数值范围限制,适用于需要处理元素叠加、强调层次关系的复杂图表场景,例如重叠的散点图、多层折线图等。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

1.4 颜色转换工具网站

https://tool.css-js.com/rgba.html是一个颜色转换工具网站。它主要用于实现RGB、RGBA颜色值与十六进制颜色值之间的转换。

用户在该网站输入符合格式要求的RGB、RGBA数值或十六进制颜色值,页面会实时转换并显示对应的其他格式颜色值。例如,输入"rgb(255,0,0)",会显示其对应的十六进制颜色值"#FF0000",反之亦然。该网站对于网页设计师、前端开发人员等需要频繁处理颜色值的人群来说,是一个方便快捷的工具,有助于提高颜色值转换的效率。

2. 颜色映射表

2.1 颜色映射表简介

颜色映射表(Colormap,简称cmap)是一系列渐变颜色的有序集合,用于将数值映射到颜色,实现数据的可视化编码。它通过颜色的深浅、色调变化直观反映数据值的大小或差异,尤其适合热力图、等高线图、散点图(按数值着色)等场景。颜色映射表的核心作用是将抽象的数值转化为视觉可感知的颜色差异,帮助读者快速识别数据分布规律(如高低值区域、趋势变化等)。Matplotlib内置了多种预设的颜色映射表,涵盖从单色调渐变到多色调过渡的不同类型,同时支持用户自定义颜色映射表以满足特定需求。

2.2 查看内置的颜色映射表

Matplotlib提供了plt.colormaps()函数查看所有内置颜色映射表,通过plt.cm.get_cmap()可获取指定映射表,通过可视化方式可直观了解其颜色变化规律。

python 复制代码
import matplotlib.pyplot as plt
print(plt.colormaps())

运行结果如下:

text 复制代码
['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', 'pink', 'prism', 'rainbow', 'seismic', 'spring', 'summer', 'terrain', 'winter', 'Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c', 'magma_r', 'inferno_r', 'plasma_r', 'viridis_r', 'cividis_r', 'twilight_r', 'twilight_shifted_r', 'turbo_r', 'Blues_r', 'BrBG_r', 'BuGn_r', 'BuPu_r', 'CMRmap_r', 'GnBu_r', 'Greens_r', 'Greys_r', 'OrRd_r', 'Oranges_r', 'PRGn_r', 'PiYG_r', 'PuBu_r', 'PuBuGn_r', 'PuOr_r', 'PuRd_r', 'Purples_r', 'RdBu_r', 'RdGy_r', 'RdPu_r', 'RdYlBu_r', 'RdYlGn_r', 'Reds_r', 'Spectral_r', 'Wistia_r', 'YlGn_r', 'YlGnBu_r', 'YlOrBr_r', 'YlOrRd_r', 'afmhot_r', 'autumn_r', 'binary_r', 'bone_r', 'brg_r', 'bwr_r', 'cool_r', 'coolwarm_r', 'copper_r', 'cubehelix_r', 'flag_r', 'gist_earth_r', 'gist_gray_r', 'gist_heat_r', 'gist_ncar_r', 'gist_rainbow_r', 'gist_stern_r', 'gist_yarg_r', 'gnuplot_r', 'gnuplot2_r', 'gray_r', 'hot_r', 'hsv_r', 'jet_r', 'nipy_spectral_r', 'ocean_r', 'pink_r', 'prism_r', 'rainbow_r', 'seismic_r', 'spring_r', 'summer_r', 'terrain_r', 'winter_r', 'Accent_r', 'Dark2_r', 'Paired_r', 'Pastel1_r', 'Pastel2_r', 'Set1_r', 'Set2_r', 'Set3_r', 'tab10_r', 'tab20_r', 'tab20b_r', 'tab20c_r']

示例:使用图形方式查看指定映射表

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体以正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决Matplotlib中负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False


# 定义一个函数来展示颜色映射表(兼容新版本Matplotlib)
def plot_cmap(cmap_name):
    """
    展示给定名称的颜色映射表。

    参数:
    cmap_name (str): 颜色映射表的名称
    """
    # 检查指定的颜色映射表是否存在
    if cmap_name not in plt.colormaps():
        print(f"警告:颜色映射表 '{cmap_name}' 不存在!")
        return

    # 获取颜色映射表对象(适用于新的Matplotlib版本)
    cmap = plt.colormaps[cmap_name]  # 或者使用 plt.colormaps.get_cmap(cmap_name)

    # 创建一个新的图形,宽度为6英寸,高度为1英寸
    plt.figure(figsize=(6, 1))

    # 创建一个从0到1的线性间隔数组,长度为256。这个数组代表颜色映射的范围
    gradient = np.linspace(0, 1, 256)
    # 将上述数组堆叠成二维数组,以便在imshow中显示为颜色条
    gradient = np.vstack((gradient, gradient))

    # 使用imshow绘制颜色映射表,aspect='auto'表示自动调整宽高比,
    # cmap参数指定使用的颜色映射表
    plt.imshow(gradient, aspect='auto', cmap=cmap)

    # 移除x轴和y轴的刻度标记
    plt.xticks([])
    plt.yticks([])

    # 添加标题,并设置距离底部的距离为10点
    plt.title(f'颜色映射表:{cmap_name}', pad=10)

    # 自动调整布局以防图表元素重叠
    plt.tight_layout()

    # 显示图像
    plt.show()


# 示例调用,展示名为'viridis'和'coolwarm'的颜色映射表
plot_cmap('viridis')
plot_cmap('coolwarm')

运行结果如下图所示:

2.3 常用的颜色映射表

类别 名称 特点 适用场景
连续渐变 viridis 从黄到蓝的渐变,色调均匀,对色盲友好,对比度适中 大多数科学可视化,如热力图、等高线图
连续渐变 plasma 从红到紫的暖色调渐变,色彩鲜艳,突出高值区域 强调数据中的热点(高值)区域
连续渐变 inferno 从黑到黄的渐变,类似火焰颜色,高值区域明亮 表示温度、能量等具有"热度"属性的数据
连续渐变 magma 从黑到红的渐变,高对比度,高值区域突出 需要强调数据极端值的场景
连续渐变 cividis 从浅灰到蓝绿色的渐变,对色盲和灰度打印友好 学术论文、需要灰度打印的场景
发散型 coolwarm 从蓝色(冷)到红色(暖)的发散渐变,中间为白色 表示正负偏离(如温度异常、误差值)
发散型 bwr 蓝-白-红发散渐变,对比强烈,适合展示对立数据 正负值对比,如增益/损失、上升/下降
定性型 tab10 10种鲜明的区分色,无渐变,适合离散类别 分类数据,如不同组别、类别对比
定性型 Set3 12种柔和的区分色,适合多类别展示 多分类数据,如多个组别比较
线性渐变 gray 从黑到白的灰度渐变,简洁中立 需要避免颜色干扰的场景,或模拟灰度图像

2.4 自定义颜色映射表

当Matplotlib内置的颜色映射表无法满足特定需求(如品牌色调匹配、数据语义强化等)时,可通过自定义颜色映射表实现个性化配色。常用方法有两种:基于渐变的连续颜色映射表和基于离散颜色集合的映射表,分别适用于不同场景。

2.4.1 创建连续渐变颜色映射表

使用LinearSegmentedColormap类,通过指定关键颜色节点,自动生成平滑过渡的渐变效果。

代码示例

python 复制代码
# 导入必要的库
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap  # 用于创建自定义颜色映射表

# 设置中文字体,确保图表中的中文标签能正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体(SimHei)显示中文
# 解决负号 '-' 显示为方块的问题,保证负数的负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 定义一组颜色,用于构建自定义的蓝色渐变色系
# 颜色从最浅的蓝色(接近白色)到深蓝色,形成一个平滑的视觉过渡
colors = [
    "#e6f7ff",  # 极浅蓝(背景色)
    "#bae7ff",  # 很浅的蓝
    "#91d5ff",  # 浅蓝
    "#69b1ff",  # 中等浅蓝
    "#4096ff",  # 中蓝
    "#1872ff",  # 深蓝
    "#0050c3"  # 更深的蓝(接近海军蓝)
]

# 使用 LinearSegmentedColormap.from_list 创建一个连续的颜色映射表
custom_cmap = LinearSegmentedColormap.from_list(
    name="custom_blue",  # 自定义颜色映射表的名称(可选)
    colors=colors,  # 颜色列表,定义渐变的起点到终点
    N=256  # 渐变的色阶数量,256 是常用值,数值越大过渡越平滑
)


# 定义一个函数,用于可视化任意颜色映射表
def plot_cmap(cmap):
    """
    展示颜色映射表的渐变效果

    参数:
    cmap: matplotlib.colors.Colormap 对象
    """
    plt.figure(figsize=(6, 2))  # 创建一个宽而矮的图形,适合展示色条

    # 创建一个从 0 到 1 的线性数组,共 256 个值,代表颜色映射的范围
    gradient = np.linspace(0, 1, 256)
    # 将一维数组堆叠成两行,形成一个 2x256 的二维数组,便于在图像中显示为色带
    gradient = np.vstack((gradient, gradient))

    # 使用 imshow 显示颜色渐变条
    plt.imshow(gradient, aspect="auto", cmap=cmap)  # aspect="auto" 允许自动调整宽高比

    plt.axis("off")  # 关闭坐标轴(不显示刻度、边框等)

    # 添加标题,显示当前颜色映射表的名称
    plt.title(f"自定义连续颜色映射表: {cmap.name}")

    plt.show()  # 显示图形


# 调用函数,展示我们刚刚创建的自定义蓝色渐变映射表
plot_cmap(custom_cmap)

运行结果如下图所示:

2.4.2 创建离散颜色映射表

使用ListedColormap类,直接指定有限个离散颜色,适用于分类数据的颜色编码。

代码示例

python 复制代码
# 导入必要的库
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

# 设置中文字体,确保图表中的中文标签能正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体(SimHei)显示中文
# 解决负号 '-' 显示为方块的问题,保证负数的负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 定义离散颜色集合(适合多类别数据)
discrete_colors = ["#ff4d4f", "#faad14", "#52c41a", "#1890ff", "#722ed1"]

# 创建离散颜色映射表
discrete_cmap = ListedColormap(
    colors=discrete_colors,
    name="custom_discrete"
)


# 定义一个函数,用于可视化任意颜色映射表
def plot_cmap(cmap):
    """
    展示颜色映射表的渐变效果

    参数:
    cmap: matplotlib.colors.Colormap 对象
    """
    plt.figure(figsize=(6, 2))  # 创建一个宽而矮的图形,适合展示色条

    # 创建一个从 0 到 1 的线性数组,共 256 个值,代表颜色映射的范围
    gradient = np.linspace(0, 1, 256)
    # 将一维数组堆叠成两行,形成一个 2x256 的二维数组,便于在图像中显示为色带
    gradient = np.vstack((gradient, gradient))

    # 使用 imshow 显示颜色渐变条
    plt.imshow(gradient, aspect="auto", cmap=cmap)  # aspect="auto" 允许自动调整宽高比

    plt.axis("off")  # 关闭坐标轴(不显示刻度、边框等)

    # 添加标题,显示当前颜色映射表的名称
    plt.title(f"自定义离散颜色映射表: {cmap.name}")

    plt.show()  # 显示图形


# 调用函数,展示我们刚刚创建的自定义蓝色渐变映射表
plot_cmap(discrete_cmap)

运行结果如下图所示:

2.5 使用颜色映射表

在数据可视化里,颜色映射表(Colormap)是将数据数值与颜色关联的重要工具,借助它能让数据规律借由色彩变化直观呈现。下面介绍两种在 Matplotlib 中运用颜色映射表的常用方式,助力精准调控图表色彩编码逻辑。

2.5.1 使用绘图方法中的 cmap 参数

在 Matplotlib 各类绘图函数(像 imshow 绘制热力图、scatter 绘制散点图 等)里,cmap 参数可直接指定颜色映射表。使用时,数据值会被自动归一化到 [0, 1] 区间,对应颜色映射表的起始与结束颜色,以此完成数据到色彩的映射。该方式针对单图表或临时配色场景极为便捷,一行代码就能让当前绘图函数应用指定颜色映射,快速实现数据色彩编码,无需额外操作步骤,直接让颜色映射对当前绘制图表生效,清晰展现数据分布特征,比如用渐变映射表体现连续数据变化、离散映射表区分分类数据 。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
# plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))
# plt.scatter(x, y, color=matplotlib.cm.viridis(y))
plt.bar(x, y, color=matplotlib.cm.viridis(y))
# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

2.5.2 使用 set_cmap() 方法

set_cmap() 方法主要用于对已创建的 Axes(坐标轴)或 Figure(画布)对象批量设置颜色映射。在多子图布局、需复用映射表或者交互可视化场景中优势显著。调用该方法后,关联的图表都会应用新设置的颜色映射,能统一多图表配色风格,也便于动态切换映射表探索数据。例如多子图展示时,可通过它让不同子图共享一致颜色映射规则;交互场景下,结合函数绑定操作,能实时切换颜色映射,助力深入分析数据分布与特征 。

示例代码

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]

# 使用 plot 函数绘制折线图,x 和 y 是数据
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
# plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))
# plt.scatter(x, y, color=matplotlib.cm.viridis(y))
# plt.bar(x, y, color=matplotlib.cm.viridis(y))

# 绘制散点图,x 和 y 分别表示点的横纵坐标
# 参数 c=y 表示散点的颜色将根据 y 值的大小进行映射(即颜色随 y 值变化)
# 此时 Matplotlib 会自动使用默认的颜色映射表(colormap)来着色
plt.scatter(x, y, c=y)

# 手动设置当前图形使用的颜色映射表为 'viridis'
# matplotlib.cm.viridis 是 Matplotlib 内置的一种感知均匀、美观且适合色盲的颜色映射
# 这行代码确保散点图的颜色使用 viridis 色图进行渲染
plt.set_cmap(matplotlib.cm.viridis)
# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

2.6 示例:绘制账单饼图

数据如下图所示,需要根据这个数据绘制账单饼图,手动给不同的区域设置不同的颜色。

实现代码如下图所示:

python 复制代码
# 导入matplotlib.pyplot模块,用于绘图功能。
import matplotlib.pyplot as plt

# 导入pandas模块,并使用pd作为别名。Pandas是一个强大的数据处理和分析库。
import pandas as pd

# 设置matplotlib的中文字体为SimHei(黑体),以确保中文标签可以正常显示。
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号'-'显示为方块的问题,通过设置'axes.unicode_minus'为False来实现。
plt.rcParams['axes.unicode_minus'] = False

# 定义包含CSV文件路径的变量。这里假设账单数据存储在一个名为'账单.csv'的文件中。
csv_file_path = './data/账单.csv'

# 使用pandas的read_csv函数读取CSV文件中的数据,并将其存储在一个DataFrame对象中。
df = pd.read_csv(csv_file_path)

# 从DataFrame中提取'金额'列的数据,用于表示饼图各个部分的大小或贡献度。
x = df['金额']

# 从DataFrame中提取'支出分类'列的数据,用作饼图各部分的标签,以便了解每个部分代表什么。
labels = df['支出分类']

# 定义颜色列表(数量需与分类数量一致)
custom_colors = [
    '#FF6B6B',  # 浅红色
    '#4ECDC4',  # 青绿色
    '#45B7D1',  # 天蓝色
    '#FFA07A',  # 浅橙色
    '#98D8C8',  # 淡青色
    '#F7DC6F',  # 淡黄色
    '#D7BDE2',  # 淡紫色
    '#58D68D'  # 浅绿色
]

# 使用plt.pie()函数绘制饼图:
# 参数x指定数据列表,决定了饼图各个扇区的大小;
# labels参数指定与x列表对应的数据标签,帮助识别每个扇区所代表的类别;
# autopct参数设置为'%.1f%%',用于在饼图上显示百分比数值,保留一位小数。
plt.pie(x=x, labels=labels, autopct='%.1f%%', colors=custom_colors)

# 调用plt.show()函数显示图形结果。这是展示已创建图表的必要步骤。
plt.show()

绘制的图形如下图所示:


三、线型设置

线型是图表中线条的外观样式,包括线条的形态(如实线、虚线)、粗细、端点样式等,它不仅影响图表的美观度,还能帮助区分不同的数据系列,增强图表的可读性。合理的线型选择可以让数据趋势和对比关系更加清晰,例如用虚线表示预测数据,用实线表示实际数据,便于读者快速识别。

1. 线型介绍

线型主要通过线条的样式特征来定义,核心要素包括线条的连续性(如实线、虚线、点线)、线条的宽度(线宽)以及线条端点和连接处的样式。在 Matplotlib 中,线型的设置可以通过绘图函数(如 plot())的参数直接指定,也可以通过全局配置(如 rcParams)统一设置默认线型。不同的线型适用于不同的场景:连续数据的趋势展示常用实线,辅助参考线常用虚线或点线,而特殊标记(如误差线)可能会用到点划线等。通过组合不同的线型,能够有效区分图表中的多个数据系列,避免混淆。

2. 常用线型

线型参数值 线型名称 外观示例 适用场景说明
'-' 实线 ───────────── 最常用的线型,适用于展示主要数据系列、核心趋势线,如实际观测数据、基准值等。
'--' 虚线 ── ── ── ── ── 常用于辅助线、参考线或次要数据系列,如预测值、目标阈值、历史对比数据等。
':' 点线 ············· 适合表示次要参考信息或背景线,如网格辅助线、理论边界线,视觉干扰较小。
'-.' 点划线 ─·─·─·─·─·─·─ 用于需要一定区分度但又不突出的线条,如模拟数据、假设曲线,兼顾辨识度和简洁性。
'None' 无线条 (无显示) 用于隐藏线条,仅展示数据点标记(如散点图中单独标记点),或临时取消线条显示。

上表中的线型参数值可直接用于 plot() 等函数的 linestyle(或简写 ls)参数,例如 plt.plot(x, y, linestyle='--')plt.plot(x, y, ls=':')。实际使用时,可根据数据的重要性、图表的复杂度以及展示目标,选择合适的线型组合,以达到清晰传递信息的目的。

3. 示例:绘制多条折线图

绘制两条折线图,两条折线图分别用不同的线型,并给网格线设置与折线不同的线型。

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]

# 使用 plot 函数绘制折线图,x 和 y 是数据
plt.plot(x, y, linestyle=':')
plt.plot(x, y2, linestyle='-.')

# 设置图表网格线
plt.grid(visible=True, linestyle='--')

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:


四、数据标记设置

在折线图、散点图等可视化场景里,数据标记用于突出显示具体数据点位置,帮助读者精准识别数据坐标,区分不同数据系列,也可强调关键数据(如峰值、异常点 )。合理运用数据标记,能让数据分布与趋势更直观呈现。

1. 数据标记介绍

数据标记是依附于数据点的符号,在 Matplotlib 中,可通过 marker 参数在 plotscatter 等函数里设置。它能让数据点从线条中"凸显",即便线条复杂或数据点密集,也能清晰定位,还可借助不同标记样式、颜色、大小等区分多组数据,是增强图表可读性的基础元素。

2. 内置数据标记

Matplotlib 提供丰富内置数据标记,通过特定字符/符号调用,满足多样可视化需求:

数据标记取值 符号示例 说明 数据标记取值 符号示例 说明 数据标记取值 符号示例 说明
's' 正方形 '+' + 加号 '4' 朝左方向键,位于基线右方
'8' 八边形 ',' · 像素点 '5' 朝右方向键,位于基线左方
'>' 右三角 '.' '6' 朝上方向键,位于基线下方
'<' 左三角 '1' Y 下三叉 '7' 朝下方向键,位于基线上方
'^' 正三角 '2' 上三叉 '8' 朝左方向键,位于基线左方
'v' 倒三角 '3' 左三叉 '9' 朝右方向键,位于基线右方
'o' 圆形 '4' 右三叉 '10' 朝上方向键,位于基线上方
'X' 叉形 'x' × 乘号 '11' 朝下方向键,位于基线下方
'P' 十字交叉形 '-' --- 水平线 'H' 六边形1
'd' 长菱形 '0' --- 水平线,位于基线左方 'h' 六边形2
'D' 正菱形 '1' --- 水平线,位于基线右方 '*' 星形

使用时,在绘图函数里通过 marker 参数指定,如 plt.plot(x, y, marker='o') ,让折线图数据点显示为圆形标记。

3. 数据标记相关参数

除标记样式,Matplotlib 还提供参数精细调控标记外观,让可视化更贴合需求:

参数名 作用说明 示例值 补充说明
markersize / ms 控制数据标记大小 108.5 数值越大,标记显示越醒目
markerfacecolor / mfc 设置标记内部填充色 'red''#FF0000' 可填颜色名称、十六进制值等
markeredgecolor / mec 设置标记边缘颜色 'black'(0,0,0) 支持颜色名称、RGB 元组格式
markeredgewidth / mew 调整标记边缘宽度 21.2 数值越大,边缘线条越粗
markevery 控制标记显示间隔 2slice(0,None,3) markevery=2 表示每 2 个点显示一个标记

4. 示例:绘制多条折线图

绘制两条折线图,两条折线图分别用不同的线型,给网格线设置与折线不同的线型,并添加数据标记。

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]

# 使用 plt.plot() 绘制第一条折线图
plt.plot(
    x, y,  # x 和 y 是数据点的横纵坐标数组(或列表)
    linestyle=':',  # 线条样式为"点线"(dotted line)
    marker='o',  # 数据点标记形状为"圆形"(circle)
    markersize=8,  # 标记的大小为 8
    markerfacecolor='lightblue',  # 标记内部填充颜色为"浅蓝色"
    markeredgecolor='black',  # 标记边缘(轮廓)颜色为"黑色"
    markeredgewidth=2,  # 标记边缘的线宽为 2,使轮廓更明显
    markevery=2  # 每隔 2 个点绘制一个标记(即只在第0、2、4...个点显示标记)
)

# 使用 plt.plot() 绘制第二条折线图(例如对比数据 y2)
plt.plot(
    x, y2,  # x 为横坐标,y2 为第二组纵坐标数据
    linestyle='-.',  # 线条样式为"点划线"(dash-dot line)
    marker='D',  # 数据点标记形状为"菱形"(Diamond)
    markersize=8,  # 标记大小为 8
    markerfacecolor='#a5c8fa',  # 标记内部填充颜色(十六进制浅蓝)
    markeredgecolor='#fa853f',  # 标记边缘颜色(十六进制橙色)
    markeredgewidth=1,  # 标记边缘线宽为 1
    markevery=1  # 每个数据点都显示标记(等价于全部显示)
)

# 设置图表网格线
plt.grid(visible=True, linestyle='--')

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:


五、字体样式设置

字体样式是图表中文字展示效果的关键要素,包括字体类型、大小、粗细、风格等,直接影响图表的可读性和专业性。合理的字体设置能让图表标题、标签、图例等文本信息清晰传达,同时与图表整体风格保持协调,尤其在中文显示、学术报告或商业展示等场景中至关重要。

1. 字体样式介绍

字体样式主要通过字体族(如宋体、黑体、Arial)、字体大小、粗细(常规、粗体)、风格(常规、斜体)、颜色等参数定义,用于控制图表中所有文本元素(标题、坐标轴标签、刻度标签、图例等)的外观。在 Matplotlib 中,字体样式的设置可分为全局配置 (通过 rcParamsrc() 方法统一设置所有文本)和局部设置 (在具体文本函数中单独指定参数),前者适合批量统一风格,后者适合个性化调整特定文本元素。此外,针对中文显示问题,需通过配置支持中文的字体族(如 SimHeiWenQuanYi Micro Hei)避免乱码。

2. 字体样式相关方法及属性

Matplotlib 提供了多种方法设置字体样式,核心包括全局配置方法和局部文本设置函数。

2.1 全局字体配置方法

通过 plt.rcParams 字典或 plt.rc() 方法修改全局字体默认样式,对所有图表生效。

方法/属性 作用描述 常用参数/键名 参数说明
plt.rcParams 全局配置字典,存储字体相关默认参数 'font.family' 字体族列表,如 ['SimHei', 'Arial'](优先使用前者)
'font.size' 全局默认字体大小(单位:磅),如 12
'axes.titlesize' 坐标轴标题字体大小,如 14'large'
'axes.labelsize' 坐标轴标签字体大小,如 12'medium'
'xtick.labelsize' x 轴刻度标签字体大小,如 10'small'
'ytick.labelsize' y 轴刻度标签字体大小,同 xtick.labelsize
'legend.fontsize' 图例字体大小,如 10'small'
plt.rc() 批量设置全局参数的函数 font 字体参数字典,如 {'family': 'SimHei', 'size': 12}
axes 坐标轴文本参数,如 {'titlesize': 14, 'labelsize': 12}

示例代码

python 复制代码
import matplotlib.pyplot as plt

# 方法1:通过rcParams设置
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]  # 支持中文
plt.rcParams["font.size"] = 12  # 全局字体大小
plt.rcParams["axes.titlesize"] = 14  # 标题大小

# 方法2:通过rc()批量设置
plt.rc('font', family='SimHei', size=12)
plt.rc('axes', titlesize=14, labelsize=12)

2.2 局部文本设置函数

在具体文本元素(标题、标签等)的生成函数中,通过参数单独设置字体样式,仅对当前元素生效。

函数名 作用描述 常用参数 参数说明
plt.title() 设置图表标题 fontfamily 字体族,如 'SimHei''Arial'
fontsize 字体大小(单位:磅),如 14'large'
fontweight 字体粗细,如 'bold'(粗体)、'normal'(常规)或数值 700(对应粗体)
fontstyle 字体风格,如 'italic'(斜体)、'normal'(常规)
color 字体颜色,如 'red''#FF0000'
plt.xlabel()/plt.ylabel() 设置坐标轴标签 plt.title() 的参数 包括 fontfamilyfontsizefontweight 等,用法一致
plt.xticks()/plt.yticks() 设置刻度标签 fontproperties 字体属性对象(matplotlib.font_manager.FontProperties),可指定字体族等
fontsize 刻度标签字体大小,如 10
plt.legend() 设置图例 fontsize 图例字体大小,如 10'small'
fontfamily 图例字体族,如 'SimHei'
plt.text() 在图表任意位置添加文本 plt.title() 的参数 支持 fontfamilyfontsizefontstyle 等,用于自定义文本

2.3 示例:绘制多条折线图

绘制两条折线图,两条折线图分别用不同的线型,给网格线设置与折线不同的线型,添加数据标记,并给标题设置字体样式。

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 定义 x 轴数据:年份从 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]

# 定义 y 轴数据:对应年份的数值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]

# 使用 plt.plot() 绘制第一条折线图
plt.plot(
    x, y,  # x 和 y 是数据点的横纵坐标数组(或列表)
    linestyle=':',  # 线条样式为"点线"(dotted line)
    marker='o',  # 数据点标记形状为"圆形"(circle)
    markersize=8,  # 标记的大小为 8
    markerfacecolor='lightblue',  # 标记内部填充颜色为"浅蓝色"
    markeredgecolor='black',  # 标记边缘(轮廓)颜色为"黑色"
    markeredgewidth=2,  # 标记边缘的线宽为 2,使轮廓更明显
    markevery=2  # 每隔 2 个点绘制一个标记(即只在第0、2、4...个点显示标记)
)

# 使用 plt.plot() 绘制第二条折线图(例如对比数据 y2)
plt.plot(
    x, y2,  # x 为横坐标,y2 为第二组纵坐标数据
    linestyle='-.',  # 线条样式为"点划线"(dash-dot line)
    marker='D',  # 数据点标记形状为"菱形"(Diamond)
    markersize=8,  # 标记大小为 8
    markerfacecolor='#a5c8fa',  # 标记内部填充颜色(十六进制浅蓝)
    markeredgecolor='#fa853f',  # 标记边缘颜色(十六进制橙色)
    markeredgewidth=1,  # 标记边缘线宽为 1
    markevery=1  # 每个数据点都显示标记(等价于全部显示)
)

# 设置图表网格线
plt.grid(visible=True, linestyle='--')

# 设置图表标题
plt.title(
    label='多条折线图',  # 标题内容
    fontfamily='SimHei',  # 字体类型
    fontsize=16,  # 字体大小:16
    color='red',  # 标题文字颜色
    rotation=10  # 旋转角度
)

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:


六、主题样式设置

主题样式是 Matplotlib 中预设的一套完整图表风格配置,涵盖字体、颜色、线型、网格线、边框等所有视觉元素的默认参数,能快速统一图表的整体外观,无需逐一调整细节。合理使用主题样式可大幅提升图表的美观度和专业性,同时减少重复的样式配置工作,尤其适合批量生成风格一致的图表(如报告、论文、仪表盘等)。

1. 主题样式介绍

主题样式(Style)是 Matplotlib 封装的一套"一站式"样式方案,包含对图表中几乎所有元素(如背景色、线条样式、字体设置、网格线显示等)的默认配置。它的核心作用是:

  • 简化样式设置流程:无需手动调整 rcParams 中的数百个参数,直接调用主题即可应用整套风格;
  • 保证风格一致性:同一主题下的所有图表自动保持视觉统一,避免因手动设置导致的风格混乱;
  • 适配不同场景:预定义主题涵盖简约、学术、出版等多种风格,可根据需求快速切换(如论文用 seaborn-paper,演示用 Solarize_Light2)。

主题样式本质上是对 rcParams 的预定义集合,应用主题后,全局的默认配置会被主题中的参数覆盖,后续绘制的所有图表都会遵循该主题风格。

2. 查看预定义的主题样式

Matplotlib 内置了多种预定义主题样式,可通过以下代码查看所有可用主题:

python 复制代码
import matplotlib.style as ms
print(ms.available)

运行结果(不同版本可能略有差异):

text 复制代码
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark', 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster', 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 'tableau-colorblind10']

以下是 Matplotlib 中常用主题样式的详细介绍,结合其特点和适用场景整理如下:

主题名称 风格特点 适用场景 视觉特征示例
default Matplotlib 默认风格,简洁中性,线条清晰,背景为白色,无网格线默认显示 通用场景,快速绘图、临时可视化 线条颜色鲜明,文本大小适中,适合大多数基础数据展示
Solarize_Light2 浅色背景(浅黄偏白),高对比度线条,模仿纸质打印效果,视觉柔和 演示文稿、网页嵌入,需要减少视觉疲劳的场景 背景温暖柔和,线条颜色饱和,网格线浅灰不突兀
fivethirtyeight 模仿 538 新闻网站风格,灰色背景+深色网格线,标题突出,数据标签清晰 数据新闻、趋势分析,强调故事性的可视化 大字体标题,带透明度的填充色,网格线明显但不抢眼
ggplot 模仿 R 语言 ggplot2 风格,灰色网格线+白色背景,线条平滑,风格现代简约 学术报告、统计分析,习惯 ggplot2 风格的用户 网格线贯穿整个图表,坐标轴边框较细,数据系列颜色协调
dark_background 深色背景(近黑色),亮色线条和文本,突出数据本身 强调数据对比、投影展示,或需要暗色主题的场景 背景深色,线条多为亮黄、亮蓝等对比色,适合突出高值区域或密集数据
seaborn-v0_8-whitegrid 白色背景+浅灰网格线,线条纤细,风格清爽,数据系列颜色柔和 多数据系列对比、趋势图,需要网格辅助读数的场景 网格线清晰但不刺眼,适合展示连续数据的细微变化
seaborn-v0_8-darkgrid 深灰背景+白色网格线,对比度适中,数据系列区分度高 分类数据对比、散点图,需要减少背景干扰的场景 背景沉稳,网格线突出,适合多组数据并行展示
seaborn-v0_8-paper 小尺寸布局,紧凑风格,适合印刷,字体和线条比例适配论文页面 学术论文、期刊投稿,需要严格控制图表尺寸的场景 元素紧凑,字体适中,节省页面空间
seaborn-v0_8-poster 大尺寸布局,粗线条+大字体,视觉冲击力强 海报展示、投影汇报,需要远距离观看的场景 元素放大,线条加粗,适合突出核心数据趋势
grayscale 全灰度配色,无彩色,仅通过明暗区分数据系列 黑白印刷、色盲友好场景,或需要弱化颜色干扰的分析 用灰度梯度替代彩色,避免颜色依赖,适合严谨的学术印刷
tableau-colorblind10 基于 Tableau 的色盲友好配色,10 种高对比度颜色,无红绿混淆 需考虑色盲受众的场景(如公开报告、通用数据展示) 颜色区分度高,对红绿色盲友好,适合多分类数据

3. 使用主题样式

Matplotlib 提供两种主要方法应用主题样式:style.use() 全局应用和 style.context() 临时应用。

3.1 全局应用:style.use()方法

该方法会永久修改当前会话的默认样式,所有后续图表都会遵循指定主题,直至重新应用其他主题或重启环境。

方法语法 作用描述 参数说明
ms.use(style_name) 应用单个主题 style_name:主题名称(字符串),如 'seaborn-v0_8-whitegrid'
ms.use([style1, style2]) 应用多个主题(后一个主题覆盖前一个冲突参数) 列表中的主题按顺序生效,适合组合自定义样式与内置主题

3.2 临时应用:style.context()方法

该方法通过上下文管理器 临时应用主题,仅在 with 代码块内生效,退出后自动恢复原有样式,适合局部图表的风格调整。

方法语法 作用描述 参数说明
with ms.context(style_name): 临时应用单个主题 style_name:主题名称,如 'ggplot'
with ms.context([style1, style2]): 临时应用多个主题(后覆盖前) 列表中的主题按顺序生效,如 ['seaborn-v0_8-paper', 'grayscale']
with ms.context(style, after_reset=True): 先重置默认样式,再应用主题 after_reset=True:确保主题不受之前配置影响(默认 False

3.3 示例:绘制分区柱形图

绘制分区柱形图,并设置主题风格为Solarize_Light2

python 复制代码
# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt
# 导入 matplotlib.style 模块,用于设置图表样式
import matplotlib.style as ms
# 导入 numpy 模块,用于数值计算,这里主要用于生成数组
import numpy as np

# 设置图表样式
ms.use('Solarize_Light2')

# 使用 numpy 创建一个数组,表示柱状图中每个柱子在 x 轴上的位置
x = np.array([0, 1, 2, 3, 4])

# 定义 x 轴上实际显示的刻度标签(对应每个柱子)
tick_label = ['a', 'b', 'c', 'd', 'e']

# 定义第一组数据的高度(y 轴数值),代表第一个柱状图的数据集
height = [3, 5, 2, 8, 6]
# 定义第二组数据的高度(y 轴数值),代表第二个柱状图的数据集
height2 = [5, 7, 3, 9, 8]

# 设置柱子的宽度
width = 0.3
# 绘制第一组柱状图:
# - x: 每个柱子在 x 轴上的位置(基于之前定义的数组)
# - height: 第一组柱子的高度
# - tick_label: 替换 x 轴上默认的标签为自定义的标签
# - width: 设置柱子的宽度
plt.bar(x=x, height=height, tick_label=tick_label, width=width)

# 绘制第二组柱状图:
# - x + width: 将第二组柱子的位置相对于第一组向右移动一定宽度,以避免重叠
# - height2: 第二组柱子的高度
# - width: 设置柱子的宽度
plt.bar(x=x + width, height=height2, width=width)

# 显示绘制完成的图表
plt.show()

绘制的图形如下图所示:


七、填充区域

1. 填充区域介绍

填充区域是数据可视化中突出数据范围、差异或分布的重要手段,通过填充线条与坐标轴、线条与线条之间的区域,可直观展示数据的波动范围、置信区间、累积分布等信息,增强图表的信息密度和可读性。

填充区域指在图表中,对指定边界(如曲线与坐标轴、两条曲线之间)所围合的区域进行颜色或图案填充的操作。其核心作用包括:

  • 展示数据的范围或波动(如时序数据的误差范围、置信区间);
  • 强调累积分布(如面积图展示占比变化);
  • 突出差异对比(如两条曲线间的差值填充)。

在 Matplotlib 中,填充区域主要通过 fill()fill_between()fill_betweenx() 三类方法实现,分别适用于不同的边界条件(多边形填充、x 轴方向填充、y 轴方向填充 )。

2. 使用填充区域

2.1 使用 fill() 填充

fill() 方法用于填充多边形区域,通过传入顶点坐标(x、y 数组),自动闭合多边形并填充颜色。适合绘制自定义多边形、不规则数据分布的填充(如地理边界、任意多边形区域)。

fill()方法参数说明:

参数名 作用描述 示例值 补充说明
x 多边形顶点的 x 坐标数组 [0, 2, 4] 长度需与 y 一致,按顺序连接顶点形成闭合区域
y 多边形顶点的 y 坐标数组 [1, 3, 2] x 一一对应,共同定义多边形形状
color 填充颜色 'skyblue''#FF0000' 支持颜色名称、十六进制、RGB 元组等
alpha 填充透明度 0.30.7 范围 [0, 1],值越小越透明
edgecolor 多边形边缘颜色 'black''none' 'none' 表示隐藏边缘
linewidth 边缘线条宽度 1.50 0 表示无边线(与 edgecolor='none' 效果一致)
linestyle 边缘线条样式 '--''-.' 同线型设置(如 '-' 实线、':' 点线)
label 填充区域的图例标签 '填充区域' 需配合 plt.legend() 显示图例
示例:绘制多边形

绘制多边形,并填充颜色。

python 复制代码
import matplotlib.pyplot as plt  # 导入 matplotlib 的 pyplot 模块,用于绘制图形

# 设置绘图时使用的字体为 SimHei(黑体),解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号(-),因为默认情况下使用某些中文字体可能无法正常显示负号
plt.rcParams['axes.unicode_minus'] = False

# 多边形顶点 x 坐标列表
x = [0, 2, 4, 3]
# 多边形顶点 y 坐标列表
y = [1, 3, 2, 0]

# 使用 fill() 方法填充多边形区域
plt.fill(
    x, y,  # 指定多边形各顶点的坐标
    facecolor='lightgreen',  # 填充颜色为浅绿色
    alpha=0.5,  # 透明度设置为 0.5,值在 0 至 1 之间,0 为完全透明,1 为不透明
    edgecolor='green',  # 边缘线条颜色设为绿色
    linewidth=2,  # 边缘线条宽度设为 2
    linestyle='--',  # 边缘线条样式设为虚线
    label='多边形填充'  # 图例标签名
)

# 设置 x 轴的数值范围
plt.xlim(-1, 5)
# 设置 y 轴的数值范围
plt.ylim(-1, 4)

# 添加图例,展示图表中的标记信息
plt.legend()

# 设置图表标题
plt.title('fill() 填充多边形示例')

# 显示绘制出的图表
plt.show()

绘制的图形如下图所示:

2.2 使用 fill_between() 填充

fill_between() 方法用于填充两条曲线在 x 轴方向的区域(即固定 x 范围,填充 y 的上下边界之间的区域),是时序数据、波动范围可视化的核心工具(如展示温度的最高-最低区间)。

fill_between()方法参数说明:

参数名 作用描述 示例值 补充说明
x 公共的 x 坐标数组(需为一维数组) np.linspace(0, 10, 100) 定义填充区域的 x 范围
y1 上边界的 y 坐标数组 np.sin(x) x 长度一致,定义填充区域的上沿
y2 下边界的 y 坐标数组 np.cos(x)0 默认为 0(即填充到 x 轴),可指定另一曲线作为下边界
where 条件填充的布尔数组 y1 > y2 仅填充满足 where 条件的区域(需与 x 长度一致)
interpolate 是否在交点处插值 TrueFalse y1y2 交叉时,True 可避免填充区域断裂
color 填充颜色 'orange' fill() 方法
alpha 填充透明度 0.4 fill() 方法
edgecolor 填充区域边缘颜色 'red' fill() 方法
label 图例标签 '波动区间' 需配合 plt.legend() 显示
step 填充边界是否按阶梯式绘制 'pre''post'None 'pre':在 y 点处提前阶梯跳跃;'post':在 y 点处滞后阶梯跳跃;None(默认):线性连接边界
示例:绘制单条折线图

绘制单条折线图,并填充水平区域。

python 复制代码
# 导入 matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt
import numpy as np

# 设置绘图中使用的字体为 SimHei(黑体),以支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 注意:这里重复设置了一次,实际只需设置一次即可
plt.rcParams['font.sans-serif'] = ['SimHei']  # ← 这行是重复的,可删除

# 定义 x 轴数据:表示年份从 2010 到 2019
x = np.array([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019])

# 定义 y 轴数据:表示对应年份的某个指标数值(如销售额、用户数等)
y = np.array([10, 15, 18, 25, 30, 50, 65, 70, 80, 95])

# 在 x 轴和 y 轴之间的区域进行填充
plt.fill_between(
    x=x,  # 填充区域的横坐标
    y1=y,  # 填充区域的上边界(y 值)
    color='lightblue',  # 填充颜色为浅蓝色
    alpha=0.8,  # 透明度,0 表示完全透明,1 表示完全不透明
    edgecolor='black',  # 填充区域边缘的颜色(边框线颜色)
    label='填充区域',  # 图例标签,用于后续显示图例
    where=(x >= 2010) & (x <= 2019),  # 指定填充的条件范围:只在年份 2010 到 2019 之间填充
    step='pre'  # 使用"阶梯图"模式填充,'pre' 表示在每个 x 值之前发生跳变
)

# 使用 plot 函数绘制折线图,连接数据点形成趋势线
plt.plot(x, y)

# 显示绘制好的图形窗口
plt.show()

绘制的图形如下图所示:

2.3 使用 fill_betweenx() 填充

fill_betweenx() 方法用于填充两条曲线在 y 轴方向的区域(即固定 y 范围,填充 x 的左右边界之间的区域),适合展示 y 轴主导的分布(如人口年龄分布的累积区间)。

fill_betweenx()方法参数说明:

参数名 作用描述 示例值 补充说明
y 公共的 y 坐标数组(需为一维数组) np.linspace(0, 5, 50) 定义填充区域的 y 范围
x1 右边界的 x 坐标数组 np.exp(y/2) y 长度一致,定义填充区域的右沿
x2 左边界的 x 坐标数组 np.log(y+1)0 默认为 0(即填充到 y 轴),可指定另一曲线作为左边界
where 条件填充的布尔数组 x1 > x2 仅填充满足 where 条件的区域(需与 y 长度一致)
interpolate 是否在交点处插值 TrueFalse x1x2 交叉时,True 可避免填充区域断裂
color 填充颜色 'cyan' fill() 方法
alpha 填充透明度 0.5 fill() 方法
edgecolor 填充区域边缘颜色 'black' fill() 方法
label 图例标签 'Y 轴方向填充' 需配合 plt.legend() 显示
step 填充边界是否按阶梯式绘制 'pre''post'None 'pre':在 y 点处提前阶梯跳跃;'post':在 y 点处滞后阶梯跳跃;None(默认):线性连接边界
示例:产品评分与价格区间的关系
python 复制代码
# 导入必要模块
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体,确保中文正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']

# 定义y轴数据:产品评分(1-5分)
y = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0])

# 定义x轴数据:对应评分的价格区间(左边界和右边界)
x_low = np.array([50, 80, 120, 180, 250, 320, 400, 500, 600])  # 最低价格
x_high = np.array([100, 150, 200, 280, 380, 480, 580, 700, 900])  # 最高价格

# 使用fill_betweenx()填充y轴方向的价格区间
plt.fill_betweenx(
    y=y,  # 纵坐标为产品评分
    x1=x_low,  # 左边界:最低价格
    x2=x_high,  # 右边界:最高价格
    color='lightcoral',  # 填充颜色为浅珊瑚色
    alpha=0.6,  # 透明度设置为0.6
    edgecolor='maroon',  # 边缘线颜色为褐红色
    linewidth=1.2,  # 边缘线宽度
    label='价格区间',  # 图例标签
)

# 绘制价格区间的上下边界线
plt.plot(x_low, y, color='maroon', linestyle='--', label='最低价格')
plt.plot(x_high, y, color='maroon', linestyle='-', label='最高价格')

# 添加标题和坐标轴标签
plt.title('产品评分与价格区间的关系')
plt.xlabel('价格(元)')
plt.ylabel('产品评分(1-5分)')

# 显示图例和网格
plt.legend()

# 展示图形
plt.show()

绘制的图形如下图所示: