Matplotlib
1. matplotlib 简介
1.1 matplotlib 简介
matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter、wxPython、Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
此外,matplotlib 还有一个基于图像处理库(如开放图形库 OpenGL)的 pylab 接口,其设计与 MATLAB 非常类似。SciPy 就是用 matplotlib 进行图形绘制。
python
import matplotlib as mpl # 导入Matplotlib,用于设置全局样式、参数
import matplotlib.pyplot as plt # 导入绘图接口,用于画图
# 指定具体中文字体
mpl.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 不使用unicode_minus模式处理坐标轴轴线为负数的情况
mpl.rcParams['axes.unicode_minus'] = False1.2 matplotlib 基础函数大全
python
plot() # 变量趋势变化
scatter() # 变量之间关系
xlim() # x轴数值显示范围
xlabel() # x轴的标签文本
grid() # 绘制刻度线的网格线
axhline() # 绘制平行于x轴的水平参考线
axvspan() # 绘制垂直于x轴的参考区域
annotate() # 添加图形内容的指向注释(文本)
text() # 添加图形内容的非指向文本
title() # 添加图形内容的标题
legend() # 标示不同图形的文本标签图例
1.3 读入数据
pd.read_csv 函数
!后面加linux命令可以直接在notebook里面执行iloc方法需要传入行索引(切片)或者列索引(切片),用逗号分隔开
python
!ls -lr # 列出当前目录内容(按时间逆序)
df = pd.read_csv('./tips_new.csv').iloc[:, 1:] # 读取CSV文件,并去掉第0列
print(df) # 输出DataFrame内容1.4 折线图
plt.plot 函数,默认折线图
- 横纵坐标分别是
x和y参数(x,y 长度需一致) ls代表图线风格,lw代表图线宽度label代表图像标签- 因为
x轴数值稠密,所以折线图才会光滑
可以参考 [[_Jupyter 命令]] 中的魔法方法查看 plot 的参数:
| ls | 效果 | 说明 |
|---|---|---|
'-' | ───────── | 实线(默认) |
'--' | ─ ─ ─ ─ ─ | 虚线 |
'-.' | ─ · ─ · ─ | 点划线 |
':' | ⋯⋯⋯⋯⋯⋯⋯⋯ | 点线(细虚线) |
| lw | 线条粗细效果 |
|---|---|
lw=0.5 | 很细 |
lw=1 | 默认 |
lw=2~3 | 较常用,适中 |
lw=5以上 | 很粗,用于强调 |
| c | 全名 | 颜色 |
|---|---|---|
'r' | 'red' | 红色 |
'g' | 'green' | 绿色 |
'b' | 'blue' | 蓝色 |
'k' | 'black' | 黑色 |
'y' | 'yellow' | 黄色 |
'm' | 'magenta' | 洋红 |
'c' | 'cyan' | 青色 |
'w' | 'white' | 白色 |
| marker | 描述 |
|---|---|
'.' | 点 |
',' | 像素 |
'o' | 圆圈 |
'v' | 下三角 |
'^' | 上三角 |
'<' | 左三角 |
'>' | 右三角 |
'1' | 下三叉 |
'2' | 上三叉 |
'3' | 左三叉 |
'4' | 右三叉 |
's' | 方形 |
'p' | 五边形 |
'*' | 星形 |
'h' | 六边形 1 |
'H' | 六边形 2 |
'+' | 加号 |
'x' | 叉号 |
'D' | 菱形 |
'd' | 窄菱形 |
'_' | 横线, 竖线用“|” |
python
%matplotlib inline # 在Jupyter中内嵌显示图像,否则会弹出窗口
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 1000) # x = 0.05到10的等间距1000个点
y = np.cos(x) # y = cos(x)
# ls=图线风格, lw=图线宽度, label=图像标签
plt.plot(x, y, ls="-", lw="2", label="plot figure") # 绘制图
plt.legend() # 绘制图例
plt.show() # 显示图像python
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4])
plt.plot(ypoints, marker = 'd')
plt.show()在 Chrome 中,可以使用 Ctrl+Shift+右键 复制图片


