网站开发文章,北京P2P公司网站建设,我的网站百度找不到了,南宁设计网站【Python 2D绘图】Matplotlib绘图#xff08;统计图表#xff09; 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图… 【Python 2D绘图】Matplotlib绘图统计图表 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图① Subplot()绘制子图② Subplots()绘制子图 2.2.3 调整子图边距① 自动调整② 设定间距 2.2.4 调整图像范围2.2.5 画布尺寸 2.3 主题2.3.0 默认主题 default / fast2.3.1 暗黑主题 dark_background2.3.2 灰度主题 grayscale2.3.3 日光主题 Solarize_Light22.3.4 经典主题 classic2.3.5 贝叶斯主题 bmh2.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 / SeabornPlotlyBokehAltairPygalAnvilPyecharts
1.1 简介 本文不涉及配色方案仅介绍Matplotlib使用方法 及 核心函数的重要参数。 官网链接Matplotlib官网
官网样例链接Matplotlib官网样例 1.2 安装
通过 pip 命令安装 Matplotlib 库
pip install matplotlib1.3 导入
导入Matplotlib与Numpy库
import matplotlib.pyplot as plt
import numpy as np1.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, array1fruits_a, array2fruits_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, array1fruits_a, array2fruits_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(xfruits[0], heightfruits[1].astype(float), width0.6, colorcolors)
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(xfruits[0], heightfruits[1], width0.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(locupper right, ncols2)
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, ncols3, sort_colorsFalse)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 LabelX/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(left0.15, right0.15, top0.2, bottom0.2, wspace0.2, hspace0.25)参数说明
left / right / top / bottom子图四向间距wspace / hspace子图间横纵间距
除了subplots_adjust函数Matplotlib还提供GridSpec对象其允许更灵活地指定子图的 位置 与 大小从而实现更复杂的图形布局。
2.2.4 调整图像范围
调用xlim()或 tlim()函数可调整图像范围
# 调整x轴范围
matplotlib.pyplot.xlim(bottom, top, emitTrue, autoTrue)
# 调整y轴范围
matplotlib.pyplot.ylim(left, right, emitTrue, autoTrue)参数说明
bottom | left用于设置x|y轴下限 默认Nonetop | right用于设置x|y轴上限 默认Noneauto自动计算范围 布尔值 默认True
matplotlib.axes._axes.Axes对象对应的方法使用方式类同 方法名前加set_
# 调整x轴范围
axes.set_xlim(bottom, top, emitTrue, autoTrue)
# 调整y轴范围
axes.set_ylim(left, right, emitTrue, autoTrue)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.availableplt.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主题系列
SeanbornMaplotlib的一个抽象层
该系列涵盖以下主题
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(bNone, whichmajor, axisboth)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, colordarkblue)
axes[2].grid(axisy, colorsilver, linestyledashed, linewidth2)# 展示图
plt.show()2.5.2 标题
设置x轴和y轴的标签
matplotlib.pyplot.title(label, fontsizeNone, colorNone, locNone)参数说明
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 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, fontsizeNone, colorNone, locNone)
# 设置y轴标签
matplotlib.pyplot.ylabel(label, fontsizeNone, colorNone, locNone)参数说明
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, labelsNone, rotationNone, minorFalse)locations刻度位置 数值/列表labels刻度标签 列表/字符串 长度与locations相同 默认Nonerotation刻度标签旋转角度 角度值/角度字符串 默认None
matplotlib.axes._axes.Axes对象对应的方法使用方式类同 方法名前加set_
axes.set_xticks(locations, labelsNone, rotationNone, minorFalse)举例将刻度旋转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, colorcolors)
plt.title(20XX全域各省苹果年产量)
plt.xlabel(产地)
plt.ylabel(产量(万吨))
plt.xticks(x, rotation45)
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, transformax.get_yaxis_transform(), clip_onFalse)
ax.plot(0, 1, ^k, transformax.get_xaxis_transform(), clip_onFalse)plt.show()2.5.6 图例
# 3.7以前版本
matplotlib.pyplot.legend(handles, labels, locbest, ncols1, prop, fontsize, labelcolorNone, numpoints1, scatterpoints1, scatteryoffsets[0.375, 0.5, 0.3125], markerscale1.0, markerfirstTrue, reverseFalse)# 3.7以后版本
matplotlib.pyplot.legend(handles, labels, locbest, ncols1, prop, fontsize, labelcolorNone, numpoints1, scatterpoints1, scatteryoffsets[0.375, 0.5, 0.3125], markerscale1.0, markerfirstTrue, reverseFalse, frameonTrue, fancyboxTrue, shadowFalse, framealpha0.8, facecolorinherit, edgecolor0.8, title, title_fontsizeNone, alignmentcenter, borderpad0.4, labelspacing0.5, handlelength2.0, handleheight0.7, handletextpad0.8, borderaxespad0.5, columnspacing2.0, draggableFalse)参数说明
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, fontdictNone, **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)}, fontsize16)
ax.set_title(r\TeX\ is Number $\displaystyle\sum_{n1}^\infty r\frac{-e^{i\pi}}{2^n}$!, fontsize16, colorr)
ax.text(x0, y0, sr\TeX\ is Number $\displaystyle\sum_{n1}^\infty r\frac{-e^{i\pi}}{2^n}$!, fontsize16, colorr)2.5.8 注释
matplotlib.axes._axes.Axes对象的方法
Axes.annotate(text, xy, xytextNone, xycoordsdata, textcoordsNone, arrowpropsNone, annotation_clipNone, **kwargs)参数说明
text注释文本 字符串xy注释坐标xy 元组(浮点型数值, 浮点型数值)xytext注释文本坐标xy 元组(浮点型数值, 浮点型数值) 默认等同xyxycoords坐标xy所在坐标系见“坐标系说明”textcorrds文本坐标系所在坐标系arrowpropsxy与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整体颜色覆写edgecolorfacecolorFacecolor of the arrow箭头填充颜色
华丽箭头matplotlib.patches.ArrowStyleA-指向文本 / B-指向对象 / AB-双向
类型 / Class取值 / Value描述 / DescriptionCurve-NoneCurveA-head_length0.4, head_width0.2, widthA1.0, widthB1.0, lengthA0.2, lengthB0.2, angleA0, angleB0, scaleANone, scaleBNoneCurveB-head_length0.4, head_width0.2, widthA1.0, widthB1.0, lengthA0.2, lengthB0.2, angleA0, angleB0, scaleANone, scaleBNoneCurveAB-head_length0.4, head_width0.2, widthA1.0, widthB1.0, lengthA0.2, lengthB0.2, angleA0, angleB0, scaleANone, scaleBNoneCurveFilledA-CurveFilledB-CurveFilledAB-BracketA]-widthA1.0, lengthA0.2, angleA0BracketB-[widthB1.0, lengthB0.2, angleB0BracketAB]-[widthA1.0, lengthA0.2, angleA0, widthB1.0, lengthB0.2, angleB0BarAB-BracketCurve]-widthA1.0, lengthA0.2, angleANoneCurveBracket-[widthB1.0, lengthB0.2, angleBNoneSimplesimplehead_length0.5, head_width0.5, tail_width0.2Fancyfancyhead_length0.4, head_width0.4, tail_width0.4Wedgewedgetail_width0.3, shrink_factor0.5
弧度说明
类型 / Class取值 / Value描述 / DescriptionArc3arc3rad0.0Angle3angle3angleA90, angleB0AngleangleangleA90, angleB0, rad0.0ArcarcangleA0, angleB0, armANone, armBNone, rad0.0BarbararmA0.0, armB0.0, fraction0.3, angleNone
基于华丽箭头微调微调属性
arrow matplotlib.patches.ArrowStyle.BarAB(widthA1.5, angleA0, widthB0.5, angleB0)分别对普通箭头和华丽箭头举例说明
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}, colororangered, fontsize12)
# 华丽箭头默认
ax.annotate(Distance, xy(3,4), xytext(8,5), arrowprops{arrowstyle: |-|,edgecolor:brown}, colorchocolate, fontsize12)
# 华丽箭头微调
arrow matplotlib.patches.ArrowStyle.BarAB(widthA1.5, angleA0, widthB0.5, angleB0)
ax.annotate(What can you see?, xy(1,7), xytext(2,7.5), arrowprops{arrowstyle: arrow, color:teal}, colorlightseagreen, fontsize12)plt.show()2.5.9 连线
需导入库
from matplotlib.patches import ConnectionPatchclass matplotlib.patches.ConnectionPatch(xyA, xyB, coordsA, coordsBNone, *, axesANone, axesBNone, arrowstyle-, connectionstylearc3, patchANone, patchBNone, shrinkA0.0, shrinkB0.0, mutation_scale10.0, mutation_aspectNone, clip_onFalse, **kwargs)参数说明
xyA连接线起始点xyB连接线结束点coordsA起始点坐标系 默认为datacoordsB结束点坐标系 默认为dataaxesA起始点所在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, axesAax1, axesBax2, colorr, linewidth3, linestyle--)
fig.add_artist(conn)
plt.show()3. 统计图表
3.1 散点图
散点图Scatter Plot一种数据可视化图表通过平面坐标系中的点数据点展示两个变量之间的关系。
每个点的横纵坐标分别对应一个变量的值点的分布形态可反映变量间的相关性或模式。
3.1.1 方法参数
matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone, alphaNone)参数说明兼容axes
x | y数据点 长度相同的数组s点的尺寸 默认20 单值 / 数组c点的颜色 默认蓝色 颜色值单值 / 数组 简称/全称/RGB/RGBaZ值数组 通过不同颜色表示Z值大小 marker点的样式 默认’o’cmapColormap颜色条 默认 Nonealpha透明度 默认不透明 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, markerD, markerfacecolorred, markersize8)
axes[0].set(xlabelX, ylabelY, titleScatter Chart)
# 创建第二个子图
axes[1].scatter(x, y, marker1, cred, s100)
axes[1].set(xlabelX, ylabelY, titleScatter 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, s65)# 显示图形
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, cc, cmapviridis, s50)# 添加颜色条
plt.colorbar(scatter, labelNumerical 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, ccolor, sscale, labelcolor, alpha0.3, edgecolorsnone)# 显示图例、网格
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, linestyledotted, colorgold, linewidth3)
ax.plot(x, y2, linestyledashed, colorsilver, linewidth1)
ax.set(xlabelX, ylabelY, titleLine 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, linestyledotted, colorgold, linewidth3)
ax.plot(x, y2, linestyledashed, colorsilver, linewidth1)
ax.set(xlabelX, ylabelY, titleLine Chart)
ax.legend(labels)
ax.grid()# 展示图表
plt.show()③ 折线积分域图
表示有积分域的曲线图。
多边形类 Polygon
class matplotlib.patches.Polygon(xy, *, closedTrue, **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(xyshade_router,facecolorlightsteelblue, edgecolorcornflowerblue, linewidth1.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$, horizontalalignmentcenter, fontsize13, colormidnightblue)# 取消顶部、右侧轴脊
# 等效代码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, linewidth2)
plt.show()3.3 柱状图
柱状图Bar Chart一种通过垂直或水平柱子的高度或长度表示数值大小的图表常用于比较不同类别之间的数据差异或展示分类数据的分布情况。
3.3.1 方法参数
# 垂直柱状图
matplotlib.pyplot.bar(x, height, width0.8, bottomNone, aligncenter, dataNone)
# 水平柱状图
matplotlib.pyplot.barh(y, width, height0.8, leftNone, aligncenter, dataNone)参数说明兼容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(xfruits[0], heightfruits[1].astype(float), width0.6, colorcolors)
plt.show()修改以下代码为图像添加虚线描边
ax.bar(xfruits[0], heightfruits[1].astype(float), width0.6, colorcolors, lsdotted, lw2, ecb)② 复合柱状图
复合柱状图通过控制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, labelattribute)ax.bar_label(rects, padding4)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(locupper right, ncols4)
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(xx, heightmeasurement, bottombottom, widthbar_width, labelattribute)ax.bar_label(rects, padding4)bottom bottom np.array(measurement)max_value bottom.max()multiplier 1# 堆叠无需考虑x刻度排布
ax.set_xticks(x, species)# 绘制图像
ax.legend(locupper right, ncols4)
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, explodeNone, labelsNone, colorsNone, autopctNone, pctdistance0.6, shadowFalse, labeldistance1.1, startangle0, radius1, counterclockTrue, wedgepropsNone, textpropsNone, center0, 0, frameFalse, rotatelabelsFalse, *, normalizeNone, dataNone)参数说明兼容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
返回说明
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%%, pctdistance1.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%%, pctdistance1.2, labelsbreakfest, labeldistance1.5)
plt.show()标签美化仅展示
fig, ax plt.subplots(figsize(6, 3), subplot_kwdict(aspectequal))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, wedgepropsdict(width0.5), startangle-40)bbox_props dict(boxstylesquare,pad0.3, fcw, eck, lw0.72)
kw dict(arrowpropsdict(arrowstyle-),bboxbbox_props, zorder0, vacenter)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 fangle,angleA0,angleB{ang}kw[arrowprops].update({connectionstyle: connectionstyle})ax.annotate(breakfest[i], xy(x, y), xytext(1.35*np.sign(x), 1.4*y),horizontalalignmenthorizontalalignment, **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, explodeexplode)
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%%, labelslabels, explodeexplode)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, bottombottom, colorC0, labellabel, alpha0.1 0.25 * j)ax2.bar_label(bc, labels[f{height:.0%}], label_typecenter)柱状图过宽且脊轴让两张统计图存在割裂感故消除割裂感并为柱状图添加标题与图例。
ax2.set_title(Age of approvers)
ax2.legend()
ax2.axis(off)
ax2.set_xlim(- 2.5 * width, 2.5 * width)两张图距离过远需调整子图间距。
fig.subplots_adjust(wspace0)为二者添加连接线。
## 使用连接线链接两图
# 获取饼状图坐标信息
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), coordsAax2.transData,xyB(x, y), coordsBax1.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), coordsAax2.transData,xyB(x, y), coordsBax1.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%%, startangleangle, labelslabels, explodeexplode)至此附柱饼状图绘制完成。
import matplotlib.pyplot as plt
import numpy as np# 创建子图
fig, (ax1, ax2) plt.subplots(1, 2, figsize(10, 5))
fig.subplots_adjust(wspace0)## 饼状图
# 数据及变量
labels [Approve, Disapprove, Undecided]
explode [0.1, 0, 0]
# 旋转角度 以适应柱状图
angle -180 * overall_ratios[0]
# 子图绘制
wedges, *_ ax1.pie(overall_ratios, autopct%1.1f%%, startangleangle, labelslabels, explodeexplode)## 附加-柱状图
# 数据及变量
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, bottombottom, colorC0, labellabel, alpha0.1 0.25 * j)ax2.bar_label(bc, labels[f{height:.0%}], label_typecenter)
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), coordsAax2.transData, xyB(x, y), coordsBax1.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), coordsAax2.transData, xyB(x, y), coordsBax1.transData)
con.set_color([0, 0, 0])
ax2.add_artist(con)
con.set_linewidth(4)# 绘制图像
plt.show()③ 普通环状图
环状图通过调整matplot.pyplot.bar()函数wedgeprops参数实现例如 wedgepropsdict(width0.5)。
import matplotlib.pyplot as plt
import numpy as np# 准备数据
data [225, 90, 50, 60, 100, 5]# 绘制图像
plt.pie(data, wedgepropsdict(width0.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_kwdict(projectionpolar))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(xvalsleft[:, 0],widthvalsnorm.sum(axis1), bottom1-size, heightsize,colorouter_colors, edgecolorw, linewidth1, alignedge)ax.bar(xvalsleft.flatten(),widthvalsnorm.flatten(), bottom1-2*size, heightsize,colorinner_colors, edgecolorw, linewidth1, alignedge)ax.set(title利用极坐标系和柱状图绘制复合环状图)
ax.set_axis_off()
plt.show()3.5 直方图
直方图Histogram一种通过条形或“箱子”高度表示数据分布情况的统计图表用于展示连续型或离散型数值变量的频率分布。
每个条形代表一个数据区间分箱高度对应该区间内数据点的数量或比例。
3.5.1 方法参数
matplotlib.pyplot.hist(x, binsNone, rangeNone, densityFalse, weightsNone, cumulativeFalse, bottomNone, histtypebar, alignmid, orientationvertical, rwidthNone, logFalse, colorNone, labelNone, stackedFalse, **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, size2000)mu_w 200
sigma_w 10
w np.random.normal(mu_w, sigma_w, size2000)mu_r 120
sigma_r 60
r np.random.normal(mu_r, sigma_r, size2000)# 绘制图表
fig, ax plt.subplots()
ax.hist(x, histtype[type], bins50)
plt.show()这里我们展示不同类型的直方图
bar类型
传统的条形直方图该类型允许直方柱存在间隙需配合调整直方图宽度属性rwidth r w i d t h 1 rwidth1 rwidth1
ax.hist(x, histtypebar, bins50, rwidth0.8)barstacked类型
堆叠条形直方图该类型允许直方柱存在间隙需配合调整直方图宽度属性rwidth r w i d t h 1 rwidth1 rwidth1
ax.hist(x, histtypebarstacked, bins50, rwidth0.8)两种类型区别何在 普通直方图stacked参数默认值False所以不可能得到堆叠的结果 axes[1].hist((x, w), histtypebar, bins25, alpha0.8, densityTrue)所以barstacked类型 激活 stacked 参数的bar类型的直方图 axes[0].hist((x, w), histtypebarstacked, bins25, alpha0.8, densityTrue)
axes[1].hist((x, w), histtypebar, bins25, alpha0.8, densityTrue, stackedTrue)step类型
未填充阶梯直方图该类型对直方图进行描边处理不允许直方柱存在间隙本例rwdith属性失效。
ax.hist(x, histtypestep, bins50, rwidth0.5)stepfilled类型
阶梯直方图该类型对直方图进行描边处理不允许直方柱存在间隙本例rwdith属性失效。 ② 复合直方图
上下对比直方图
上下对比直方图需要将每个数据点的weights设为-1即通过weights-np.ones_like(w)实现。
ax.hist(x, bins50, labelDataset x)
ax.hist(w, weights-np.ones_like(w), bins50, labelDataset w)
ax.axhline(0, colork)
ax.legend()透明复合直方图
透明复合直方图主要通过 不同透明度与不同颜色 进行区分如下所示 3.6 热力图
热力图Heatmap一种通过颜色深浅或色阶变化 来展示二维数据矩阵中数值大小或密度的可视化工具常用于揭示数据分布、模式或集中趋势。【矩阵 → 热图】
3.6.1 颜色条
官网链接
※ 方法参数
matplotlib.pyplot.colorbar(mappable, pad, location, orientationvertical, fraction0.15, shrink1.0, aspect20.0, ticksNone, drawedgesFalse, boundariesNone, valuesNone, anchor(0.5, 0.0), panchor(float, float), extend, extendrectTrue, 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, orientationvertical, fraction0.15, shrink1.0, aspect20.0, ticksNone, drawedgesFalse, boundariesNone, valuesNone, anchor(0.5, 0.0), panchor(float, float), extend, extendrectTrue, 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, colorcolors)
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, colorcolors)
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[i1, j], Y[i1, j]) (X[i1, j1], Y[i1, j1])●╶───╴●│ │●╶───╴●(X[i, j], Y[i, j]) (X[i, j1], Y[i, j1])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, copyTrue, sparseFalse, indexingxy)参数说明
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(nrows1, ncols2, figsize(18,4))
color_mesh_1 axes[0].pcolormesh(x, y, Z)
plt.colorbar(color_mesh_1, axaxes[0])
# 边框
color_mesh_2 axes[1].pcolormesh(x, y, Z, edgecolorwhite, linewidth3)
plt.colorbar(color_mesh_2, axaxes[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(nrows1, ncols2, figsize(18,7))
color_mesh_1 axes[0].pcolormesh(x, y, Z)
# 边框
color_mesh_2 axes[1].pcolormesh(x, y, Z, edgecolorwhite, linewidth3)
# 多图时 aspect参数扩大长宽比
plt.colorbar(color_mesh_1, axaxes, orientationhorizontal, aspect40)
# fig.colorbar(color_mesh_1, axaxes, orientationhorizontal, aspect40) # 等价写法
plt.show()② 未传入绘图
plt.colorbar(color_mesh_1, axaxes[0], orientationhorizontal)
# fig.colorbar(color_mesh_1, axaxes[0], orientationhorizontal) # 等价写法② 倾斜热力图
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, axax)
# fig.colorbar(mesh, axax) # 等价写法
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 Q31.5IQR|-----:-----|o |--------| : |--------| o o|-----:-----|
flier ----------- fliersIQR3.7.1 方法参数
matplotlib.pyplot.boxplot(x, *, notchNone, symNone, vertNone, orientationvertical, whisNone, positionsNone, widthsNone, patch_artistNone, bootstrapNone, usermediansNone, conf_intervalsNone, meanlineNone, showmeansNone, showcapsNone, showboxNone, showfliersNone, boxpropsNone, tick_labelsNone, flierpropsNone, medianpropsNone, meanpropsNone, cappropsNone, whiskerpropsNone, manage_ticksTrue, autorangeFalse, zorderNone, capwidthsNone, labelNone, dataNone)参数说明兼容axes
x输入数据 二维数组-为x中每一列绘制箱线图 / 一维数组列表-则为x中的每个数组绘制箱线图notch箱图类型 布尔值 True-凹痕箱形图 / False-矩形箱形图 凹痕 - 中位数周围置信区间 sym箱图异常值点绘制 字符串 空字符串-隐藏orientation箱图方向 字符串 ‘vertical’/ ‘horizontal’ 默认 ‘vertical’whisQ1 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, size100),np.random.normal(125, 20, size100),np.random.normal(120, 30, size100),
]
labels [桃子, 橙子, 番茄]
colors [peachpuff, orange, tomato]fig, ax plt.subplots()
ax.set_ylabel(水果重量(g))bplot ax.boxplot(fruit_weights,patch_artistTrue, # fill with colortick_labelslabels) # 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, positionsNone, *, vertNone, orientationvertical, widths0.5, showmeansFalse, showextremaTrue, showmediansFalse, quantilesNone, points100, bw_methodNone, sideboth, dataNone)参数说明兼容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(nrows1, ncols1, figsize(4, 4), shareyTrue)ax.set_title(提琴图)
ax.set_ylabel(观测值)
ax.violinplot(data)plt.subplots_adjust(bottom0.15, wspace0.05)
plt.show()