【笔记】Matplotlib学习笔记

前言

Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.(官网

下载依赖

1
pip3 install matplotlib

引入依赖

1
import matplotlib.pyplot as plt

修改字体

  • 图表中默认字体不支持中文,中文会变成
  • 默认字体为sans-serif

查看字体名

1
cat ~/.matplotlib/fontlist-v330.json
  • 获取对象中name字段的值

修改字体

1
plt.rcParams["font.sans-serif"] = ["SimHei"]

指定备选字体

1
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"]

解决修改字体后负号不显示的问题

1
plt.rcParams["axes.unicode_minus"] = False

画布

创建画布(figure)

1
plt.figure(figsize=(8, 4), dpi=200)

坐标系(subplot)

  • 将每个图表单独放到一个坐标系中

将多个坐标系按照两行一列的方式展现

subplot():第一个参数表示行,第二个参数表示列,第三个参数表示当前图表的顺序

1
2
3
4
5
plt.subplot(2, 1, 1)
plt.plot(x, y)

plt.subplot(2, 1, 2)
plt.plot(x, y)

将多个坐标系按照一行两列的方式展现

1
2
3
4
5
plt.subplot(1, 2, 1)
plt.plot(x, y)

plt.subplot(1, 2, 2)
plt.plot(x, y)

将多个坐标系自由合并单元格

1
2
3
4
5
6
fig = plt.figure(figsize=(8, 4), dpi=200)
gs = plt.GridSpec(2, 3)
fig.add_subplot(gs[0:1, 0:1])
fig.add_subplot(gs[0:1, 1:2])
fig.add_subplot(gs[0:2, 2:3])
fig.add_subplot(gs[1:2, 0:2])

将边框改为中心原点的平面直角坐标系

1
2
3
4
plt.spines["top"].set_visible(False)
plt.spines["right"].set_visible(False)
plt.spines["bottom"].set_position("center")
plt.spines["left"].set_position("center")

修改轴刻度

修改x轴刻度

labels=[]:定义标签

1
plt.xticks(np.arange(-1, 1, 0.1))

修改y轴刻度

  • 从[-1,1],间隔0.1
1
plt.yticks(np.arange(-1, 1, 0.1))

嵌套坐标系

1
2
3
plt_object = plt.plot(x, y)
add_axes_object = plt_object.add_axes((<x>, <y>, <width>, <height>))
add_axes_object.plot(x, y)

图表

折线图

  • 折线图用来看趋势

color="black"color=["black", "#000000"]:定义所有矩形颜色
linewidth="<num>":线条粗细
linestyle="<type>":网格线类型

--:虚线
-.:点线

marker="*":在线条中添加标记

.,ov^<>1234sp*hH+xDd|_

1
plt.plot(x, y)

添加图例

label="":定义该折线的标签

1
2
plt.plot([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>], label="")
plt.legend()
定义图例位置

loc="":定义图例位置

best:缺省值,自动摆放到最佳位置
upper rightupper leftlower leftlower rightrightcenter leftcenter rightlower centerupper centercenter

1
plt.legend(loc="best")

散点图

  • 散点图用来看两个变量的关系
  • 气泡图用来看多个变量的关系
1
plt.scatter([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>])

气泡图

1
plt.scatter([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>], s=np.abs(y) * 150)

渐变色

1
plt.scatter([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>], c=y, cmap="Reds")
彩虹色
1
plt.scatter([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>], c=y, cmap="rainbow")

柱状图

  • 柱状图用于对比数据

width=<num>:柱子的宽度
color="<color>"color=["<color_1>", "<color_2>"]:柱子的颜色
alpha=0.5:柱子透明度
hatch="/":柱子花纹

////***xxx

yerr=[<num_1>, <num_2>]:定义误差值,显示误差线
color="":误差线颜色
capsize=<num>:误差线帽子的尺寸

1
plt.bar(np.arange(2), [<data_1>, <data_2>])

绘制多个柱子

1
2
plt.bar(np.arange(2) - 0.1, [<data_1>, <data_2>])
plt.bar(np.arange(2) + 0.1, [<data_1>, <data_2>])

修改轴刻度

修改x轴刻度

rotation=0:旋转标签
labels=[""]:定义标签

1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.xticks(np.arange(2))
修改y轴刻度
1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.yticks(np.arange(0, 100))

添加图例

1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.legend()

堆叠柱状图

1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.bar(np.arange(2), [<data_3>, <data_4>], bottom=[<data_1>, <data_2>])

对称条形图

1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.bar(np.arange(2), (-1) * [<data_1>, <data_2>])

添加文字

1
2
plt.bar(np.arange(2), [<data_1>, <data_2>])
plt.text(0, 0, "文本内容", ha="center")

饼图

  • 饼图用于看占比

labels=[""]:定义标签
labeldistance=0.5:定义标签到饼图圆心的距离
autopct="%.2f%%":格式化数据
pctdistance=0.5:定义数据到饼图圆心的距离
explode=[0, 0.1]:定义饼图中每个块距离圆心的偏移量
shadow=True:添加阴影
wedgeprops={}:定义为环状饼图

"width": 0.25:定义圆环宽度
"edgecolor": "w":定义分割线的颜色

textprops={}:设置文字属性

"fontsize": 12:设置文字字号
"color": "k":设置文字颜色

1
plt.pie([<data_1>, <data_2>])

直方图

返回值返回每个箱子内的数据个数

bins=<num>:柱子个数
color="":柱子颜色
histtype="step":只显示轮廓不显示柱子

1
plt.hist([<data_1>, <data_2>], bins=20)

返回值返回密度

1
plt.hist([<data_1>, <data_2>], bins=20, density=True)

累计直方图

1
plt.hist([<data_1>, <data_2>], bins=20, cumulative=True)

箱线图

showmeans=True:显示中位数
notch=True:中位数展示为小蛮腰
whis=1.5:数值判定法得到离群点的系数
sym="x":异常值标记

1
plt.boxplot([<data_1>, <data_2>])

添加标题

1
plt.title("文本内容")

添加文字

<x>:指定横轴坐标
<y>:指定纵轴坐标
fontdict={"<key>": <value>}:设置字体

"fortsize": <num>:指定字号
"color": "<color>":指定颜色

1
plt.text(<x>, <y>, "文本内容")

添加标注

xytext=(<x>, <y>):文字的位置
xy=(<x>, <y>):箭头的位置
fontsize=<num>:指定字号
arrowprops={}:指定箭头属性
arrowstyle:指定箭头类型

->-|>

1
2
3
4
5
plt.annotate("文本内容", xytext=(<x>, <y>), xy=(<x>, <y>), arrowprops={
"arrowstyle": "->",
"color": "",
"connectionstyle": "angle3, angleA=90, angleB=0",
})

显示网格

alpha=0.5:网格透明度
axis="<directions>":网格线方向

x:只显示x轴的纵向的网格线
y:只显示y轴的横向的网格线

linestyle="<type>":网格线类型

--:虚线
::点线

1
plt.grid(True)

显示图表

1
plt.show()

保存图表为文件

  • 默认保存到当前路径
1
plt.savefig()

保存到指定路径和文件格式

1
plt.savefig("<file>.png")
1
plt.savefig("<file>.jpg")
1
plt.savefig("<file>.svg")

同时预览和图表为文件

  • 要先保存到文件再显示,因为调用show()的时候会释放图表对象
1
2
plt.savefig()
plt.show()

读取图片

1
plt.imread("<file>")
  • 如果是没有alpha通道的图片,读取后会得到三维数组
  • 如果是有alpha通道的图片,读取后会得到四维数组

预览图片

<arr>:三维数组

1
plt.imshow(<arr>)

完成

参考文献

哔哩哔哩——骆昊jackfrued
CSDN——简时刻