1.5 绘制 df 数据
plt.figure可以预先设置图形大小和清晰度plt.plot可以对 series 绘图,所以使用 df 指定列即可,横轴为 索引(index)- 图片可以保存,利用
plt.savefig函数
python
plt.figure(figsize=(30,12), dpi=80) # 设置图形大小和清晰度
plt.plot(df['tip'], ls="-", lw="2", label="dataframe test") # 绘制线图
plt.legend() # 绘制图例
plt.savefig('image01.png') # 保存图片
plt.show() # 显示图像
1.6 绘制散点图
plt.scatter函数需要指定横轴和竖轴- 同样支持 dataframe 数据
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
np.random.seed(2024) # 设置随机种子
y = np.random.rand(1000) # 生成 1000 个随机数作为 y
plt.scatter(x, y, label="scatter figure") # 绘制散点图
plt.legend() # 显示图例
plt.show() # 显示图形
1.7 设置坐标显示范围
- 与上一页使用的数据相同
- 想展示经过筛选的,用
xlim/ylim xlim是对横轴范围进行筛选,ylim是对纵轴范围进行筛选- 比较像裁剪,显示的圆点可能被切割
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
np.random.seed(2024) # 设置随机种子
y = np.random.rand(1000) # 生成 1000 个随机数作为 y
plt.scatter(x, y, label="scatter figure") # 绘制散点图
plt.legend() # 显示图例
plt.xlim(0, 10.5) # 设置横轴范围
plt.ylim(0, 1) # 设置纵轴范围
plt.show() # 显示图形
1.8 坐标轴命名
xlabel为横坐标命名,ylabel为纵坐标命名- 几乎所有的可视化的最后阶段产出都需要重命名,才能更清晰地表达图形含义
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', label='plot figure') # 绘制折线图
plt.legend() # 显示图例
plt.xlabel("x-axis") # x轴名称
plt.ylabel("y-axis") # y轴名称
plt.show() # 显示图形
1.9 网格线
grid 函数
linestyle是网格线的格式color是颜色linewidth是线的粗度- 可以通过更改参数来获得最满意的搭配网格
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图(黄色)
plt.legend() # 显示图例
# 设置网格线格式、颜色、粗细(点状线、黑色、细网格线)
plt.grid(linestyle=':', color='k', linewidth=1)
plt.show() # 显示图形
1.10 参考线
axhline添加水平线,axyline添加竖直线c是颜色,ls是参考线格式,lw是线的粗度,参数x和y分别指定位置
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图(黄色)
plt.legend() # 显示图例
plt.axhline(y=0.0, c='b', ls='--', lw='2') # 水平线
plt.axhline(x=0.0, c='b', ls='--', lw='2') # 竖直线
plt.show() # 显示图形
1.11 高亮区域
axvspan代表竖直区域,axhspan代表水平区域facecolor代表了区域的颜色,xmin、xmax、ymin、ymax代表了区域的范围alpha为透明度
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成 0.05 到 10 的等间距 1000 个点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图(黄色)
plt.legend() # 显示图例
plt.axvspan(xmin=4.0, xmax=6.0, facecolor='g', alpha=0.3) # 竖直区域(绿色)
plt.axhspan(ymin=0.0, ymax=0.5, facecolor='y', alpha=0.3) # 水平区域(黄色)
plt.show() # 显示图形
1.12 指向型注释文本
annotate 函数
xy给出被标记坐标位置,xytext给出文本的位置color文本代表颜色,weight代表是否加粗,arrowprops指定了箭头类型、连接方式和颜色
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成等间距点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图
plt.legend() # 显示图例
plt.annotate(
"maximum", # 注释文本
xy=(np.pi/2, 1.0), # 被标记点位置
xytext=((np.pi/2)+1.0, 0.8), # 文本显示位置
weight='bold', # 文本加粗
color='r', # 文本颜色
arrowprops=dict(arrowstyle='->', # 箭头样式
connectionstyle='arc3',
color='b') # 箭头颜色
)
plt.show() # 显示图形
1.13 非指向型注释文本
text 函数
- 首先给出坐标位置,然后给出文本
- 颜色用
color来指定 weight是指文本是否加粗
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成等间距点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图
plt.legend() # 显示图例
plt.text(3.1, 0.09, 'y=sin(x)', # 文本位置与内容
weight='bold', # 文本加粗
color='b') # 文本颜色
plt.show() # 显示图形
1.14 图形标题
title 指定文本,会默认绘制在图形上侧
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成等间距点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图
plt.legend() # 显示图例
plt.title('y=sin(x) function') # 添加图形标题
plt.show() # 显示图形
1.15 文本标签位置
plt.legend 函数
参数 loc 有种选择,按照位置去选择
| loc 值 | 位置 |
|---|---|
'best' | 自动选择最不遮挡数据的位置 |
'upper right' | 右上角 |
'upper left' | 左上角 |
'lower left' | 左下角 |
'lower right' | 右下角 |
'center' | 正中央 |
'center left' | 中左 |
'center right' | 中右 |
'right' | 中右 |
'upper center' | 上中 |
'lower center' | 下中 |
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
x = np.linspace(0.05, 10, 1000) # 生成等间距点
y = np.sin(x) # 计算 y = sin(x)
plt.plot(x, y, ls='-', lw='2', c='y', label='plot figure') # 绘制折线图
# plt.legend(loc='upper right') # 可选位置示例(被注释掉)
plt.legend(loc='best') # 使用 best 自动选择最优位置
plt.show() # 显示图形
1.16 组间函数组合应用
plt.figure(figsize=(20,12))可以设置图片长宽尺寸plt.xticks(xlist, fontsize=20)可以指定 x 轴的刻度和字体大小
示例:
python
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4), dpi=100) # 默认figsize=(6.4, 4.8), dpi=100
plt.xticks([0, 1, 2], ['一月', '二月', '三月'], rotation=45)组合实现复杂功能:
python
import matplotlib.pyplot as plt # 导入绘图库
import numpy as np # 导入数值计算库
from matplotlib import cm as cm # 导入matplotlib色图模块并简写为cm
# define data
x = np.linspace(0.5, 3.5, 100) # 生成 0.5 到 3.5 的等间距 100 个点
y = np.sin(x) # 计算 y = sin(x)
np.random.seed(2024) # 设置随机种子
y1 = np.random.rand(100) * 3 # 生成 0~3 范围内的100个随机数作为散点y值
plt.figure(figsize=(20, 12)) # 设置图形尺寸
# scatter figure
plt.scatter(x, y1, c='0.25', label='scatter figure') # 绘制散点图
# plot figure
plt.plot(x, y, ls='--', lw=2, label='plot figure') # 绘制折线图
# set x,yaxis limit
plt.xlim(0.0, 4.0) # 设置x轴范围
plt.ylim(-3.0, 3.0) # 设置y轴范围
plt.xticks(np.arange(0, 4.5, 0.5), fontsize=20) # 设置x轴刻度及字体大小
plt.yticks(np.arange(-3, 3+1, 1), fontsize=20) # 设置y轴刻度及字体大小
# set axes labels
plt.xlabel('x_axis', fontsize=20) # 设置x轴标签
plt.ylabel('y_axis', fontsize=20) # 设置y轴标签
# set x,yaxis grid
plt.grid(ls=':', color='r') # 设置网格线格式和颜色
# add a horizontal line across the axis
plt.axhline(y=0.0, c='r', ls='--', lw=2) # 添加水平参考线
# add a vertical span across the axis
plt.axvspan(xmin=1.0, xmax=2.0, facecolor='r', alpha=0.3) # 添加竖向区域
# set annotating information
plt.annotate('maximum', xy=(np.pi/2, 1.0), # 标记最大值点
xytext=((np.pi/2)+0.15, 1.5), weight='bold', color='b',
arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='r'),
fontsize=30)
plt.annotate('spines', xy=(0.75, -3), # 标记spines说明
xytext=(0.35, -2.25), weight='bold', color='b',
arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='r'),
fontsize=30)
plt.annotate('', xy=(0, -2.78), # 指向左下刻度线
xytext=(0.4, -2.32), weight='bold', color='r',
arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='r'),
fontsize=20)
plt.annotate('', xy=(3.5, -2.98), # 指向右下刻度线
xytext=(3.6, -2.7), weight='bold', color='r',
arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='r'),
fontsize=20)
# set text information
plt.text(3.6, -2.7, "'|' is tickline", weight='bold', color='b', fontsize=20) # 文本:刻度线说明
plt.text(3.6, -2.95, "3.5 is ticklabel", weight='bold', color='b', fontsize=20) # 文本:刻度值说明
# set title
plt.title("structure of matplotlib", fontsize=20) # 设置标题
# set legend
plt.legend(loc='upper right', fontsize=15) # 设置图例位置及字体大小
plt.show() # 显示图形
2. matplotlib 绘图函数
2.1 柱状图
bar 函数
- 可以通过
rcparams设置字体和中文符号显示 tick_label是对横轴进行的重命名hatch是柱状图上的花纹格式color是柱子的颜色,align是指柱子对齐的参数
python
# some simple data
x = [1, 2, 3, 4, 5, 6, 7, 8] # x轴数据
y = [3, 1, 4, 5, 8, 9, 7, 2] # y轴数据
# create bar
plt.bar(x, y, align='center', color='r', # 绘制柱状图
tick_label=['q', 'a', 'c', 'e', 'r', 'j', 'b', 'p'], # 横轴标签
hatch='/') # 柱状图花纹
plt.xlabel("箱子编号") # x轴标签
plt.ylabel("箱子重量(kg)") # y轴标签
plt.show() # 显示图形
2.2 堆积柱状图
- 大部分设置于普通柱状图相同
- 区别在于:首先要画 2 次柱状图; 其次第二个柱状图要使用参数
bottom来实现堆积
python
# some simple data
x = [1, 2, 3, 4, 5] # x轴数据
y = [3, 4, 1, 5, 3] # 第一组柱状数据
y1 = [2, 1, 3, 4, 6] # 第二组柱状数据
tick_label = ['A', 'B', 'C', 'D', 'E'] # 横轴标签
# create bar
plt.bar(x, y, align='center', # 绘制第一组柱状图
color='b', tick_label=tick_label,
label='classA')
plt.bar(x, y1, align='center', # 绘制第二组柱状图
color='r', bottom=y, # bottom=y 实现堆积效果,y是一个列表
tick_label=tick_label,
label='classB')
plt.xlabel('test_difficulty') # 设置x轴名称
plt.ylabel('test_score') # 设置y轴名称
# set x-axis grid
plt.grid(axis='y', ls=':', color='r', alpha=0.3) # 设置网格(仅y轴)
plt.legend() # 显示图例
plt.show() # 显示图形
2.3 多系列对比柱状图
- 多系列柱状图是通过改变 x 轴的值来实现并列和对比效果的,可以设定对比系列间距,参数为
bar_width - 如果 A 和 B 不想紧挨着,可以在横轴基础上再加上一个小间隔,例如
0.05 alpha可以设置颜色的饱和度
python
# some simple data
x = np.arange(5) # 生成 x = [0,1,2,3,4]
y = [3, 4, 1, 5, 3] # 第一组柱状数据
y1 = [2, 1, 3, 4, 6] # 第二组柱状数据
bar_width = 0.35 # 柱状条宽度
tick_label = ['A', 'B', 'C', 'D', 'E'] # 横轴标签
# create bar
plt.bar(x, y, bar_width, # 绘制第一组柱状图
align='center', color='b', label='classA',
hatch='/', alpha=0.4)
plt.bar(x + bar_width + 0.05, # 绘制第二组柱状图(并列显示)
y1, bar_width,
align='center', color='r', label='classB',
hatch='//', alpha=0.6)
plt.xlabel('test_difficulty') # 设置 x 轴名称
plt.ylabel('test_score') # 设置 y 轴名称
# set x-axis grid
plt.grid(axis='y', ls=':', color='r', alpha=0.3) # 设置 y 轴网格
# set x-axis ticks and tick_labels
plt.xticks(x + bar_width / 2, tick_label) # 设置刻度位置与标签
plt.legend() # 显示图例
plt.show() # 显示图形
2.4 水平柱状图
barh用于绘制 水平柱状图,与bar(垂直柱状图)相对- 水平柱状图特别适合类别名称较长、或垂直空间不足的场景
python
import matplotlib as mpl # 导入matplotlib主模块
import matplotlib.pyplot as plt # 导入绘图库
# 解决matplotlib无法显示中文问题
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体为黑体
mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# some simple data
x = [1, 2, 3, 4, 5, 6, 7, 8] # y轴对应的类别
y = [3, 1, 4, 5, 8, 9, 7, 2] # 每个类别的数值
# create bar
plt.barh(x, y, # 绘制水平柱状图
align='center',
color='c', # 青色
tick_label=['q', 'a', 'c', 'e', 'r', 'j', 'b', 'p'],
hatch='/')
# set x,y_axis label
plt.ylabel("box_no") # y轴标签(仍为竖直方向)
plt.xlabel("box_weight(kg)") # x轴标签(仍为水平方向)
plt.show() # 显示图形
2.5 水平堆积柱状图
- 第二个柱状图要使用参数
left来实现堆积效果 - 其余设置与普通水平柱状图完全相同(如
color、tick_label、align)
python
# some simple data
x = [1, 2, 3, 4, 5] # y轴对应类别
y = [3, 4, 1, 5, 3] # 第一组数据
y1 = [2, 1, 3, 4, 6] # 第二组数据
tick_label = ['A', 'B', 'C', 'D', 'E'] # 标签
# create bar
plt.barh(x, y, # 第一组水平柱状图
align='center',
color='b',
tick_label=tick_label,
label='classA')
plt.barh(x, y1, # 第二组水平柱状图
align='center',
color='r',
left=y, # 关键参数:实现水平堆积
tick_label=tick_label,
label='classB')
plt.xlabel('test_difficulty') # x轴名称
plt.ylabel('test_score') # y轴名称
# set x-axis grid
plt.grid(axis='x', ls=':', color='r', alpha=0.3) # 设置网格线
plt.legend() # 显示图例
plt.show() # 显示图形
2.6 多系列水平对比柱状图
- 多系列水平柱状图是通过控制 y 轴的值(这里 y 轴的值仍然是列表 x)来实现并列和对比效果的,可以设定对比系列间距,参数为
bar_width - 如右图,如果 A 和 B 不想紧挨着,可以在横轴基础上再加上一个小间隔,例如
0.05
python
# some simple data
x = np.arange(5) # y轴位置
y = [3, 4, 1, 5, 3] # 第一组数据
y1 = [2, 1, 3, 4, 6] # 第二组数据
bar_width = 0.35 # 柱宽
tick_label = ['A', 'B', 'C', 'D', 'E'] # 标签
# create horizontal bar
plt.barh(x, y, bar_width, # 第一组水平柱状图
align='center', color='b',
label='classA', alpha=0.5, hatch='/')
plt.barh(x + bar_width + 0.05, # 第二组水平柱状图
y1, bar_width, align='center',
color='r', label='classB', alpha=0.6, hatch='\\')
plt.xlabel('test_difficulty') # x轴标签
plt.ylabel('test_score') # y轴标签
# set x-axis grid
plt.grid(axis='y', ls=':', color='r', alpha=0.3) # 网格
# set x-axis ticks and tick_labels
plt.yticks(x + bar_width / 2, tick_label) # 设置y轴刻度标签
plt.legend() # 图例
plt.show() # 显示图形
2.7 直方图
hist 函数
bins是柱子的个数rwidth是间隔histtype是指直方图的形式color是柱子颜色- 更改
histtype参数来决定外观选择histtype参数值:
| 值 | 描述 |
|---|---|
'bar' | 传统直方图条形 |
'barstacked' | 堆叠直方图 |
'step' | 线框直方图 |
'stepfilled' | 填充的线框直方图 |
python
# 解决matplotlib无法显示中文问题
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# set test scores
np.random.seed(2024) # 随机种子
boxWeight = np.random.randint(0, 10, 100) # 生成0–9的100个随机数
x = boxWeight # 数据
# plot histogram
plt.hist(x, bins=10, # 柱子数量
color='green', # 柱子颜色
histtype='bar', # 直方图类型
rwidth=0.8, # 柱子之间的距离,下雨1才会有间隔
alpha=0.6) # 透明度
# set x,y_axis label
plt.xlabel("box_no") # x轴标签
plt.ylabel("box_weight(kg)") # y轴标签
plt.show() # 显示图形
2.8 饼图
pie 函数
- 指定数据和
labels autopct指定百分比的显示形式- 可以指定
colors配置 startangle第一个扇形的起始角度- 主要用于宏观分析
python
# 解决matplotlib无法显示中文问题
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# kinds 数据
# kinds = ['jianyi', 'baowen', 'xingli', 'mifeng']
kinds = ["简易箱", "保温箱", "行李箱", "密封箱"] # 标签
colors = ['green', 'yellow', 'blue', 'red'] # 颜色
soldNums = [0.05, 0.45, 0.15, 0.35] # 数据
# pie chart
plt.pie(soldNums,
labels=kinds, # 标签
autopct="%5.2f%%", # 前面的数字表示往右移动,后面的数字表示小数点位数
startangle=90, # x正轴为0度
colors=colors) # 颜色
# title
# plt.title("sales_percentage_of_boxes")
plt.title("不同类型箱子的销售数量占比") # 标题
plt.show() # 显示图形
2.9 气泡图
scatter 函数
- 与散点图一样,需要指定两列数据
s参数是指定气泡大小,支持用函数表达式c代表颜色marker代表形状
python
np.random.seed(2024) # 设置随机种子
x = np.random.randn(100) # 生成 x 数据
y = np.random.randn(100) # 生成 y 数据
size_n = np.power(10*x + 20*y, 2) # 计算气泡大小
# s=np.power(10*x+20*y,2)
# colormap:RdYlBu
plt.scatter(x, y, s=size_n, # 数组的次方,标签size
c=np.random.rand(100), # 小数表示灰度,0-1颜色逐渐变浅
# cmap=mpl.cm.RdYlBu,
marker='o') # 标签形状
plt.ylim(-5, 5) # 设置 y 轴范围
plt.title("matplotlib也可以画气泡图!!!") # 设置标题
plt.show() # 显示图形[!hint] 气泡大小计算公式:
size_n=(10*x + 20*y)**2,当10*x+20*y≈0时,平方后气泡大小非常小,对应点大约落在直线y≈-0.5 x上,所以看到一条小气泡线

