当前位置: 首页 > news >正文

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图(统计图表)

  • 1. 概述
    • 1.1 简介
    • 1.2 安装
    • 1.3 导入
    • 1.4 保存
    • 1.5 数据来源
      • 1.5.1 Numpy ndarray
      • 1.5.2 Pandas DataFrame
    • 1.6 中文显示
  • 2. 基础样式
    • 2.1 颜色
      • 2.1.1 简称
      • 2.1.2 全称
    • 2.2 布局
      • 2.2.1 Matplotlib 画布划分
      • 2.2.2 绘制子图
        • ① Subplot()绘制子图
        • ② Subplots()绘制子图
      • 2.2.3 调整子图边距
        • ① 自动调整
        • ② 设定间距
      • 2.2.4 调整图像范围
      • 2.2.5 画布尺寸
    • 2.3 主题
      • 2.3.0 默认主题 default / fast
      • 2.3.1 暗黑主题 dark_background
      • 2.3.2 灰度主题 grayscale
      • 2.3.3 日光主题 Solarize_Light2
      • 2.3.4 经典主题 classic
      • 2.3.5 贝叶斯主题 bmh
      • 2.3.6 流行主题 ggplot
      • ※ Seanborn主题系列
    • 2.5 修饰
      • 2.5.1 网格线
      • 2.5.2 标题
      • 2.5.3 标签
      • 2.5.4 刻度
      • 2.5.5 脊轴 - 外框
      • 2.5.6 图例
      • 2.5.7 文字
      • 2.5.8 注释
      • 2.5.9 连线
  • 3. 统计图表
    • 3.1 散点图
      • 3.1.1 方法参数
      • 3.1.2 标记点
      • 3.1.3 常见散点图
        • ① 散点图
        • ② 气泡图
    • 3.2 折线图
      • 3.1.1 方法参数
      • 3.1.2 绘图线
      • 3.1.4 常见折线图
        • ① 普通折线图
        • ② 复合折线图
        • ③ 折线积分域图
    • 3.3 柱状图
      • 3.3.1 方法参数
      • 3.3.2 常见柱状图
        • ① 普通柱状图
        • ② 复合柱状图
        • ③ 堆叠柱状图
    • 3.4 饼状图
      • 3.4.1 方法参数
      • 3.4.2 常见饼状图
        • ① 普通饼状图
        • ② 附柱饼状图
        • ③ 普通环状图
        • ④ 复合环状图
    • 3.5 直方图
      • 3.5.1 方法参数
      • 3.5.2 常见直方图
        • ① 普通直方图
        • ② 复合直方图
    • 3.6 热力图
      • 3.6.1 颜色条
        • ※ 方法参数
      • 3.6.2 方法参数
        • ① 核心方法
        • ② 辅助方法
      • 3.6.3 举例说明
        • ① 普通热力图
        • ② 倾斜热力图
    • 3.7 箱型图
      • 3.7.1 方法参数
      • 3.7.2 举例说明
    • 3.7 提琴图
      • 3.7.1 方法参数
      • 3.7.2 举例说明

1. 概述

Python统计图主流库

  • Matplotlib / Seaborn
  • Plotly
  • Bokeh
  • Altair
  • Pygal
  • Anvil
  • Pyecharts

1.1 简介

本文不涉及配色方案,仅介绍Matplotlib使用方法 及 核心函数的重要参数。

官网链接:Matplotlib官网

官网样例链接:Matplotlib官网样例

Matplotlib官网

1.2 安装

通过 pip 命令安装 Matplotlib

pip install matplotlib

1.3 导入

导入MatplotlibNumpy

import matplotlib.pyplot as plt
import numpy as np

1.4 保存

保存绘制完成的图像

fig.savefig("./Figure.png")

1.5 数据来源

1.5.1 Numpy ndarray

先对numpy保存与加载数据进行回顾。

import numpy as np# 数据
fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
fruits_a = np.array([25, 36, 12])
fruits_b = np.array([67, 10, 5])# npy文件 保存与加载
np.save('fruits.npy', fruits)
loaded_fruits = np.load('fruits.npy')# npz文件 保存与加载
np.savez('fruits_ab.npz', array1=fruits_a, array2=fruits_b)
loaded_fruits_ab = loaded_fruits = np.load('frfruits_ab.npz')
loaded_fruits_a, loaded_fruits_b = loaded_fruits_ab[0], loaded_fruits_ab[1]# npz文件 保存+压缩与加载
np.savez_compressed('fruits_ab_compressed.npz', array1=fruits_a, array2=fruits_b)
loaded_fruits_ab = loaded_fruits = np.load('frfruits_ab_compressed.npz')
loaded_fruits_a, loaded_fruits_b = loaded_fruits_ab[0], loaded_fruits_ab[1]

假设数据已经转换为numpy.ndarray数组。

# 导入库
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号# 数据
fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
colors = ['red', 'orange', 'yellow']# 绘制图表
fig, ax = plt.subplots()
fig.set_size_inches(4,5)
ax.bar(x=fruits[0], height=fruits[1].astype(float), width=0.6, color=colors)
plt.show()

数据来源

Numpy数组转换时存在的问题

当numpy二维数组中包含不同类型元素的子数组时,后续子数组元素类型会与首个子数组保持一致。

以下面代码为例,即:导致我们取出来的元素类型为字符串 np.str_('25')

# 数据
fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
print(fruits[1])
print(list(fruits[1]))

numpy

而Matplotlib并不会帮助我们将类型转换会数字,这就导致出现错误的结果。

fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
plt.bar(x=fruits[0], height=fruits[1], width=0.6)
plt.show()

错误的结果

所以,这种情况下,绘图前需要提前进行类型转换。

# 数据
fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
print(fruits[1].astype(float))

numpy

这样就可以得到与上面同样的结果了。

1.5.2 Pandas DataFrame

利用pandas库DataFrame绘制图像,代码如下:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False# DataFrame数据
fruits = np.array([[25, 36, 12], [67, 10, 5]])
df = pd.DataFrame(fruits)
df.columns = ['苹果', '橘子', '香蕉']
areas = ['省份A', '省份B']# 绘制图像
bar_width = 0.4
x_ticks = np.arange(3)fig, ax = plt.subplots()
fig.set_size_inches(3, 4)
for i in range(len(df)):rects = ax.bar(x_ticks + bar_width * i, df.loc[i], width = bar_width, label = areas[i])ax.bar_label(rects)
ax.set_xticks(x_ticks + 0.2, df.columns)# 展示图像
ax.legend(loc='upper right', ncols=2)
plt.xlim(-0.5, 2.8)
plt.ylim(0, 80)
plt.show()

pandas

1.6 中文显示

将字体路径添加到配置,确保中文与负号正常显示。

import matplotlib# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号

2. 基础样式

2.1 颜色

2.1.1 简称

plot_colortable(mcolors.BASE_COLORS, ncols=3, sort_colors=False)

颜色简写

2.1.2 全称

plot_colortable(mcolors.CSS4_COLORS)
plt.show()

颜色全称

2.2 布局

2.2.1 Matplotlib 画布划分

布局

Matplotlib画布划分框架:

  • Figure:表示整个画布
  • Axes:表示Figure中的子图
    • subplot()subplots()方法创建
    • 使用matplotlib.pyplot直接创建图像仅含单个子图
  • Axis:子图坐标轴
    • X/Y Label:X/Y轴标签
  • Legend:图例

2.2.2 绘制子图

① Subplot()绘制子图

在Matplotllib中,subplot使用网格坐标在同一Figure中绘制多个子图。

ax = plt.subplot(nrows, ncols, plot_number)

参数介绍:

  • nrows:子图网格行数
  • ncols:子图网格列数
  • plot_number:子图编号 以1起始 从左向右+从上至下 Z字型 依次递增

返回介绍:

  • ax:子图对象axes

例如,创建一个2×2的多子图画布,并利用axes创建不同图像:

# 声明第一个子图
ax1 = plt.subplot(2, 2, 1)
np.random.seed(0)
x = np.arange(0,10)
y = np.random.randint(1, 10, 10)
ax1.scatter(x, y)# 声明第二个子图
ax2 = plt.subplot(2, 2, 2)
ax2.plot([0, 1, 2, 4], [1, 0, 3, 2])# 声明第三个子图
ax3 = plt.subplot(2, 2, 3)
ax3.bar([1, 2, 3, 4], [1, 5, 3, 2])# 声明第四个子图
ax4 = plt.subplot(2, 2, 4)
np.random.seed(1)
x = np.arange(0,10)
y = np.random.randint(1, 10, 10)
ax4.scatter(x, y)plt.show()

子图创建

这种方式每次创建子图均需要输入子图网格行列,使得编写繁琐,于是便有了subplots()方法。

② Subplots()绘制子图

在Matplotllib中,subplots使用网格坐标在同一Figure中绘制多个子图。

fig, axes = matplotlib.pyplot.subplot(nrows, ncols, figsize, sharex, sharey)

参数介绍:

  • nrows:子图网格行数
  • ncols:子图网格列数
  • figsize:设置画布尺寸 1×2元组
  • sharex / sharey:共享x/y坐标轴

返回介绍:

  • fig:图形/画布对象
  • axes:子图对象二维列表,坐标与子图坐标相对应

例如,创建一个2×2的多子图画布,并利用axes创建不同图像:

