【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官网样例
1.2 安装
通过 pip
命令安装 Matplotlib
库
pip install matplotlib
1.3 导入
导入Matplotlib
与Numpy
库
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]))
而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))
这样就可以得到与上面同样的结果了。
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()
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_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)
import matplotlib.pyplot as pltfig, ax = plt.subplots()
print(type(ax))
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轴下限 默认Nonetop
|right
:用于设置x|y轴上限 默认Noneauto
:自动计算范围 布尔值 默认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
:标题旋转角度 角度值/角度字符串 默认Nonefontfamily
\font
\fontname
:字体名称fontstyle
orstyle
:字体样式 字符串(‘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相同 默认Nonerotation
:刻度标签旋转角度 角度值/角度字符串 默认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
:图例列数 数值 默认1fontsize
:图例标签字体大小 数值/字符串(‘[num]’/‘xx-small’/‘x-small’/‘small’/‘medium’/‘large’/‘x-large’/‘xx-large’)labelcolor
:图例标签文本颜色 字符串/字符串列表markerscale
:图例缩放 浮点型数值 默认1.0markerfirst
:图例标签左右侧 True-标记位于标签左侧 / False-标记位于标签右侧 默认Truereverse
:图例展示顺序反转 True-顺序相反 / False-顺序相同 默认Falseframeon
:图例是否在贴片上绘制 True-贴片 / False-无 默认Trueshadow
:图例阴影 True-阴影 / False-无 默认Falseframealpha
:图例透明度 浮点型数值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
orstyle
:字体样式 字符串(‘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 | 说明 |
---|---|---|
width | The width of the arrow in points | 箭头的宽度(以点为单位) |
headwidth | The width of the base of the arrow head in points | 箭头头部的宽度(以点为单位) |
headlength | The length of the arrow head in points | 箭头头部的长度(以点为单位) |
shrink | Fraction of total length to shrink from both ends | 从两端收缩的总长度的比例 |
connectionstyle | Arc of arrow | 箭头弧度(见“弧度说明”) |
edgecolor | Edge line color | 边缘线条颜色 |
linestyle | Edge line style | 边缘线条样式 |
linewidth | Edge line width | 边缘线条宽度 |
color | Color of the arrow | 整体颜色(覆写edgecolor) |
facecolor | Facecolor 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 |
Simple | simple | head_length=0.5, head_width=0.5, tail_width=0.2 |
Fancy | fancy | head_length=0.4, head_width=0.4, tail_width=0.4 |
Wedge | wedge | tail_width=0.3, shrink_factor=0.5 |
弧度说明:
类型 / Class | 取值 / Value | 描述 / Description |
---|---|---|
Arc3 | arc3 | rad=0.0 |
Angle3 | angle3 | angleA=90, angleB=0 |
Angle | angle | angleA=90, angleB=0, rad=0.0 |
Arc | arc | angleA=0, angleB=0, armA=None, armB=None, rad=0.0 |
Bar | bar | armA=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颜色条 默认 Nonealpha
:透明度 默认不透明 0~1 之间
3.1.2 标记点
该属性适用于 折线图 和 散点图,其中常见的点类型如下:
marker | description | 描述 |
---|---|---|
. | point | 点 |
, | pixel | 像素 |
o | circle | 圈 |
+ | plus | 加号 |
x | x | 叉号 |
* | star | 星星 |
D | diamond | 菱形 / 钻石 |
d | thin_diamond | 窄菱 / 细钻 |
一些常见 但不常用的类型如下:
marker | description | 描述 |
---|---|---|
8 | octagon | 八边形 |
s | square | 正方形 |
p | pentagon | 五边形 |
h | hexagon1 | 六边形 |
H | hexagon2 | 六边形 |
一些较为少见的类型如下:
marker | description | 描述 |
---|---|---|
v | triangle_down | 倒三角形 |
^ | triangle_up | 正三角形 |
< | triangle_left | 左三角形 |
> | triangle_right | 右三角形 |
1 | tri_down | 倒三叉形 |
2 | tri_up | 正三叉形 |
3 | tri_left | 左三叉形 |
4 | tri_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 绘图线
marker | description | 描述 |
---|---|---|
- | 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 默认1color
\c
:全局颜色 覆盖facecolor和edgecoloredgecolor
\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
:各扇形标签 列表 默认Nonecolors
:各扇形颜色 数值/列表 默认Noneautopct
:各扇形百分比显示格式%d%%
:整数百分比%0.1f
:一位小数%0.1f%%
:一位小数百分比%0.2f%%
:两位小数百分比
pctdistance
:百分比绘制位置 相对于半径的比例 默认0.6labeldistance
:标签标记绘制位置 相对于半径的比例 默认1.1shadow
:是否绘制阴影 默认为 False 无阴影radius
:饼图半径 默认 1startangle
:饼图起始角度 默认x正半轴counterclock
:是否逆时针绘制扇形 默认True-逆时针wedgeprops
:扇形属性 默认None 字典(边框线颜色、边框线宽度等)textprops
:指定文本标签属性center
:饼图中心 默认(0,0)frame
:是否绘制边框 默认Falserotatelabels
:是否旋转文本标签 默认False
返回说明:
patches
:matplotlib.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
:直方图箱数 默认10range
:值域范围 二元组/列表 默认None (最小值+最大值)density
:是否将直方图归一化 默认Falseweights
:每个数据点权重 默认Nonecumulative
:是否绘制累加分布图 布尔值 默认False(不断累加 → 阶梯状直方图)bottom
:起始高度 默认Nonehisttype
:直方图类型 可取值’bar’ / ‘barstacked’ / ‘step’ / ‘stepfilled’ 默认’bar’align
:箱子对齐方式 可取值’left’ / ‘mid’ / ‘right’ 默认’mid’orientation
:箱子方向 可选 可取值’vertical’ / ‘horizontal’ 默认’vertical’rwidth
:直方图柱宽 浮点型数值 默认Nonelog
:是否在y轴上使用对数刻度 默认Falsecolor
:直方图颜色label
:直方图标签 字符串stacked
:是否堆叠不同直方图 布尔值 默认Falseedgecolor
:直方图边缘颜色
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~1aspect
:长宽比例 默认20.0ticks
:显示刻度数值 列表 默认Nonedrawedges
:布尔值 是否绘制颜色边界线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 / 矩阵索引ijcopy
:是否拷贝 布尔值 默认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.5positions
:箱图位置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.5showmeans
:是否添加平均值线 布尔值 默认Falseshowextrema
:是否显示极值线 布尔值 默认Trueshowmedians
:是否显示中位线 布尔值 默认Falsequantiles
:用间隔为[0,1]的浮点数列表表示呈现分位数 默认None(不表示)points
:计算每个高斯核密度估计的点数 整型 默认100bw_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()