前言
Matplotlib是Python语言及其数值计算库NumPy的绘图库。它提供了一个面向对象的API,可以将绘图嵌入到使用通用GUI工具包(如Tkinter、wxPython、Qt或GTK)的程序中。(维基百科)
下载依赖
引入依赖
1
| import matplotlib.pyplot as plt
|
修改字体
- 图表中默认字体不支持中文,中文会变成
口
- 默认字体为
sans-serif
查看字体名
1
| cat ~/.matplotlib/fontlist-v330.json
|
修改字体
1
| plt.rcParams["font.sans-serif"] = ["SimHei"]
|
指定备选字体
1
| plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"]
|
解决修改字体后负号不显示的问题
1
| plt.rcParams["axes.unicode_minus"] = False
|
画布
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
| 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="*":在线条中添加标记
.、,、o、v、^、<、>、1、2、3、4、s、p、*、h、H、+、x、D、d、|、_
添加图例
label="":定义该折线的标签
1 2
| plt.plot([<data_x_1>, <data_x_2>], [<data_y_1>, <data_y_2>], label="") plt.legend()
|
定义图例位置
loc="":定义图例位置
best:缺省值,自动摆放到最佳位置
upper right、upper left、lower left、lower right、right、center left、center right、lower center、upper center、center
散点图
- 散点图用来看两个变量的关系
- 气泡图用来看多个变量的关系
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>])
|
添加标题
添加文字
<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.savefig("<file>.png")
|
1
| plt.savefig("<file>.jpg")
|
1
| plt.savefig("<file>.svg")
|
同时预览和图表为文件
- 要先保存到文件再显示,因为调用
show()的时候会释放图表对象
1 2
| plt.savefig() plt.show()
|
读取图片
- 如果是没有alpha通道的图片,读取后会得到三维数组;如果是有alpha通道的图片,读取后会得到四维数组
预览图片
<arr>:三维数组
完成
参考文献
哔哩哔哩——骆昊jackfrued
CSDN——简时刻