import matplotlib.pyplot as plt
import numpy as np# 提前创建子图
fig, axes = plt.subplots(2, 2)# 声明第一个子图
ax1 = axes[0, 0]
np.random.seed(0)
x = np.arange(0,10)
y = np.random.randint(1, 10, 10)
ax1.scatter(x, y)# 声明第二个子图
ax2 = axes[0, 1]
ax2.plot([0, 1, 2, 4], [1, 0, 3, 2])# 声明第三个子图
ax3 = axes[1, 0]
ax3.bar([1, 2, 3, 4], [1, 5, 3, 2])# 声明第四个子图
ax4 = axes[1, 1]
np.random.seed(1)
x = np.arange(0,10)
y = np.random.randint(1, 10, 10)
ax4.scatter(x, y)plt.show()

创建子图

在Matplotllib中,subplots也可绘制单个子图。

fig, ax = plt.subplots()

此时,函数仅返回一个matplotlib.axes._axes.Axes对象,并非以数组形式呈现。

Axes

两者间关系

axes_list 为装有matplotlib.axes._axes.Axes对象的二维列表,其坐标与子图对应。

import matplotlib.pyplot as pltfig, axes_list = plt.subplots(2, 2)
print(axes)
ax = plt.subplot(1, 1, 1)
print(ax)

Axes

import matplotlib.pyplot as pltfig, ax = plt.subplots()
print(type(ax))

Axes

2.2.3 调整子图边距

① 自动调整

调用tight_layout()函数可自动调整间距。

matplotlib.pyplot.tight_layout()
② 设定间距

调用subplots_adjust()函数可设定子图间距:

matplotlib.pyplot.subplots_adjust(left=0.15, right=0.15, top=0.2, bottom=0.2, wspace=0.2, hspace=0.25)

参数说明:

  • left / right / top / bottom:子图四向间距
  • wspace / hspace:子图间横纵间距

除了subplots_adjust函数,Matplotlib还提供GridSpec对象,其允许更灵活地指定子图的 位置 与 大小,从而实现更复杂的图形布局。

2.2.4 调整图像范围

调用xlim()tlim()函数可调整图像范围:

# 调整x轴范围
matplotlib.pyplot.xlim(bottom, top, emit=True, auto=True)
# 调整y轴范围
matplotlib.pyplot.ylim(left, right, emit=True, auto=True)

参数说明:

  • bottom | left:用于设置x|y轴下限 默认None
  • top | right:用于设置x|y轴上限 默认None
  • auto:自动计算范围 布尔值 默认True

matplotlib.axes._axes.Axes对象对应的方法(使用方式类同 方法名前加set_):

# 调整x轴范围
axes.set_xlim(bottom, top, emit=True, auto=True)
# 调整y轴范围
axes.set_ylim(left, right, emit=True, auto=True)

2.2.5 画布尺寸

使用plt创建预设尺寸的画布

fig = plt.figure(figsize=(12,10))

利用子图返回figure对象修改画布尺寸

fig, axes = plt.subplots(2, 2)
fig.set_size_inches(12, 10)

创建图形后 使用gcf获取图形 回顾性地设置图形尺寸

plt.gcf().set_size_inches(10, 8)

2.3 主题

官网链接:Maplotlib主题

查看该版本所有可用主题:

matplotlib.pyplot.style.available
plt.style.available

主题列表

两种调用方法

通过 use 方法

plt.style.use('[Style_Name]')
# 遵循主题的图表代码plt.show()

通过with关键字:

with plt.style.context('[Style_Name]'):# 遵循主题的图表代码plt.show()

主题小节展示样例,均使用以下正弦函数代码:

import matplotlib.pyplot as plt
import numpy as npplt.style.use('[Style_Name]')x = np.linspace(- np.pi, np.pi)
y = np.sin(x)
plt.plot(x, y)plt.show()

主题:预设 画布背景色+图像颜色及点线样式等 的 显示方案

2.3.0 默认主题 default / fast

一般使用Matplotlib生成的图像,默认为白底。

默认主题

2.3.1 暗黑主题 dark_background

plt.style.use('dark_background')

暗黑主题

2.3.2 灰度主题 grayscale

plt.style.use('grayscale')

灰度主题

2.3.3 日光主题 Solarize_Light2

plt.style.use('Solarize_Light2')

日光主题

2.3.4 经典主题 classic

plt.style.use('classic')

经典主题

2.3.5 贝叶斯主题 bmh

plt.style.use('bmh')

贝叶斯主题

2.3.6 流行主题 ggplot

plt.style.use('ggplot')

流行主题

※ Seanborn主题系列

Seanborn:Maplotlib的一个抽象层

该系列涵盖以下主题:

'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'

本文以seaborn-v0_8为例:

plt.style.use('seaborn-v0_8')

海生主题

2.5 修饰

2.5.1 网格线

matplotlib.axes._axes.Axes对象所包含方法:

axes.grid(b=None, which='major', axis='both')
  • b:可选布尔值 表示是否显示
  • which:可选 ‘major’、‘minor’ 、 ‘both’ 默认 ‘major’
  • axis:可选 ‘both’、‘x’ 、 ‘y’ 表示轴线方向 默认’both’
  • linestyle:网格线 - 样式
  • color: 网格线 - 颜色
  • linewidth: 网格线 - 宽度

例如,创建一个1×3的多子图画布,并利用axes创建不同图像:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(0.0, 2.0, 0.01)
y = 1 + np.sin(2 * np.pi * t)
# 定义子图
fig, axes = plt.subplots(1, 3)
fig.set_size_inches(12, 3)# 创建第一个子图
axes[0].plot(x, y)# 创建第二个子图
axes[1].plot(x, y)
axes[1].grid()# 创建第二个子图
axes[2].plot(x, y, color='darkblue')
axes[2].grid(axis='y', color='silver', linestyle='dashed', linewidth=2)# 展示图
plt.show()

网格线

2.5.2 标题

设置x轴和y轴的标签

matplotlib.pyplot.title(label, fontsize=None, color=None, loc=None)

参数说明:

  • label:标题文本
  • fontsize:字体大小 数值/字符串(‘[num]’/‘xx-small’/‘x-small’/‘small’/‘medium’/‘large’/‘x-large’/‘xx-large’)
  • color\color:字体颜色
  • loc:标题位置 可选’left’/‘center’/‘right’ 默认’center’
  • rotation:标题旋转角度 角度值/角度字符串 默认None
  • fontfamily \ font \ fontname:字体名称
  • fontstyle or style:字体样式 字符串(‘normal’/‘italic’/‘oblique’)
  • fontweight \ weight : 字体加粗 数值/字符串([num 0-1000]/‘ultralight’/‘light’/‘normal’/‘regular’/‘book’/‘medium’/‘roman’/‘semibold’/‘demibold’/‘demi’/‘bold’/‘heavy’/‘extra bold’/‘black’)
  • visible:是否可见 布尔值

matplotlib.axes._axes.Axes对象对应的方法(使用方式类同 方法名前加set_ || get_可获得该属性):

axes.set_title()

例如,创建图像并修改其标题:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(0, 2 * np.pi, 0.01)
y = np.sin(x)# 绘制图像
plt.plot(x, y)
plt.title("Sin(x)")
plt.show()

标题

2.5.3 标签

# 设置x轴标签
matplotlib.pyplot.xlabel(label, fontsize=None, color=None, loc=None)
# 设置y轴标签
matplotlib.pyplot.ylabel(label, fontsize=None, color=None, loc=None)

参数说明:

  • label:标题文本
  • fontsize:字体大小 数值/字号
  • color:字体颜色
  • loc:标题位置 可选’left’/‘center’/‘right’ 默认’center’
  • rotation:标签旋转角度 角度值/角度字符串 默认None

matplotlib.axes._axes.Axes对象对应的方法(使用方式类同 方法名前加set_ || get_可获得该属性):

# 调整
axes.set_xlabel()
# 调整
axes.set_ylabel()

