【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()

提琴图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30654.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记:Python网络编程初探之基本概念(一)

一、网络目的 让你设备上的数据和其他设备上进行共享&#xff0c;使用网络能够把多方链接在一起&#xff0c;然后可以进行数据传递。 网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…

Spark-TTS:基于大模型的文本语音合成工具

GitHub&#xff1a;https://github.com/SparkAudio/Spark-TTS Spark-TTS是一个先进的文本到语音系统&#xff0c;它利用大型语言模型&#xff08;LLM&#xff09;的强大功能进行高度准确和自然的语音合成&#xff1b;旨在高效、灵活、强大地用于研究和生产用途。 一、介绍 Sp…

【RAG】检索后排序 提高回答精度

问题: RAG中&#xff0c;有时&#xff0c;最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…

线程安全问题(面试重难点)

这里只是简单介绍以下线程安全,具体情况要结合代码进行判断 线程 是随机调度,及 抢占式执行 ,具有随机性,就可能会让我们的结果出现不同 当我们得到的结果并不是我们想要的时候(不符合需求),就会被认定为BUG,此时就是出现了线程安全问题 那么存在线程不安全的代码就被认为是…

数据结构第七节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

从传统到智能:Node-red工控机助力农业大棚高效监控

智慧农业逐渐成为现代农业发展的主流方向。在这一背景下&#xff0c;农业用工控机&#xff08;简称“农控机”&#xff09;作为智慧农业的核心设备之一&#xff0c;正在为农业大棚的智能化管理提供强有力的支持。本文将详细探讨农控机在智慧农业大棚监控中的应用&#xff0c;并…

硬件学习笔记--48 磁保持继电器相关基础知识介绍

目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用&#xff0c;实现触点的切换。其特点在于线圈断电后&#xff0c;触点状态仍能保持&#…

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09; 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service 四层负载均衡Service 在k8s中&#xff0c;访问pod可以通过ip端口的方式&#xff0c;但是pod是由生命 周期的&#xff0c;pod在重启的时候ip地址往往会发生变化&#xff0c;访问pod就需要新的ip地址&#xff0c;这样就会很麻烦&#xff0c;每次pod地址改变就…

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…

LLM 模型 Prompt 工程

目录 1、Prompt 基础概念 2、Prompt 主要构成 3、Prompt 相关技术 3.1、思维链 3.2、自洽性 3.3、思维树 1、Prompt 基础概念 Prompt 工程是通过设计和优化自然语言提示&#xff08;Prompt&#xff09;&#xff0c;引导LLM生成符合特定任务需求的输出的技术。其核心目标是…

Springboot基础篇(4):自动配置原理

1 自动配置原理剖析 1.1 加载配置类的源码追溯 自动配置的触发入口&#xff1a; SpringBootApplication 组合注解是自动配置的起点&#xff0c;其核心包含 EnableAutoConfiguration&#xff0c;该注解使用AutoConfigurationImportSelector 实现配置类的动态加载。 启动类的注…

【大模型系列】开发工具Cursor使用配置及备忘

开发工具cursor使用过程的配置备忘 最近一段时间大模型开发工具cursor是比较火爆的&#xff0c;其提供的一个比较有价值的特性就是其ai辅助功能&#xff0c;其内部集成了若干大模型 提供免费使用期&#xff1b; 做大模型开发这个话题应该是绕不过的&#xff0c;就像开发java使…

vtkAppendPolyData vtkMultiBlockDataGroupFilter 区别 合并数据

Summary: vtkAppendPolyData vtkMultiBlockDataGroupFilter 区别 两个都是合并数据&#xff1b; 用于处理多块数据集的两种不同的过滤器&#xff08;filters&#xff09;&#xff0c;它们在处理和合并多块数据集方面有不同的用途和实现方式。 Part2:区别 它们的主要区别在于…

C++入门——输入输出、缺省参数

C入门——输入输出、缺省参数 一、C标准库——命名空间 std C标准库std是一个命名空间&#xff0c;全称为"standard"&#xff0c;其中包括标准模板库&#xff08;STL&#xff09;&#xff0c;输入输出系统&#xff0c;文件系统库&#xff0c;智能指针与内存管理&am…

定制开发开源AI智能名片S2B2C商城小程序:以“晒”为桥,构建信任,助力社交新零售飞跃

摘要&#xff1a;随着互联网的深入发展和社交媒体的普及&#xff0c;社交新零售逐渐成为商业领域的新热点。在这个充满机遇与挑战的时代&#xff0c;如何快速建立与陌生消费者的信任关系&#xff0c;成为决定商业成功的关键。本文将以定制开发开源AI智能名片S2B2C商城小程序为研…

【Linux】Linux Progress Pulse-进度条

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有问题&#xff0c;还请多多包涵&a…

Zypher Network :基于零知识证明方案为 AI 赋予可信框架

Zypher Network 提出的系列方案正逐步成为破解这一困局的关键&#xff0c;其不仅为 LLM 和 AI Agent 等采用提供了一个可信的框架&#xff0c;也为其在更广泛行业中的应用铺平了道路。 LLM 的 “黑盒特性” 像 ChatGPT、DeepSeek、Grok 等大型语言模型&#xff08;LLM, Large …

从Manus到OpenManus:多智能体协作框架如何重构AI生产力?

文章目录 Manus&#xff1a;封闭生态下的通用AI智能体OpenManus&#xff1a;开源社区的闪速复刻挑战与未来&#xff1a;框架落地的现实边界当前局限性未来演进方向 OpenManus使用指南1. 环境配置2. 参数配置3. 替换搜索引擎4. 运行效果 协作框架开启AI生产力革命 Manus&#xf…