1、什么是matplotlib
Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用,是数据分析中不可或缺的重要工具之一。
Matplotlib 是 Python 中类似 MATLAB 的绘图工具。MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。
matplotlib 支持的图形 https://matplotlib.org/stable/gallery/index.html
2、基础使用(以下都以折线图为例)
from matplotlib import pyplot as plt # 绘图导入 pyplot 一般会重命名为plt
# 展示每隔两个小时的温度变化
x = range(2,26,2) # [2,4,6,8 ... ,22,24]
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# 绘图
plt.plot(x,y)
# 展示图形
plt.show()
上面图片存在的问题:
- 图片的大小(想要高清大图)
- 保存到本地
- 描述信息,比如x,y轴表示什么
- 调整刻度的间距
- 线条的样式(颜色、透明度)
- 标记出特殊的点(比如最高点,最低点)
- 给图片加水印,防伪
3、设置图片宽高、分辨率、xy轴刻度、保存图片到本地
from matplotlib import pyplot as plt # 绘图导入 pyplot 一般会重命名为plt
# 展示每隔两个小时的温度变化
x = range(2,26,2) # [2,4,6,8 ... ,22,24]
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
"""
figure 指的是我们画的图
figsize 宽 高
dpi 没英寸多少个点,点多了,放大后不会模糊,有锯齿形
"""
plt.figure(figsize=(20, 8), dpi=80)
# 绘图
plt.plot(x,y)
# 设置x轴刻度
# plt.xticks(x)
xticks_lables = [i/2 for i in range(4, 49)]
# plt.xticks(xticks_lables)
plt.xticks(xticks_lables[::3]) # 太密集了,可以每三个取一个
# 设置y轴刻度
plt.yticks(range(min(y), max(y)+1))
# 设置刻度颜色,设置刻度倾斜等 参考 https://blog.csdn.net/Poul_henry/article/details/82590392
# 保存
# plt.savefig("./sig_size.png")
# plt.savefig("./sig_size.svg") # 可以保存为svg矢量图格式,放大不会有锯齿
# 展示图形
plt.show()
4、X,y轴显示字符串并旋转显示
显示10点到12点每分钟气温变化
from matplotlib import pyplot as plt
import random
x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(15, 8), dpi=80)
plt.plot(x,y)
# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]
# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270) # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60) # rotation 旋转的度数
yticks_lables = ["{}tem".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60)
plt.show()
5、X,y轴显示中文并设置字体大小
如果不设置,中文不能正常显示
针对Windows ,字体存放位置 C:\Windows\Fonts
linux/mac可以参考: https://www.bilibili.com/video/BV1hx411d7jb?p=6
也可以参考: https://www.runoob.com/numpy/numpy-matplotlib.html
from matplotlib import pyplot as plt
import random
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)
x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(15, 8), dpi=80)
plt.plot(x,y)
# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]
# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270) # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60) # rotation 旋转的度数
yticks_lables = ["{}度".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60,fontproperties=my_font)
plt.show()
6、设置XY轴和标题的描述信息并绘制网格
from matplotlib import pyplot as plt
import random
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)
x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(15, 8), dpi=80)
plt.plot(x,y)
# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]
# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270) # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60) # rotation 旋转的度数
yticks_lables = ["{}度".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60,fontproperties=my_font)
# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(℃)",fontproperties=my_font)
plt.title("10点到12点每分钟的气温变化情况",fontproperties=my_font)
# 绘制网格
plt.grid(alpha=0.9) # alpha 可以调整透明度,数值越大越清晰
plt.show()
7、同时绘制出两条折线并添加图例、设置折线颜色,折线样式
from matplotlib import pyplot as plt
from matplotlib import font_manager
"""
a 是自己 b 是同桌
x 轴是年龄 y 轴是女朋友的数量
"""
a = [1,0,2,1,5,2,3,6,9,5,1,2,3,1,2,3,2,1,2,1]
b = [1,3,1,1,2,1,1,1,4,4,4,2,2,2,4,1,1,4,1,2]
x = range(11, 31)
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)
# 设置图形大小
plt.figure(figsize=(15, 8), dpi=80)
# plot 增加 label 和 plt.legend() 可以显示tuli
# plot 增加 color 可以修改 线条颜色
# linestyle 线条风格 linestyle 也适用于绘制网格
# - 实线 -- 虚线 -. 点划线 : 点虚线 "" 留空或者空格无线条
# linewidth 线条粗细
# alpha 透明度
plt.plot(x, a, label="自己", color="orange", linestyle="--", linewidth=3, alpha=0.3)
plt.plot(x, b, label="同桌", color="#FF69B4", linestyle="-.",linewidth=6, alpha=0.6)
# 设置x刻度
xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, xtick_labels, fontproperties=my_font)
plt.yticks(range(0,11))
# 绘制网格 linestyle 也适用于绘制网格
plt.grid(alpha=0.6, linestyle="--")
# 添加图例 prop 显示中文,只有这里是 prop其他地方都是 fontproperties
# loc="upper left" 参数可以修改 图例位置 默认是右上
plt.legend(prop=my_font,loc="upper left")
plt.show()
8、标记最高(低)点,添加水印
其他 图像添加image水印、图像添加背景 可 参考 https://zhuanlan.zhihu.com/p/390880393
from matplotlib import pyplot as plt
from matplotlib import font_manager
"""
a 是自己 b 是同桌
x 轴是年龄 y 轴是女朋友的数量
"""
a = [1,0,2,1,5,2,3,6,9,5,1,2,3,1,2,3,2,1,2,1]
b = [1,3,1,1,2,1,1,1,4,4,4,2,2,2,4,1,1,4,1,2]
x = range(11, 31)
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)
# 设置图形大小
plt.figure(figsize=(15, 8), dpi=80)
# plot 增加 label 和 plt.legend() 可以显示tuli
# plot 增加 color 可以修改 线条颜色
# linestyle 线条风格 linestyle 也适用于绘制网格
# - 实线 -- 虚线 -. 点划线 : 点虚线 "" 留空或者空格无线条
# linewidth 线条粗细
# alpha 透明度
plt.plot(x, a, label="自己", color="orange", linestyle="--", linewidth=3, alpha=0.3)
plt.plot(x, b, label="同桌", color="#FF69B4", linestyle="-.",linewidth=6, alpha=0.6)
# 设置x刻度
xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, xtick_labels, fontproperties=my_font)
plt.yticks(range(0,11))
# 标价最高点, 标记最高点;注意:x轴和y轴的索引必须相对应
# mark表示圆圈标记,edgecolors表示圆圈的颜色,s表示标记点的大小
# plt.scatter(x[8], a[8], color='b')
plt.scatter(x[8], a[8], color='b', marker='o', edgecolors='r', s=300)
# 添加文本水印 其他 图像添加image水印 图像添加背景 可 参考 https://zhuanlan.zhihu.com/p/390880393
plt.text(
x=15, #文本x轴坐标
y=5, #文本y轴坐标
s='hello world', #文本内容
rotation=15, #文字旋转角度
ha='center', #x=2.2是文字的左端位置,可选'center', 'right', 'left'
va=
'center', #y=8是文字的低端位置,可选'center', 'top', 'bottom', 'baseline', 'center_baseline'
alpha=0.5,
fontdict=dict(
fontsize=32,
color='grey',
family=
'monospace', #字体,可选'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'
weight=
'light', #磅值,可选'light', 'normal', 'medium', 'semibold', 'bold', 'heavy', 'black'
) #字体属性设置
)
# 绘制网格 linestyle 也适用于绘制网格
plt.grid(alpha=0.6, linestyle="--")
# 添加图例 prop 显示中文,只有这里是 prop其他地方都是 fontproperties
# loc="upper left" 参数可以修改 图例位置 默认是右上
plt.legend(prop=my_font,loc="upper left")
plt.show()
https://www.bilibili.com/video/BV1hx411d7jb?p=3
https://www.bilibili.com/video/BV1hx411d7jb?p=4
https://www.bilibili.com/video/BV1hx411d7jb?p=5
https://www.bilibili.com/video/BV1hx411d7jb?p=6 设置中文显示
https://www.bilibili.com/video/BV1hx411d7jb?p=7
https://www.bilibili.com/video/BV1hx411d7jb?p=8