例如,创建图像并修改其标签:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(0, 2 * np.pi, 0.01)
y = np.sin(x)# 绘制图像
plt.plot(x, y)
plt.title("Sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

标签

2.5.4 刻度

matplotlib.pyplot.xticks(locations, labels=None, rotation=None, minor=False)
  • locations:刻度位置 数值/列表
  • labels:刻度标签 列表/字符串 长度与locations相同 默认None
  • rotation:刻度标签旋转角度 角度值/角度字符串 默认None

matplotlib.axes._axes.Axes对象对应的方法(使用方式类同 方法名前加set_):

axes.set_xticks(locations, labels=None, rotation=None, minor=False)

举例将刻度旋转45度:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import MinMaxScaler# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号# 准备数据
np.random.seed(20)
x = ['省份A','省份B','省份C','省份D','省份E','省份F','省份G','省份H','省份I','省份J','省份K','省份L','省份M','省份N','省份O','省份P','省份Q','省份R','省份S','省份T']
y = np.random.randint(5, 30, 20)# 颜色条
summer_cmap = matplotlib.colormaps['cool']
## 根据数值映射颜色
# 归一化使映射效果更佳
scaler = MinMaxScaler(feature_range=(0, 1))
y_fitted = scaler.fit_transform(np.array(y).reshape(-1,1))
colors = summer_cmap(y_fitted)# 绘制图像
plt.bar(x, h, color=colors)
plt.title('20XX全域各省苹果年产量')
plt.xlabel('产地')
plt.ylabel('产量(万吨)')
plt.xticks(x, rotation=45)
plt.show()

刻度

2.5.5 脊轴 - 外框

class matplotlib.spines.Spine(axes, spine_type, path, **kwargs)

参数说明

  • axes:包含脊轴的Axes实例
  • spine_type:脊轴类型
  • path:绘制脊柱Path实例
  • alpha:透明度
  • color:整体颜色
  • edgecolor \ ec:边缘颜色
  • facecolor \ fc:填充颜色
  • label:标签
  • linestyle \ ls:线条样式
  • linewidth \ lw:线条宽度
  • visble:是否可见 布尔值

两种设置脊轴不可见的方法

通过修改matplotlib.axes._axes.Axes对象所包含visible属性或color属性实现:

axes.spines[['top']].set_visible(False)axes.spines['top'].set_color('none')

查看axes.spines

import matplotlib.pyplot as pltfig, axes = plt.subplots()
print(axes.spines)

脊轴

绘制带箭头坐标轴

实现方式:移动可视坐标轴位置 + 绘制与坐标轴末端重合的箭头(黑色三角形:“>k”/“^k” | >k右黑 ^k上黑)

在matplotlib中,get_yaxis_transform通常用于在绘制图形时,将y轴的坐标从数据坐标系转换到显示坐标系。

如若需要在y轴上添加文本或图形时,可使用此方法确定文本/图形在显示坐标系中的位置。

import matplotlib.pyplot as plt
import numpy as np# 定义子图
fig, ax = plt.subplots()# 准备数据
x = np.linspace(-0.5, 1., 100)
ax.plot(x, np.sin(x*np.pi))## 实现方式:移动可视坐标轴位置 + 绘制与坐标轴末端重合的箭头(黑色三角形:">k"/"^k" | >k右黑 ^k上黑)
# ① 移动可视坐标轴位置
ax.spines[["left", "bottom"]].set_position(("data", 0))
ax.spines[["top", "right"]].set_visible(False)
# ② 绘制与坐标轴末端重合的箭头(黑色三角形:">k"/"^k" | >k右黑 ^k上黑)
ax.plot(1, 0, ">k", transform=ax.get_yaxis_transform(), clip_on=False)
ax.plot(0, 1, "^k", transform=ax.get_xaxis_transform(), clip_on=False)plt.show()

坐标轴

2.5.6 图例

# 3.7以前版本
matplotlib.pyplot.legend(handles, labels, loc='best', ncols=1, prop, fontsize, labelcolor=None, numpoints=1, scatterpoints=1, scatteryoffsets=[0.375, 0.5, 0.3125], markerscale=1.0, markerfirst=True, reverse=False)
# 3.7以后版本
matplotlib.pyplot.legend(handles, labels, loc='best', ncols=1, prop, fontsize, labelcolor=None, numpoints=1, scatterpoints=1, scatteryoffsets=[0.375, 0.5, 0.3125], markerscale=1.0, markerfirst=True, reverse=False, frameon=True, fancybox=True, shadow=False, framealpha=0.8, facecolor='inherit', edgecolor='0.8', title, title_fontsize=None, alignment='center', borderpad=0.4, labelspacing=0.5, handlelength=2.0, handleheight=0.7, handletextpad=0.8, borderaxespad=0.5, columnspacing=2.0, draggable=False)

参数说明:

  • labels:图例显示内容 字符串列表
  • loc:图例位置 字符串(见 “位置说明”) 默认’best’
  • ncols:图例列数 数值 默认1
  • fontsize:图例标签字体大小 数值/字符串(‘[num]’/‘xx-small’/‘x-small’/‘small’/‘medium’/‘large’/‘x-large’/‘xx-large’)
  • labelcolor:图例标签文本颜色 字符串/字符串列表
  • markerscale:图例缩放 浮点型数值 默认1.0
  • markerfirst:图例标签左右侧 True-标记位于标签左侧 / False-标记位于标签右侧 默认True
  • reverse:图例展示顺序反转 True-顺序相反 / False-顺序相同 默认False
  • frameon:图例是否在贴片上绘制 True-贴片 / False-无 默认True
  • shadow:图例阴影 True-阴影 / False-无 默认False
  • framealpha:图例透明度 浮点型数值
  • facecolor:图例背景颜色
  • edgecolor:图例边框颜色
  • title:图例标题 字符串
  • title_fontsize:图例标题字体大小 数值/字符串(‘[num]’/‘xx-small’/‘x-small’/‘small’/‘medium’/‘large’/‘x-large’/‘xx-large’)
  • alignment:图例标题对齐方式 ‘center’/‘left’/‘right’ 默认’center’
  • borderpad:图例框内边距 浮点型数值
  • labelspacing:图例条目垂直间距 浮点型数值
  • columnspacing:图例列间距 浮点型数值
  • draggable:图例是否可拖拽 默认False

位置说明:

位置字符串 / Location String位置编码 / Location Code说明
‘best’0自动选择 最佳位置 / 默认值
‘upper right’1右上角
‘upper left’2左上角
‘lower right’3右下角
‘lower left’4左下角
‘right’5右侧
‘center left’6左侧中部
‘center right’7右侧中部
‘lower center’8底部中部
‘upper center’9顶部中部
‘center’10中部

2.5.7 文字

matplotlib.axes._axes.Axes对象的方法:

axes.text(x, y, s, fontdict=None, **kwargs)
  • x - y:位置坐标 浮点型数值
  • s:文字 字符串
  • alpha:透明度 浮点型数值
  • color \ c:颜色
  • fontfamily \ font \ fontname:字体名称
  • fontsize \ size:字体大小 数值/字符串(‘[num]’/‘xx-small’/‘x-small’/‘small’/‘medium’/‘large’/‘x-large’/‘xx-large’)
  • fontstyle or style:字体样式 字符串(‘normal’/‘italic’/‘oblique’)
  • fontweight \ weight : 字体加粗 数值/字符串([num 0-1000]/‘ultralight’/‘light’/‘normal’/‘regular’/‘book’/‘medium’/‘roman’/‘semibold’/‘demibold’/‘demi’/‘bold’/‘heavy’/‘extra bold’/‘black’)
  • visible:是否可见 布尔值

文字编辑 均可使用LaTex公式

ax.set_xlabel(r'\textbf{time (s)}')
ax.set_ylabel('\\textit{Velocity (\N{DEGREE SIGN}/sec)}', fontsize=16)
ax.set_title(r'\TeX\ is Number $\displaystyle\sum_{n=1}^\infty' r'\frac{-e^{i\pi}}{2^n}$!', fontsize=16, color='r')
ax.text(x=0, y=0, s=r'\TeX\ is Number $\displaystyle\sum_{n=1}^\infty' r'\frac{-e^{i\pi}}{2^n}$!', fontsize=16, color='r')

2.5.8 注释

matplotlib.axes._axes.Axes对象的方法:

Axes.annotate(text, xy, xytext=None, xycoords='data', textcoords=None, arrowprops=None, annotation_clip=None, **kwargs)

参数说明

  • text:注释文本 字符串
  • xy:注释坐标xy 元组(浮点型数值, 浮点型数值)
  • xytext:注释文本坐标xy 元组(浮点型数值, 浮点型数值) 默认等同xy
  • xycoords:坐标xy所在坐标系(见“坐标系说明”)
  • textcorrds:文本坐标系所在坐标系
  • arrowprops:xy与xytext间箭头属性 可选字典数值 默认None-不绘制箭头(见“箭头说明”)
  • annotation_clip:是否裁坐标轴区域外标注点 True-始终不绘制 / False-始终绘制 / None-坐标系’data’等同于True (默认)
  • color:注释文本颜色
  • fontsize:注释文本尺寸

坐标系说明

取值 / Value描述 / Description说明
‘figure points’Points from the lower left the figure点从图的左下方开始
‘figure pixels’Pixels from the lower left of the figure像素从图的左下角开始
‘figure fraction’Fraction of figure from lower left图的左下部分
‘subfigure points’Points from the lower left of the subfigure点从子图左下方
‘subfigure pixels’Pixels from the lower left of the subfigure像素从子图左下方
‘subfigure fraction’Fraction of subfigure from lower left子图左下方的分数
‘axes points’Points from lower left corner of the Axes点从左下角的轴
‘axes fraction’Pixels from lower left corner of the Axes像素从左下角的轴
‘data’Use the coordinate system of the object being annotated (default)使用被注释对象的坐标系统(默认)
‘polar’(theta, r) if not native ‘data’ coordinates(theta, r)

箭头说明

普通箭头:

取值 / Value描述 / Description说明
widthThe width of the arrow in points箭头的宽度(以点为单位)
headwidthThe width of the base of the arrow head in points箭头头部的宽度(以点为单位)
headlengthThe length of the arrow head in points箭头头部的长度(以点为单位)
shrinkFraction of total length to shrink from both ends从两端收缩的总长度的比例
connectionstyleArc of arrow箭头弧度(见“弧度说明”)
edgecolorEdge line color边缘线条颜色
linestyleEdge line style边缘线条样式
linewidthEdge line width边缘线条宽度
colorColor of the arrow整体颜色(覆写edgecolor)
facecolorFacecolor of the arrow箭头填充颜色

华丽箭头(matplotlib.patches.ArrowStyle:A-指向文本 / B-指向对象 / AB-双向)

类型 / Class取值 / Value描述 / Description
Curve-None
CurveA<-head_length=0.4, head_width=0.2, widthA=1.0, widthB=1.0, lengthA=0.2, lengthB=0.2, angleA=0, angleB=0, scaleA=None, scaleB=None
CurveB->head_length=0.4, head_width=0.2, widthA=1.0, widthB=1.0, lengthA=0.2, lengthB=0.2, angleA=0, angleB=0, scaleA=None, scaleB=None
CurveAB<->head_length=0.4, head_width=0.2, widthA=1.0, widthB=1.0, lengthA=0.2, lengthB=0.2, angleA=0, angleB=0, scaleA=None, scaleB=None
CurveFilledA`<-`
CurveFilledB`->`
CurveFilledAB`<-
BracketA]-widthA=1.0, lengthA=0.2, angleA=0
BracketB-[widthB=1.0, lengthB=0.2, angleB=0
BracketAB]-[widthA=1.0, lengthA=0.2, angleA=0, widthB=1.0, lengthB=0.2, angleB=0
BarAB`-
BracketCurve]->widthA=1.0, lengthA=0.2, angleA=None
CurveBracket<-[widthB=1.0, lengthB=0.2, angleB=None
Simplesimplehead_length=0.5, head_width=0.5, tail_width=0.2
Fancyfancyhead_length=0.4, head_width=0.4, tail_width=0.4
Wedgewedgetail_width=0.3, shrink_factor=0.5

弧度说明:

类型 / Class取值 / Value描述 / Description
Arc3arc3rad=0.0
Angle3angle3angleA=90, angleB=0
AngleangleangleA=90, angleB=0, rad=0.0
ArcarcangleA=0, angleB=0, armA=None, armB=None, rad=0.0
BarbararmA=0.0, armB=0.0, fraction=0.3, angle=None

基于华丽箭头微调(微调属性):

arrow = matplotlib.patches.ArrowStyle.BarAB(widthA=1.5, angleA=0, widthB=0.5, angleB=0)

分别对普通箭头和华丽箭头举例说明:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np# 声明第一个子图
fig, ax = plt.subplots()
np.random.seed(0)
x = np.arange(0,10)
y = np.random.randint(1, 10, 10)
ax.scatter(x, y)
# 普通箭头
ax.annotate('Point A', xy=(1,1), xytext=(5,5), arrowprops={'width':2, 'headwidth':5, 'linewidth': 1, 'facecolor': 'gold','edgecolor': 'red'}, color='orangered', fontsize=12)
# 华丽箭头(默认)
ax.annotate('Distance', xy=(3,4), xytext=(8,5), arrowprops={'arrowstyle': '|-|','edgecolor':'brown'}, color='chocolate', fontsize=12)
# 华丽箭头(微调)
arrow = matplotlib.patches.ArrowStyle.BarAB(widthA=1.5, angleA=0, widthB=0.5, angleB=0)
ax.annotate('What can you see?', xy=(1,7), xytext=(2,7.5), arrowprops={'arrowstyle': arrow, 'color':'teal'}, color='lightseagreen', fontsize=12)plt.show()

注释

2.5.9 连线

需导入库:

from matplotlib.patches import ConnectionPatch

class matplotlib.patches.ConnectionPatch(xyA, xyB, coordsA, coordsB=None, *, axesA=None, axesB=None, arrowstyle='-', connectionstyle='arc3', patchA=None, patchB=None, shrinkA=0.0, shrinkB=0.0, mutation_scale=10.0, mutation_aspect=None, clip_on=False, **kwargs)

参数说明

  • xyA:连接线起始点
  • xyB:连接线结束点
  • coordsA:起始点坐标系 默认为data
  • coordsB:结束点坐标系 默认为data
  • axesA:起始点所在Axes对象
  • axesB:结束点所在Axes对象
  • color:连接线颜色
  • linewidth:连接线线宽
  • linestyle:连接线线型

举例说明:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import ConnectionPatch# 定义子图
fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6))
# 绘制第一个子图
ax1.plot([1, 2, 3], [1, 4, 9])
# 绘制第二个子图
ax2.plot([2, 3, 4], [4, 3, 2])
# 在两个子图之间绘制连线
conn = ConnectionPatch((1.5, 1.5), (3.5, 3.5), 'data', 'data', axesA=ax1, axesB=ax2, color='r', linewidth=3, linestyle='--')
fig.add_artist(conn)
plt.show()