2.10 棉棒图
stem 函数
- 需要指定坐标
x、y linefmt是棉棒的样式markerfmt是棉棒末端的样式basefmt是基线(y=0)的样式
| 参数 | 值 |
|---|---|
linefmt | '-' 实线, '--' 虚线, '-.' 点划线, ':' 点线, 'r-.' 红色点划线 |
markerfmt | 'o' 圆圈, 's' 方块, '^' 三角, '*' 星号, 'ro' 红色圆圈 |
basefmt | '-' 实线, '--' 虚线, ':' 点线, 'k-' 黑色实线 |
python
np.random.seed(2024) # 设置随机种子
x = np.linspace(0.5, 2*np.pi, 20) # x 数据
y = np.random.randn(20) # y 数据
plt.stem(x, y,
linefmt='-.', # 竖直线样式
markerfmt='o', # 尾部标记样式
basefmt='-') # 基线样式
# plt.stem(x,y,linefmt='-.',markerfmt='o',basefmt='--')
plt.show() # 显示图形
2.11 堆积折线图
stackplot 函数
- 需要指定横轴
x和所有的纵轴指标 labels是堆积的系列的名字colors是每个指定系列的颜色配置,如果没有配置就按照默认分配
python
x = np.arange(5) # x 轴数据
y = [0, 4, 3, 5, 6] # 第一组数据
y1 = [1, 3, 4, 2, 7] # 第二组数据
y2 = [3, 4, 1, 6, 5] # 第三组数据
y3 = (np.array(y1) + np.array(y2)) / 2 # 第四组数据
labels = ['A', 'B', 'C', 'D'] # 标签
colors = ['b', 'orange', 'g', 'k'] # 颜色
# plt.stackplot(x,y,y1,y2,labels=labels,colors=colors)
plt.stackplot(x,y,y1,y2,y3,labels=labels,colors=colors,alpha=0.618) # 绘制堆积折线图
# plt.plot(x,y)
plt.legend(loc='upper left') # 图例放置在左上角
plt.show() # 显示图形
3. matplotlib subplot
3.1 Subplot 等分画布绘图
3.1.1 面向对象风格
plt.figure创建画布fig.add_subplot添加画布ax.margins画布中留白的大小ax.plot与plt.plot等价,在小画布上绘图
python
x = np.linspace(0, 2*np.pi, 100) # x 数据
y = np.cos(x) * np.sin(x) # y 数据
fig = plt.figure() # 创建画布
ax1 = fig.add_subplot(1,2,1) 3 # 画布分成 1 行 2 列,取第 1 列
ax1.margins(0.03) # 设置数据的空白区域
# ax1.margins(3)
ax1.plot(x, y, color='r', alpha=0.8) # 绘图
ax2 = fig.add_subplot(2,2,2) # 画布分成 2 行 2 列,取第 2 个
ax2.margins(0.7, 0.7) # 设置数据的空白区域
ax2.plot(x, y, color='g') # 绘图
ax3 = fig.add_subplot(2,2,4) # 画布分成 2 行 2 列,取第 4 个
ax3.margins(0.1, 0.1) # 设置留白
ax3.plot(x, y, color='b', alpha=0.618) # 绘图
plt.show() # 显示
3.1.2 pyplot 风格
plt.subplot 函数
subplot(121)可理解为 1×2 画布,当前绘制在第一个- 整体效果与
fig.add_subplot一致
python
# 也可以直接使用 plt
plt.subplot(121) # 创建 1×2 布局,位置 1
plt.margins(0.03) # 留白
plt.plot(x, y, color='r') # 绘图
plt.subplot(222) # 2×2 布局,位置 2
plt.margins(0.3, 0.7) # 留白
plt.plot(x, y, color='g')
plt.subplot(2,2,4) # 2×2 布局,位置 4
# plt.subplot(4,4,11)
plt.plot(x, y, color='b')
plt.show()
3.2 Subplot 非等分画布绘图
plt.subplot2grid创建画布,shape为形状- 每次可以创建不同长度宽度的子画布,实现任意形状组合
colspan指定占几列,rowspan指定占几行,loc指定位置plt.tight_layout(w_pad=0.5, h_pad=1.0)分别指定左右、上下的边距
python
```python
# ## subplot只能等分画布,不能设置不同大小
# ## subplot2grid的`rowspan`,`colspan`可以实现非等分画布
# subplot2grid(shape, loc, colspan, rowspan)
# 实现非等分画布
plt.figure(figsize=(20, 12)) # 创建画布并设置整体大小
plt.subplot2grid((4,4),(0,0), colspan=3) # 整个画布分均为4行4列,从(0,0)开始,占3列
x = np.linspace(0,4,10)
np.random.seed(2024)
y = np.random.randn(10)
plt.scatter(x,y,c='b')
plt.title('scatter',fontsize=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4), (0,3)) # 整个画布分均为4行4列,从(0,3)开始,默认占1行1列
plt.title('empty fig1',fontsize=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4),(1,0), rowspan=3,colspan=2) # 整个画布分均为4行4列,从(1,0)开始,占3行2列
plt.plot(range(10), range(10),color='g')
plt.grid(color='gray',alpha=0.9, linestyle=':')
plt.title('line',fontsize=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4), (1,2),colspan=2) # 整个画布分均为4行4列,从(1,2)开始,占2列
plt.title('empty fig2',fontsize=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4), (2,2), colspan=2) # 整个画布分均为4行4列,从(2,2)开始,占2列
plt.plot(x, np.sin(x), marker='*',c='r',alpha=0.7)
plt.title('sin(x)-1',fontsize=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4), (3,2)) # 整个画布分均为4行4列,从(3,2)开始,默认占1行1列
plt.plot(x, np.sin(x), marker='*',c='m')
plt.title('sin(x)-2',fontsize=30)
plt.xticks(fontsize=15)
plt.yticks(fontsize=20)
plt.subplot2grid((4,4), (3,3)) # 整个画布分均为4行4列,从(3,3)开始,默认占1行1列
plt.plot(x, np.cos(x), marker='*',c='k')
plt.title('cos(x)',fontsize=30)
plt.xticks(fontsize=15)
plt.yticks(fontsize=20)
# 整个画布的title
plt.suptitle("非等分画布布局",fontsize=50,color='r',alpha =0.65) # 设置整体标题
plt.tight_layout(w_pad=0.5, h_pad=1.0) # 自动调整子图间距
plt.show() # 显示图形