绘制连接线

3. 统计图表

3.1 散点图

散点图(Scatter Plot):一种数据可视化图表,通过平面坐标系中的点(数据点)展示两个变量之间的关系。

每个点的横纵坐标分别对应一个变量的值,点的分布形态可反映变量间的相关性或模式。

3.1.1 方法参数

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, alpha=None)

参数说明:(兼容axes)

  • x | y:数据点 长度相同的数组
  • s:点的尺寸 默认20 单值 / 数组
  • c:点的颜色 默认蓝色
    • 颜色值:单值 / 数组 简称/全称/RGB/RGBa
    • Z值:数组 通过不同颜色表示Z值大小
  • marker:点的样式 默认’o’
  • cmap:Colormap颜色条 默认 None
  • alpha:透明度 默认不透明 0~1 之间

3.1.2 标记点

该属性适用于 折线图散点图,其中常见的点类型如下:

markerdescription描述
.point
,pixel像素
ocircle
+plus加号
xx叉号
*star星星
Ddiamond菱形 / 钻石
dthin_diamond窄菱 / 细钻

一些常见 但不常用的类型如下:

markerdescription描述
8octagon八边形
ssquare正方形
ppentagon五边形
hhexagon1六边形
Hhexagon2六边形

一些较为少见的类型如下:

markerdescription描述
vtriangle_down倒三角形
^triangle_up正三角形
<triangle_left左三角形
>triangle_right右三角形
1tri_down倒三叉形
2tri_up正三叉形
3tri_left左三叉形
4tri_right右三叉形

将其分别应用至 折线图散点图

  • 折线图函数 plot 中 marker 相关参数:
    • marker:样式
    • markerfacecolor: 标记填充颜色
    • markersize: 尺寸(限单值)
  • 散点图函数 scatter 中 marker 相关参数:
    • marker:样式
    • c \ color:标记颜色
    • s:尺寸(单值 / 数组)

分别创建折线图与散点图 如下所示:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = y = np.arange(10)# 定义子图
fig, axes = plt.subplots(2, 1)
fig.set_size_inches(10, 10)# 创建第一个子图
axes[0].plot(x, y, marker='D', markerfacecolor='red', markersize=8)
axes[0].set(xlabel='X', ylabel='Y', title='Scatter Chart')
# 创建第二个子图
axes[1].scatter(x, y, marker='1', c='red', s=100)
axes[1].set(xlabel='X', ylabel='Y', title='Scatter Chart')# 展示图
plt.show()

点型

3.1.3 常见散点图

① 散点图

通过坐标表示XY对应关系

import matplotlib.pyplot as plt
import numpy as np# 生成模拟数据
x = np.arange(0, 20)
y = np.random.randint(1, 20, 20)# 通过散点图表示X-Y关系
plt.scatter(x, y, c='#39C5BB', s=65)# 显示图形
plt.show()

散点图

通过颜色表示XY对应Z数值

可通过matplotlib.pyplot.colorbar

import matplotlib.pyplot as plt
import numpy as np# 生成模拟数据
np.random.seed(0)
x = np.random.rand(100) * 4.0 - 2.0
y = np.random.rand(100) * 4.0 - 2.0
c = np.sin(np.pi * x) * np.cos(np.pi * y)# 通过不同颜色表示数值
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x, y, c=c, cmap='viridis', s=50)# 添加颜色条
plt.colorbar(scatter, label='Numerical Value')
# 设置标题和坐标轴标签
plt.title('Scatter Plot of Numerical Value')
plt.xlabel('Longitude')
plt.ylabel('Latitude')# 显示图形
plt.show()

散点图

② 气泡图

通过大小表示数值

import matplotlib.pyplot as plt
import numpy as np# 定义子图
fig, ax = plt.subplots()# 生成模拟数据
np.random.seed(0)
for color in ['blue', 'orange', 'green']:n = 40x, y = np.random.rand(2, n)scale = 300.0 * np.random.rand(n)ax.scatter(x, y, c=color, s=scale, label=color, alpha=0.3, edgecolors='none')# 显示图例、网格
ax.legend()
ax.grid()# 显示图形
plt.show()

气泡图

3.2 折线图

折线图(Line Chart):一种通过线段连接数据点的图表,用于展示数据随时间或有序类别变化的趋势。

其核心特点是强调数据的连续性、动态变化或规律性。

3.1.1 方法参数

matplotlib.pyplot.plot(x, y, color, linestyle, linewidth, marker, markerfacecolor, markersize, label)

参数说明:(兼容axes)

  • x | y:数据点 长度相同的数组
  • linestyle: 线条样式
  • color: 线条颜色
  • linewidth: 线条宽度(用数字表示大小)
  • marker: 标记样式
  • markerfacecolor: 标记填充颜色
  • markersize: 标记尺寸
  • label: 线条标签

多图绘制起始点不同时,通过调整x控制起始绘制点。

3.1.2 绘图线

markerdescription描述
-solid实线
dashed虚线
-.dashdot点画线
:dotted点线

折线图函数 plot 中 line 相关参数:

  • linestyle \ ls:样式
  • color \ c: 颜色
  • linewidth \ lw: 宽度

创建折线图 如下所示:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(0.0, 2.0, 0.01)
y1 = 1 + np.sin(2 * np.pi * x)
y2 = 1 + np.cos(2 * np.pi * x)
labels = ['1 + sin(2πx)', '1 + cos(2πx)']# 绘制图片
fig, ax = plt.subplots()
ax.plot(x, y1, linestyle='dotted', color='gold', linewidth=3)
ax.plot(x, y2, linestyle='dashed', color='silver', linewidth=1)
ax.set(xlabel='X', ylabel='Y', title='Line Chart')
ax.legend(labels)
ax.grid()# 展示图表
plt.show()

线型

3.1.4 常见折线图

① 普通折线图

表示仅有单个折线图的统计图,如上小节所示,这里不做赘述。

② 复合折线图

表示有多个折线图的统计图,通过给 单个pyplot / axes对象 添加 多个plot` 实现。

创建多折线图 如下所示:

import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(0.0, 2.0, 0.01)
y1 = 1 + np.sin(2 * np.pi * x)
y2 = 1 + np.cos(2 * np.pi * x)
labels = ['1 + sin(2πx)', '1 + cos(2πx)']# 绘制图片
fig, ax = plt.subplots()
ax.plot(x, y1, linestyle='dotted', color='gold', linewidth=3)
ax.plot(x, y2, linestyle='dashed', color='silver', linewidth=1)
ax.set(xlabel='X', ylabel='Y', title='Line Chart')
ax.legend(labels)
ax.grid()# 展示图表
plt.show()

复合折线图

③ 折线积分域图

表示有积分域的曲线图。

多边形类 Polygon

class matplotlib.patches.Polygon(xy, *, closed=True, **kwargs)

参数说明:

  • xy:路径点 必选项 (N, 2)列表
  • alpha:颜色透明度 取值0~1 默认1
  • color \ c:全局颜色 覆盖facecolor和edgecolor
  • edgecolor \ ec:边缘颜色
  • facecolor \ fc:填充颜色
  • linestyle \ ls:绘图线型
  • linewidth \ lw:绘图线宽
  • visible:是否可见

添加区域的常用方式如下:

paths = [...]
poly = matplotlib.patches.Polygon(paths)
ax.add_patch(poly)

创建带积分域的折线图 如下所示:

# 导入基本库
import matplotlib.pyplot as plt
import numpy as np
# 引入多边形域绘制类Polygon
from matplotlib.patches import Polygon# 定义子图
fig, ax = plt.subplots()# 函数
def func(x):return 1 + np.sin(2 * np.pi * x)# 准备数据
x = np.arange(0.0, 0.5 * np.pi, 0.01)
y = func(x)## 利用多边形域表示积分
# 横轴起始点
shade_start, shade_end = 0, 0.6 
shade_x = np.linspace(shade_start, shade_end)
shade_y = func(shade_x)
# 路径点
shade_router = [(shade_start, 0), *zip(shade_x, shade_y), (shade_end, 0)]
# 多边形域绘制积分域
poly = Polygon(xy=shade_router,facecolor='lightsteelblue', edgecolor='cornflowerblue', linewidth=1.2)
# 添加区域
ax.add_patch(poly)
# 区域添加标注
shade_y_min, shade_y_max = shade_y.min(), shade_y.max()
ax.text(0.5 * (shade_start + shade_end), 0.5 * (shade_y_min + shade_y_max), r"$\int_a^b f(x)\mathrm{d}x$", horizontalalignment='center', fontsize=13, color='midnightblue')# 取消顶部、右侧轴脊
# 等效代码:ax.spines[['top', 'right']].set_visible(False)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 更改坐标轴
plt.xlim(0, x[-1] + 0.2)
plt.ylim(0, y.max() + 0.2)
fig.text(0.9, 0.05, '$x$')
fig.text(0.1, 0.9, '$y$')# 展示图表
ax.plot(x, y, linewidth=2)
plt.show()

积分

3.3 柱状图

柱状图(Bar Chart):一种通过垂直或水平柱子的高度(或长度)表示数值大小的图表,常用于比较不同类别之间的数据差异或展示分类数据的分布情况。

3.3.1 方法参数

# 垂直柱状图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, align='center', data=None)
# 水平柱状图
matplotlib.pyplot.barh(y, width, height=0.8, left=None, align='center', data=None)

参数说明:(兼容axes)

  • x | y:数据点 数组
  • height|width:柱高/宽 数组
  • width|height:柱宽/高 数组
  • bottom|left:底座 y/x 坐标 数组
  • align:与x坐标对齐方式 默认’center’
    • ‘center’ 居中对齐
    • ‘edge’ 左边缘对齐(右边缘对齐 → 设置负数宽度)
  • edgecolor\ ec:描线颜色
  • linestyle \ ls:描线样式
  • linewidth \ lw:描线宽度

3.3.2 常见柱状图

本小节仅介绍垂直柱状图,可借此类比水平柱状图。

① 普通柱状图

绘制不同颜色普通柱状图的代码如下:

# 导入库
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False    # 正确显示负号# 数据
fruits = np.array([['苹果', '橘子', '香蕉'], [25, 36, 12], [67, 10, 5]])
colors = ['red', 'orange', 'yellow']# 绘制图表
fig, ax = plt.subplots()
fig.set_size_inches(4,5)
ax.bar(x=fruits[0], height=fruits[1].astype(float), width=0.6, color=colors)
plt.show()

柱状图

修改以下代码,为图像添加虚线描边:

ax.bar(x=fruits[0], height=fruits[1].astype(float), width=0.6, color=colors, ls='dotted', lw=2, ec='b')

柱状图

② 复合柱状图

复合柱状图通过控制x依次排布实现。

import matplotlib.pyplot as plt
import numpy as np# 准备数据
species = ('苹果', '橘子', '香蕉')
penguin_means = {'省份A': (18.35, 18.43, 14.98),'省份B': (38.79, 48.83, 47.50),'省份C': (189.95, 195.82, 217.19),'省份D': (126.55, 186.65, 187.23),
}
x = np.arange(len(species))# 定义子图
fig, ax = plt.subplots()
bar_width = 0.2
multiplier = 0
max_value = 0# 添加柱状图
for attribute, measurement in penguin_means.items():offset = width * multiplierrects = ax.bar(x + offset, measurement, bar_width, label=attribute)ax.bar_label(rects, padding=4)multiplier += 1multiplier_max = np.array(measurement).max()# 自动寻找最大值 → set_ylim()max_value = multiplier_max if multiplier_max > max_value else max_value## 将xticks设置为 x + (bar_width / 2) * (len(penguin_means) - 1)
# 无论 penguin_means 增加,或是 width 变更
# 将确保x轴刻度始终居中
ax.set_xticks(x + (bar_width / 2) * (len(penguin_means) - 1), species)# 绘制图像
ax.legend(loc='upper right', ncols=4)
ax.set_ylim(0, max_value + 40)
ax.set_ylabel('年产量(万吨)')
ax.set_xlabel('水果种类')
ax.set_title('20XX年各省水果年产量')
plt.show()

复合柱状图

③ 堆叠柱状图

堆叠柱状图通过控制bottom起点实现。

import matplotlib.pyplot as plt
import numpy as np# 准备数据
species = ('苹果', '橘子', '香蕉')
penguin_means = {'省份A': (18.35, 18.43, 14.98),'省份B': (38.79, 48.83, 47.50),'省份C': (189.95, 195.82, 217.19),'省份D': (126.55, 186.65, 187.23),
}
x = np.arange(len(species))# 定义子图
fig, ax = plt.subplots()
bar_width = 0.4
multiplier = 0
bottom = np.array([0,0,0])
max_value = 0# 添加柱状图
for attribute, measurement in penguin_means.items():offset = bar_width * multiplierrects = ax.bar(x=x, height=measurement, bottom=bottom, width=bar_width, label=attribute)ax.bar_label(rects, padding=4)bottom = bottom + np.array(measurement)max_value = bottom.max()multiplier += 1# 堆叠无需考虑x刻度排布
ax.set_xticks(x, species)# 绘制图像
ax.legend(loc='upper right', ncols=4)
ax.set_ylim(0, max_value + 80)
ax.set_ylabel('年产量(万吨)')
ax.set_xlabel('水果种类')
ax.set_title('20XX年各省水果年产量')
plt.show()

堆叠柱状图

3.4 饼状图

饼状图(Pie Chart):一种圆形统计图表,通过扇形面积的比例展示数据各部分占整体的百分比关系,适用于直观呈现数据的构成或分布。

3.4.1 方法参数

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)

参数说明:(兼容axes)

  • x:饼图绘制数据→扇面面积 浮点型列表
  • explode:各扇形间隔 数值/列表
  • labels:各扇形标签 列表 默认None
  • colors:各扇形颜色 数值/列表 默认None
  • autopct:各扇形百分比显示格式
    • %d%%:整数百分比
    • %0.1f:一位小数
    • %0.1f%% :一位小数百分比
    • %0.2f%% :两位小数百分比
  • pctdistance:百分比绘制位置 相对于半径的比例 默认0.6
  • labeldistance:标签标记绘制位置 相对于半径的比例 默认1.1
  • shadow:是否绘制阴影 默认为 False 无阴影
  • radius:饼图半径 默认 1
  • startangle:饼图起始角度 默认x正半轴
  • counterclock:是否逆时针绘制扇形 默认True-逆时针
  • wedgeprops:扇形属性 默认None 字典(边框线颜色、边框线宽度等)
  • textprops:指定文本标签属性
  • center:饼图中心 默认(0,0)
  • frame:是否绘制边框 默认False
  • rotatelabels:是否旋转文本标签 默认False

返回说明

  • patchesmatplotlib.patches.Wedge实例列表(扇形度数)
  • texts:标签列表
  • autotexts:百分比列表(仅限autopct非None时启用)

3.4.2 常见饼状图

① 普通饼状图

普通饼状图

import matplotlib.pyplot as plt
import numpy as np# 准备数据
data = [75.5, 121.9, 77.6, 67.3, 43.6, 72.9, 61, 11.6, 10, 9.3, 2.7, 0.5]# 展示图表
plt.pie(data)
plt.show()

饼状图

带百分比显示

plt.pie(data, autopct='%.2f%%')

饼状图

plt.pie(data, autopct='%.2f%%', pctdistance=1.2)

饼状图

带标签标注

import matplotlib.pyplot as plt
import numpy as np# 准备数据
breakfest = ['milk', 'bread', 'egg', 'chicken', 'franch fries', 'hamburger', 'sandwich', 'beef', 'oatmeal', 'fruits', 'coffee', 'mutton']
data = [75.5, 121.9, 77.6, 67.3, 43.6, 72.9, 61, 11.6, 10, 9.3, 2.7, 0.5]# 绘制图形
plt.pie(data, autopct='%.2f%%', pctdistance=1.2, labels=breakfest, labeldistance=1.5)
plt.show()

饼状图

标签美化(仅展示)

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))breakfest = ['milk', 'bread', 'egg', 'chicken', 'franch fries', 'hamburger', 'sandwich', 'others']data = [75.5, 121.9, 77.6, 67.3, 43.6, 72.9, 61, 50]wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),bbox=bbox_props, zorder=0, va="center")for i, p in enumerate(wedges):ang = (p.theta2 - p.theta1)/2. + p.theta1y = np.sin(np.deg2rad(ang))x = np.cos(np.deg2rad(ang))horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]connectionstyle = f"angle,angleA=0,angleB={ang}"kw["arrowprops"].update({"connectionstyle": connectionstyle})ax.annotate(breakfest[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),horizontalalignment=horizontalalignment, **kw)ax.set_title("Breakfast")plt.show()

柱状图

扇形分离

import matplotlib.pyplot as plt
import numpy as np# 准备数据
data = [75.5, 121.9, 77.6, 67.3, 43.6, 72.9, 61, 11.6, 10, 9.3, 2.7, 0.5]# 展示图表
explode = [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12]
plt.pie(data, explode=explode)
plt.show()

扇形分离

② 附柱饼状图

试想存在如下饼状图,需要为其中一个扇形附加子柱状图,以进一步了解其划分。

import matplotlib.pyplot as plt
import numpy as np# 创建子图
fig, ax = plt.subplots()## 饼状图
# 数据及变量
labels = ['Approve', 'Disapprove', 'Undecided']
explode = [0.1, 0, 0]
# 子图绘制
ax.pie(overall_ratios, autopct='%1.1f%%', labels=labels, explode=explode)plt.show()

饼状图

首先,第一步需要添加第二个位于饼状图右侧的子图,并修改figure画布大小,使扇形图尽量不产生缩放。

# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))

柱状图

为第二个子图添加柱状图及其数据,使用堆叠柱状图为最优解。

## 附加-柱状图
# 数据及变量
age_ratios = [.33, .54, .07, .06]
age_labels = ['Under 35', '35-49', '50-65', 'Over 65']
bottom = 1
width = .2
# 子图绘制
for j, (height, label) in enumerate(reversed([*zip(age_ratios, age_labels)])):bottom -= heightbc = ax2.bar(0, height, width, bottom=bottom, color='C0', label=label, alpha=0.1 + 0.25 * j)ax2.bar_label(bc, labels=[f"{height:.0%}"], label_type='center')

柱状图

柱状图过宽,且脊轴让两张统计图存在割裂感,故消除割裂感并为柱状图添加标题与图例。

ax2.set_title('Age of approvers')
ax2.legend()
ax2.axis('off')
ax2.set_xlim(- 2.5 * width, 2.5 * width)

柱状图

两张图距离过远,需调整子图间距。

fig.subplots_adjust(wspace=0)

柱状图

为二者添加连接线。

## 使用连接线链接两图
# 获取饼状图坐标信息
theta1, theta2 = wedges[0].theta1, wedges[0].theta2
center, r = wedges[0].center, wedges[0].r
bar_height = sum(age_ratios)
# 绘制顶部引导线
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = r * np.sin(np.pi / 180 * theta2) + center[1]
con = ConnectionPatch(xyA=(-width / 2, bar_height), coordsA=ax2.transData,xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
con.set_linewidth(4)
ax2.add_artist(con)
# 绘制底部引导线
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = r * np.sin(np.pi / 180 * theta1) + center[1]
con = ConnectionPatch(xyA=(-width / 2, 0), coordsA=ax2.transData,xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
ax2.add_artist(con)
con.set_linewidth(4)

柱状图

将扇形图旋转至合适位置。

# 旋转角度  以适应柱状图
angle = -180 * overall_ratios[0]
# 子图绘制
wedges, *_ = ax1.pie(overall_ratios, autopct='%1.1f%%', startangle=angle, labels=labels, explode=explode)

柱状图

至此,附柱饼状图绘制完成。

import matplotlib.pyplot as plt
import numpy as np# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(wspace=0)## 饼状图
# 数据及变量
labels = ['Approve', 'Disapprove', 'Undecided']
explode = [0.1, 0, 0]
# 旋转角度  以适应柱状图
angle = -180 * overall_ratios[0]
# 子图绘制
wedges, *_ = ax1.pie(overall_ratios, autopct='%1.1f%%', startangle=angle, labels=labels, explode=explode)## 附加-柱状图
# 数据及变量
age_ratios = [.33, .54, .07, .06]
age_labels = ['Under 35', '35-49', '50-65', 'Over 65']
bottom = 1
width = .2
# 子图绘制
for j, (height, label) in enumerate(reversed([*zip(age_ratios, age_labels)])):bottom -= heightbc = ax2.bar(0, height, width, bottom=bottom, color='C0', label=label, alpha=0.1 + 0.25 * j)ax2.bar_label(bc, labels=[f"{height:.0%}"], label_type='center')
ax2.set_title('Age of approvers')
ax2.legend()
ax2.axis('off')
ax2.set_xlim(- 2.5 * width, 2.5 * width)## 使用连接线链接两图
# 获取饼状图坐标信息
theta1, theta2 = wedges[0].theta1, wedges[0].theta2
center, r = wedges[0].center, wedges[0].r
bar_height = sum(age_ratios)
# 绘制顶部引导线
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = r * np.sin(np.pi / 180 * theta2) + center[1]
con = ConnectionPatch(xyA=(-width / 2, bar_height), coordsA=ax2.transData, xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
con.set_linewidth(4)
ax2.add_artist(con)# 绘制底部引导线
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = r * np.sin(np.pi / 180 * theta1) + center[1]
con = ConnectionPatch(xyA=(-width / 2, 0), coordsA=ax2.transData, xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
ax2.add_artist(con)
con.set_linewidth(4)# 绘制图像
plt.show()
③ 普通环状图

环状图通过调整matplot.pyplot.bar()函数wedgeprops参数实现,例如 wedgeprops=dict(width=0.5)

import matplotlib.pyplot as plt
import numpy as np# 准备数据
data = [225, 90, 50, 60, 100, 5]# 绘制图像
plt.pie(data, wedgeprops=dict(width=0.5), startangle=-40)
plt.title("环状图")
plt.show()

环状图

④ 复合环状图

复合环状图无法通过matplotlib.pyplot.pie()函数直接实现,但可通过matplotlib.pyplot.bar()函数弯曲柱状图简介实现。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
# 将vals归一化至2π
valsnorm = vals/np.sum(vals)*2*np.pi
# 获取条形边的坐标
valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])ax.bar(x=valsleft[:, 0],width=valsnorm.sum(axis=1), bottom=1-size, height=size,color=outer_colors, edgecolor='w', linewidth=1, align="edge")ax.bar(x=valsleft.flatten(),width=valsnorm.flatten(), bottom=1-2*size, height=size,color=inner_colors, edgecolor='w', linewidth=1, align="edge")ax.set(title="利用极坐标系和柱状图绘制复合环状图")
ax.set_axis_off()
plt.show()

环状图

3.5 直方图

直方图(Histogram):一种通过条形(或“箱子”)高度表示数据分布情况的统计图表,用于展示连续型或离散型数值变量的频率分布。

每个条形代表一个数据区间(分箱),高度对应该区间内数据点的数量或比例。

3.5.1 方法参数

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)

参数说明:(兼容axes)

  • x:数据来源 一维列表
  • bins:直方图箱数 默认10
  • range:值域范围 二元组/列表 默认None (最小值+最大值)
  • density:是否将直方图归一化 默认False
  • weights:每个数据点权重 默认None
  • cumulative:是否绘制累加分布图 布尔值 默认False(不断累加 → 阶梯状直方图)
  • bottom:起始高度 默认None
  • histtype:直方图类型 可取值’bar’ / ‘barstacked’ / ‘step’ / ‘stepfilled’ 默认’bar’
  • align:箱子对齐方式 可取值’left’ / ‘mid’ / ‘right’ 默认’mid’
  • orientation:箱子方向 可选 可取值’vertical’ / ‘horizontal’ 默认’vertical’
  • rwidth:直方图柱宽 浮点型数值 默认None
  • log:是否在y轴上使用对数刻度 默认False
  • color:直方图颜色
  • label:直方图标签 字符串
  • stacked:是否堆叠不同直方图 布尔值 默认False
  • edgecolor:直方图边缘颜色

3.5.2 常见直方图

① 普通直方图

本小节所有样例遵从以下基础代码(若略有不同请调整数据生成 size 参数):

import matplotlib.pyplot as plt
import numpy as np# 准备数据
np.random.seed(20)mu_x = 200
sigma_x = 25
x = np.random.normal(mu_x, sigma_x, size=2000)mu_w = 200
sigma_w = 10
w = np.random.normal(mu_w, sigma_w, size=2000)mu_r = 120
sigma_r = 60
r = np.random.normal(mu_r, sigma_r, size=2000)# 绘制图表
fig, ax = plt.subplots()
ax.hist(x, histtype="[type]", bins=50)
plt.show()

这里我们展示不同类型的直方图:

bar类型

传统的条形直方图:该类型允许直方柱存在间隙,需配合调整直方图宽度属性rwidth r w i d t h < 1 rwidth<1 rwidth<1

ax.hist(x, histtype="bar", bins=50, rwidth=0.8)

直方图

barstacked类型

堆叠条形直方图:该类型允许直方柱存在间隙,需配合调整直方图宽度属性rwidth r w i d t h < 1 rwidth<1 rwidth<1

ax.hist(x, histtype="barstacked", bins=50, rwidth=0.8)

直方图

两种类型区别何在?

普通直方图stacked参数默认值False,所以不可能得到堆叠的结果:

axes[1].hist((x, w), histtype="bar", bins=25, alpha=0.8, density=True)

直方图区别

所以:barstacked类型 = 激活 stacked 参数的bar类型的直方图:

axes[0].hist((x, w), histtype="barstacked", bins=25, alpha=0.8, density=True)
axes[1].hist((x, w), histtype="bar", bins=25, alpha=0.8, density=True, stacked=True)

直方图区别

step类型

未填充阶梯直方图:该类型对直方图进行描边处理;不允许直方柱存在间隙,本例rwdith属性失效。

ax.hist(x, histtype="step", bins=50, rwidth=0.5)

直方图

stepfilled类型

阶梯直方图:该类型对直方图进行描边处理;不允许直方柱存在间隙,本例rwdith属性失效。

直方图

② 复合直方图

上下对比直方图

上下对比直方图:需要将每个数据点的weights设为-1,即通过weights=-np.ones_like(w)实现。

ax.hist(x, bins=50, label="Dataset x")
ax.hist(w, weights=-np.ones_like(w), bins=50, label="Dataset w")
ax.axhline(0, color="k")
ax.legend()

直方图

透明复合直方图

透明复合直方图:主要通过 不同透明度与不同颜色 进行区分,如下所示:

直方图

3.6 热力图

热力图(Heatmap):一种通过颜色深浅或色阶变化 来展示二维数据矩阵中数值大小或密度的可视化工具,常用于揭示数据分布、模式或集中趋势。【矩阵 → 热图】

3.6.1 颜色条

官网链接

※ 方法参数
matplotlib.pyplot.colorbar(mappable, pad, location, orientation='vertical', fraction=0.15, shrink=1.0, aspect=20.0, ticks=None, drawedges=False, boundaries=None, values=None, anchor=(0.5, 0.0), panchor=(float, float), extend, extendrect=True, label, extendfrac, spacing, format)

参数说明:

  • mappable:颜色条描述内容 matplotlib.cm.ScalarMappable 可选值 AxesImage、ContourSet等
  • pad:颜色条与图间距
  • location:位置 可选’left’/‘right’/‘bottom’/‘top’
  • orientation:水平/垂直 可选 ‘horizontal’/‘vertical’ 默认’vertical’
  • shrink:颜色条长度 可选0~1
  • aspect:长宽比例 默认20.0
  • ticks:显示刻度数值 列表 默认None
  • drawedges:布尔值 是否绘制颜色边界线
  • extend:拓展端尖角 可选’max’/‘min’/‘both’
  • extendrect:拓展端 布尔值 可选 True-正方形、False-三角形
  • label:标签
  • format:格式化字符串 默认None(’%.2f’ 保留两位小数)

亦可通过matplotlib.figure.Figure对象调用该方法:

matplotlib.figure.Figure.colorbar(mappable, pad, location, orientation='vertical', fraction=0.15, shrink=1.0, aspect=20.0, ticks=None, drawedges=False, boundaries=None, values=None, anchor=(0.5, 0.0), panchor=(float, float), extend, extendrect=True, label, extendfrac, spacing, format)

取色操作

旧操作方法 (将在3.11版本移除):

summer_cmap = cmp.get_cmap(name='[cmap_name]')

颜色条弃用

新操作方法:

# 通过名称获取
summer_cmap = matplotlib.colormaps['[cmap_name]']
# 其他两种方法
matplotlib.colormaps.get_cmap()
pyplot.get_cmap()

绘图可通过颜色条选取预存颜色映射,以柱状图为例:

倘若未对源数据进行归一化操作,则映射效果不佳:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = ['A', 'B', 'C' ,'D' ,'E', 'F' ,'G', 'H']
y = [3.5, 5.8, 3, 4, 5, 4.6, 7.8, 12]# 颜色条
summer_cmap = matplotlib.colormaps['cool']## 根据数值映射颜色
colors = summer_cmap(y)# 展示图像
plt.barh(x, y, color=colors)
plt.title('Not normalized')
plt.show()

未归一化

对源数据进行归一化操作,映射效果更佳:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import MinMaxScaler# 准备数据
x = ['A', 'B', 'C' ,'D' ,'E', 'F' ,'G', 'H']
y = [3.5, 5.8, 3, 4, 5, 4.6, 7.8, 12]# 颜色条
summer_cmap = matplotlib.colormaps['cool']## 根据数值映射颜色
# 归一化使映射效果更佳
scaler = MinMaxScaler(feature_range=(0, 1))
y_fitted = scaler.fit_transform(np.array(y).reshape(-1,1))
colors = summer_cmap(y_fitted)# 展示图像
plt.barh(x, y, color=colors)
plt.title('Normalized')
plt.show()

归一化后

① 感知一致的顺序颜色条

颜色条

② 顺序颜色条

颜色条

颜色条

③ 发散颜色条

颜色条

④ 循环颜色条

颜色条

⑤ 定性颜色条

颜色条

⑥ 杂项颜色条

颜色条

※ 反转颜色调

plot_color_gradients("Original and reversed ", ['viridis', 'viridis_r'])

颜色条

3.6.2 方法参数

① 核心方法

热力图绘制可将矩阵视作图片,利用matplotlib.pyplot.imshow()展示,但本文不介绍这种方式。

matplotlib.pyplot.imshow()

本小节将介绍利用matplotlib.axes.Axes.pcolormesh.pcolormesh()绘制热力图:

axes.pcolormesh([X, Y], C, /, **kwargs)

参数说明

  • C:网格数据

    • ( M , N ) (M, N) (M,N) M × N M \times N M×N 网格数据(M行 N列)
    • ( M , N , 3 ) (M, N, 3) (M,N,3):RGB值 网格数据(0-1 浮点型 / 0-255 整型)
    • ( M , N , 4 ) (M, N, 4) (M,N,4):RGBA值 网格数据(0-1 浮点型 / 0-255 整型)
  • [X, Y]:网格数据坐标 → 所有坐标组成的二元组 → 用于定位网格点

    # 列X 行Y
    (X[i+1, j], Y[i+1, j])       (X[i+1, j+1], Y[i+1, j+1])●╶───╴●│     │●╶───╴●(X[i, j], Y[i, j])       (X[i, j+1], Y[i, j+1])
    
  • cmap:颜色条

  • norm:映射颜色前标准化 字符串

  • vmin, vmax:颜色映射所覆盖数据范围 浮点型

  • colorizer:颜色映射到数据 默认None → 根据norm与cmap创建Colorizer对象

  • edgecolors:内边框颜色(仅限实线)

  • linewidth:内边框宽度(仅限实线)

  • alpha:透明度 浮点型数值0~1 默认None

  • snap:是否将网格捕捉到像素边界 布尔值 默认False

返回介绍

  • matplotlib.collections.QuadMesh:可传入matplotlib.pyplot.colorbar()视作mappable参数。
② 辅助方法

坐标向量 → 坐标矩阵元组(不变换不影响绘图结果)

numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')

参数说明

  • xi (x1, x2,…, xn):表示网格坐标的一维数组(numpy.ndarray)
  • indexing:输出 可选字符串 ‘xy’/‘ij’ - 笛卡尔坐标xy / 矩阵索引ij
  • copy:是否拷贝 布尔值 默认True

3.6.3 举例说明

① 普通热力图

普通热力图

import matplotlib.pyplot as plt
import numpy as npfrom matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator# 准备数据
np.random.seed(20)
Z = np.random.rand(6, 10)
x = np.arange(0, 11, 1)
y = np.arange(0, 7, 1)## 绘制图像
# 无边框
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(18,4))
color_mesh_1 = axes[0].pcolormesh(x, y, Z)
plt.colorbar(color_mesh_1, ax=axes[0])
# 边框
color_mesh_2 = axes[1].pcolormesh(x, y, Z, edgecolor='white', linewidth='3')
plt.colorbar(color_mesh_2, ax=axes[1])
plt.show()

普通热力图

传入matplotlib.axes.Axes对象列表 实现颜色条共享:

① 传入列表绘图(确保子图Z值范围相同):此时需要增大 aspect 参数调整长宽比

import matplotlib.pyplot as plt
import numpy as npfrom matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator# 准备数据
np.random.seed(20)
Z = np.random.rand(6, 10)
x = np.arange(0, 11, 1)
y = np.arange(0, 7, 1)## 绘制图像
# 无边框
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(18,7))
color_mesh_1 = axes[0].pcolormesh(x, y, Z)
# 边框
color_mesh_2 = axes[1].pcolormesh(x, y, Z, edgecolor='white', linewidth='3')
# 多图时 aspect参数扩大长宽比
plt.colorbar(color_mesh_1, ax=axes, orientation='horizontal', aspect=40)
# fig.colorbar(color_mesh_1, ax=axes, orientation='horizontal', aspect=40)  # 等价写法
plt.show()

共享颜色条

② 未传入绘图

plt.colorbar(color_mesh_1, ax=axes[0], orientation='horizontal')
# fig.colorbar(color_mesh_1, ax=axes[0], orientation='horizontal')  # 等价写法

单颜色条

② 倾斜热力图
import matplotlib.pyplot as plt
import numpy as np## 准备数据
# 若不通过X,Y计算Z值,不考虑start值,按顺序排列即可
# 但会影响坐标轴显示值
x = np.arange(0, 10, 1)
y = np.arange(0, 6, 1)
# ※ 取消 np.meshgrid() 对结果无影响
X, Y = np.meshgrid(x, y)
# 倘若Z计算方式与X,Y相关,则必须在做变换前计算Z值
Z = np.random.rand(6, 10)
Z = np.arange(60).reshape(6, 10)# 斜拉坐标系(空间仿射变换)
X = X + 0.2 * Y
Y = Y + 0.3 * X# 绘制图像
fig, ax = plt.subplots()
mesh = ax.pcolormesh(X, Y, Z)
fig.colorbar(mesh, ax=ax)
# fig.colorbar(mesh, ax=ax)  # 等价写法
plt.show()

仿射热力图

从结果上可以看出,Matplotlib通过坐标元组,寻找对应坐标Z值。

x = np.arange(0, 10, 1)
print(x)
y = np.arange(0, 6, 1)
print(y)
X, Y = np.meshgrid(x, y)
print((X, Y))
Z = np.arange(60).reshape(6, 10)
print(Z)

热力图对应关系

3.7 箱型图

箱型图(箱线图/盒须图 Box Plot):一种基于数据分位数的统计图表,通过五数概括法(最小值、第一四分位数Q1、中位数Q2、第三四分位数Q3、最大值)和异常值,直观展示数据分布特征。

其核心是揭示数据的集中趋势、离散程度及偏态,尤其适合多组数据对比。

     Q1-1.5IQR   Q1   median  Q3   Q3+1.5IQR|-----:-----|o      |--------|     :     |--------|    o  o|-----:-----|
flier             <----------->            fliersIQR

箱型图

3.7.1 方法参数

matplotlib.pyplot.boxplot(x, *, notch=None, sym=None, vert=None, orientation='vertical', whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, tick_labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, capwidths=None, label=None, data=None)

参数说明:(兼容axes)

  • x:输入数据 二维数组-为x中每一列绘制箱线图 / 一维数组列表-则为x中的每个数组绘制箱线图
  • notch:箱图类型 布尔值 True-凹痕箱形图 / False-矩形箱形图
    • 凹痕 - 中位数周围置信区间
  • sym:箱图异常值点绘制 字符串 空字符串-隐藏
  • orientation:箱图方向 字符串 ‘vertical’/ ‘horizontal’ 默认 ‘vertical’
  • whis:Q1 Q3绘制位置 浮点型数值 / 元组(浮点型数值, 浮点型数值) 默认1.5
  • positions:箱图位置
  • widths:箱图宽度

3.7.2 举例说明

简单绘制箱图样例:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号np.random.seed(20)
fruit_weights = [np.random.normal(130, 10, size=100),np.random.normal(125, 20, size=100),np.random.normal(120, 30, size=100),
]
labels = ['桃子', '橙子', '番茄']
colors = ['peachpuff', 'orange', 'tomato']fig, ax = plt.subplots()
ax.set_ylabel('水果重量(g)')bplot = ax.boxplot(fruit_weights,patch_artist=True,  # fill with colortick_labels=labels)  # will be used to label x-ticksfor patch, color in zip(bplot['boxes'], colors):patch.set_facecolor(color)plt.show()

箱型图

3.7 提琴图

提琴图(Violin Plot):一种结合箱型图与核密度估计的可视化图表,通过对称的“提琴”形状展示数据的分布密度及整体分布特征,尤其适合揭示数据的多峰分布或复杂形态。

3.7.1 方法参数

matplotlib.pyplot.violinplot(dataset, positions=None, *, vert=None, orientation='vertical', widths=0.5, showmeans=False, showextrema=True, showmedians=False, quantiles=None, points=100, bw_method=None, side='both', data=None)

参数说明:(兼容axes)

  • dataset:输入数据
  • positions:提琴图位置
  • orientation:提琴图方向 字符串 ‘vertical’/ ‘horizontal’ 默认 ‘vertical’
  • widths:提琴图宽度 浮点型数值 / 浮点型数值列表 默认0.5
  • showmeans:是否添加平均值线 布尔值 默认False
  • showextrema:是否显示极值线 布尔值 默认True
  • showmedians:是否显示中位线 布尔值 默认False
  • quantiles:用间隔为[0,1]的浮点数列表表示呈现分位数 默认None(不表示)
  • points:计算每个高斯核密度估计的点数 整型 默认100
  • bw_method:用于计算估计器带宽的方法 ‘scott’/‘silverman’ 默认’scott’
  • side:提琴图绘制面 ‘both’-位置值两侧/‘low’位置值下侧’high’-位置值上侧 默认’both’

3.7.2 举例说明

简单绘制箱图样例:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np# 添加字体路径到配置中
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 或者 'STSong' 等其他中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号np.random.seed(20)
data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(4, 4), sharey=True)ax.set_title('提琴图')
ax.set_ylabel('观测值')
ax.violinplot(data)plt.subplots_adjust(bottom=0.15, wspace=0.05)
plt.show()

提琴图

相关文章:

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图&#xff08;统计图表&#xff09; 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…...

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示&#xff0c;但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图&#xff0c;这是为什么&#xff1f;我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新&#xff0c;单当视图中不存在…...

.Net 6 上传文件接口 文件大小报错整体配置

/// <summary>/// 上传文件/// </summary>/// <param name"file"></param>/// <returns></returns>[HttpPost("UploadifyFile")][RequestSizeLimit(2000 * 1024 * 1024)] // 设置最大请求体大小为 100MBpublic async …...

Git基础之工作原理

基础概念 git本地有三个工作区域&#xff0c;工作目录 Working Directory&#xff0c;暂存区Stage/Index和资源区Repository/Git Directory&#xff0c;如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace&#xff1a;工作区&#xff0c;就…...

小程序 wxml 语法 —— 41列表渲染 - 进阶用法

这一节讲解列表渲染的两个进阶用法&#xff1a; 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用 wx:for-item 和 wx:for-item&#xff1a; 使用 wx:for-item 可以指定数组当前元素的变量名使用 wx:for-index 可以指定数组当前下标的变量名 将 wx:for 用在 标签上&…...

ElasticSearch 入门教程

ElasticSearch 入门教程 ElasticSearch 是一个分布式、可扩展的搜索和分析引擎&#xff0c;基于 Apache Lucene 构建&#xff0c;支持全文检索、结构化查询和聚合分析。本教程将带你深入了解 ElasticSearch 的核心概念、安装配置、常见操作&#xff0c;并提供示例代码&#xf…...

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…...

分布式网络

分布式网络&#xff08;Distributed Network&#xff09;指的是一种计算机网络架构&#xff0c;其中计算资源&#xff08;计算、存储、数据处理等&#xff09;分布在多个物理或逻辑上的节点上&#xff0c;而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...

忘记dedecms后台超级管理员账号和密码的解决方案

解决方案&#xff1a; 方案一、数据库修改&#xff1a; 1、前提是您能登录到数据库后台&#xff0c;登录MySQL数据库管理工具&#xff08;如phpMyAdmin&#xff09; 2、打开数据库中的 dede_admin 表&#xff0c;找到管理员记录&#xff0c;将 pwd 字段的值改成 f297a57a5a7…...

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …...

MAC电脑常用操作

环境&#xff1a;M3芯片 &#xff0c;macOS15.2 &#x1f680; 快捷键 &#x1f5a5;️ 窗口管理 ✅ 退出/进入全屏模式 • 浏览器等应用&#xff1a;⌘ Command Ctrl F ✅ 最小化当前窗口 • ⌘ Command M • &#x1f4a1; 隐藏窗口但保留应用在后台运行 ✅ 关闭当前标…...

【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式

网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议&#xff1a; HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站&#xff0c;就是通过HTTP协议来…...

Springboot redis bitMap实现用户签到以及统计,保姆级教程

项目架构&#xff0c;这是作为demo展示使用&#xff1a; Redis config&#xff1a; package com.zy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…...

【C++】:STL详解 —— 红黑树封装map和set

目录 红黑树的源代码 正向迭代器的代码 反向迭代器的代码 set的模拟实现 map的模拟实现 红黑树的源代码 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…...

FPGA设计时序约束用法大全保姆级说明

目录 一、序言 二、时序约束概览 2.1 约束五大类 2.2 约束功能简述 2.3 跨时钟域约束 三、时序约束规范 3.1 时序约束顺序 3.2 约束的优先级 四、约束示例 4.1 设计代码 4.2 时序结果 4.2.1 create_clock 4.2.2 create_generated_clock 4.2.3 Rename_Auto-Derive…...

【前缀和与差分 C/C++】洛谷 P8218 求区间和

2025 - 03 - 09 - 第 72 篇 Author: 郑龙浩 / 仟濹 【前缀和与差分 C/C】 文章目录 洛谷 P8218 求区间和题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示思路代码 洛谷 P8218 求区间和 题目描述 给定 n n n 个正整数组成的数列 a 1 , a 2 , ⋯ , a n a_…...

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

Pytorch 第九回:卷积神经网络——ResNet模型

Pytorch 第九回&#xff1a;卷积神经网络——ResNet模型 本次开启深度学习第九回&#xff0c;基于Pytorch的ResNet卷积神经网络模型。这是分享的第四个卷积神经网络模型。该模型是基于解决因网络加深而出现的梯度消失和网络退化而进行设计的。接下来给大家分享具体思路。 本次…...

2025-3-9 一周总结

目前来看本学期上半程汇编语言,编译原理,数字电路和离散数学是相对重点的课程. 在汇编语言和编译原理这块,个人感觉黑书内知识点更多,细节更到位,体系更完整,可以在老师讲解之前进行预习 应当及时复习每天的内容.第一是看书,然后听课,在一天结束后保证自己的知识梳理完整,没有…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...