Matplotlib基础
本内容主要记录了Matplotlib的基础用法,实现可视化的内容不多,想看Matplotlib可视化的可以翻翻我的其他文章哦~
# 先导入库,我的matplotlib版本为2.2.3
import matplotlib.pyplot as plt
1. Matplotlib图像的结构:
1.1 Matplotlib图像分为4层结构:
- canvas(画板):位于最底层,导入Matplotlib库时就自动存在
- figure(画布):建立在canvas上,这一层可设置参数,如画布大小figure(figsize=(n,m))
- axes(子图):将figure分成不同块,实现分面绘画
- 表图信息(构图元素):添加或修改axes上的图形信息,优化图表的显示效果
1.1.1 关于 axes() 的用法:
# plt.axes((left, bottom, width, height), facecolor='w')
# 前两个参数代表了子图的位置,后两个参数代表了子图的大小,facecolor为子图背景颜色
plt.axes((0, 0, 0.1, 0.1), facecolor='b')
plt.axes((0, 1, 0.1, 0.1), facecolor='w')
plt.axes((1, 0, 0.1, 0.1), facecolor='r')
plt.axes((1, 1, 0.1, 0.1), facecolor='g')
plt.show()
结果显示:
关于axes()子图大小调整的区别:
powershell
plt.axes((0, 0, 1, 1), facecolor='b')
plt.axes((0, 1, 1, 1), facecolor='w')
plt.axes((1, 0, 1, 1), facecolor='r')
plt.axes((1, 1, 1, 1), facecolor='g')
plt.show()
结果显示:
由于没有设定画布figure()的大小,因此画布的大小是随机的。
子图的大小 1 与 0.1 的区别在于:
1:表示为在子图中 绘图的长度占子图 总长度 的 100%
0.1:表示在子图中的 绘图的长度 占子图 总长度 的10%
下图为在设定画布大小后,子图绘图长度为 1 和 0.1 的对比图:
1.1.2 以axes()方式构建子图,如何添加或修改axes上的图形信息
直接添加 ⊙A⊙ !!!
- 需要注意的是,是在构建该子图后一步进行图形添加,不然图形添加的位置就不一定是你想要的位置了
x = [1,2,3,4,5]
y = [1,2,3,4,5]
plt.axes((0, 0, 0.9, 0.9))
plt.title('one')
plt.bar(x,y)
plt.axes((0, 1, 0.9, 0.9))
plt.title('two')
plt.scatter(x,y)
plt.axes((1, 0, 0.9, 0.9))
plt.title('three')
plt.plot(x,y)
plt.axes((1, 1, 0.9, 0.9))
plt.title('four')
plt.pie(y,labels=x,autopct='%.2f %%')
plt.show()
结果显示:
其他构建子图的方法:
plt.subplot(2,1,1)# 将画布划分成两行一列,取第一个放第一个图表内容
2. 绘图流程
- 导入模块
- 创建画布与创建子图(如不需子图可不创建)
- 添加画布内容
- 图形保存于展示
2.1 添加画布内容
调用Matplotlib中的pyplot模块,可添加各类标签、图例等函数。
函数 | 作用 |
---|---|
title | 在当前图形中添加标题,可以指定标题名称、位置、颜色、字体大小等参数 |
xlabel | 在当前图形中添加 x 轴名称,可以指定位置、颜色、字体大小等参数 |
ylabel | 在当前图形中添加 y 轴名称,可以指定位置、颜色、字体大小等参数 |
xlim | 指定当前图形 x 轴的范围,只能确定一个数值区间,而无法使用字符串识别 |
ylim | 指定当前图形 y 轴的范围,只能确定一个数值区间,而无法使用字符串识别 |
xticks | 指定 x 轴刻度的数目与取值 |
yticks | 指定 y 轴刻度的数目与取值 |
legend | 指定当前图形的图例,可以指定图例大小、位置、标签 |
2.2 图形保存与展示
图形保存:
matplotlib.pyplot.savefig()函数可保存图片到指定路径
图形展示:
matplotlib.pyplot.show()函数可展示图形
绘制函数y=x^2与y=x图形:
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 1000) # 数据
# 创建画布。大小为6×6,像素为 80
fig = plt.figure(figsize = (6, 6), dpi = 80)
# 创建子图
fig.add_subplot(2, 1, 1) # 分为2×1图形阵,选择第1张图片绘图
# 添加画布内容
plt.title('y=x^2 & y=x') # 添加标题
plt.xlabel('x') # 添加x轴名称‘x’
plt.ylabel('y') # 添加y轴名称‘y’
plt.xlim((0, 1)) # 指定x轴范围(0,1)
plt.ylim((0, 1)) # 指定y轴范围(0,1)
plt.xticks([0, 0.3, 0.6, 1]) # 设置x轴刻度
plt.yticks([0, 0.5, 1]) # 设置y轴刻度
plt.plot(x, x ** 2)
plt.plot(x, x)
plt.legend(['y=x^2', 'y=x']) # 添加图例
# 保存图片
plt.savefig('./整体流程绘图.png') # 路径可自定义
# 展示图片
plt.show()
结果展示:
2.3 自编函数绘图
# 自编函数绘图,并添加文本示例
def my_plotter(ax, x, y, param_dict):
'''
ax 接收绘图对象
x 接收array 表示横轴数据 无默认值
y 接收array 表示纵轴数据 无默认值
param_dict 接收dict 表示传入参数 无默认值
'''
out = ax.plot(x, y, **param_dict)
return out
# 以如下方式使用函数
x = [0, 1, 2, 3, 4, 5, 6, 7, 8]
y1 = x
y2 = np.sin(x)
fig, (ax1, ax2)= plt.subplots(1, 2)
my_plotter(ax1, x, y1, {'marker': 'x'})
my_plotter(ax2, x, y2, {'marker': 'o'})
plt.show()
结果显示:
2.4 如何在图形中添加文本标注
pyplot模块中,使用**matplotlib.pyplot.text()**函数能够在任意位置添加文本,其使用基本语法如下
matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 1000) # 数据
# 创建子图
fig.add_subplot(2, 1, 1) # 分为2×1图形阵,选择第1张图片绘图
# 添加画布内容
plt.title('y=x^2 & y=x') # 添加标题
plt.xlabel('x') # 添加x轴名称‘x’
plt.ylabel('y') # 添加y轴名称‘y’
plt.xlim((0, 1)) # 指定x轴范围(0,1)
plt.ylim((0, 1)) # 指定y轴范围(0,1)
plt.xticks([0, 0.3, 0.6, 1]) # 设置x轴刻度
plt.yticks([0, 0.5, 1]) # 设置y轴刻度
plt.plot(x, x ** 2)
plt.plot(x, x)
plt.legend(['y=x^2', 'y=x']) # 添加图例
plt.text(x[500], x[500]**2, 'y=x^2') # 在子图1添加‘y=x^2’
plt.text(x[500], x[500], 'y=x') # 在子图1添加‘y=x’
plt.show()
结果展示:
# 构建数据
x = np.arange(12)
np.random.seed(123)# 设置随机种子,即保证y1,y2为固定值
y1 = np.random.random(12)
y2 = np.random.random(12)
plt.xlabel('x')
plt.ylabel('y')
plt.bar(x, y1, color = 'g')
plt.bar(x, -y2, color = 'c')
# 对每条条形图添加数据标注
for i,j in zip(x, y1):
plt.text(i, j+0.01, '%.2f'%j, ha = 'center', va = 'bottom')
# ha :文本居中;va : 文本位于空白区域下方
for i,j in zip(x, y2):
plt.text(i, -j-0.01, '%.2f'%j, ha = 'center', va = 'top')
# ha :文本居中;va : 文本位于空白区域上方
plt.show()
结果展示:
3. 绘图风格
通过print(plt.style.available)命令可以查看所有预设风格的名称,使用use函数就可以直接设置预设风格。
# 查看所有预设风格名称
print(plt.style.available)
结果展示:
# 设置预设风格
x = np.random.normal(0,1,1000) # 生成1000个标准正态分布的数seaborn-colorblind
plt.style.use('seaborn-poster')
plt.hist(x, 100)
plt.show()
结果展示:
4. 动态rc参数
pyplot模块使用rc配置文件可以自定义图形的各种默认属性。
通过修改rc参数可以修改 默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等 。
可通过使用以下命令查看默认配置:
import matplotlib
print(matplotlib.rc_params())
print(matplotlib.rcParamsDefault)
print(matplotlib.rcParams)
4.1 线条常用的rc参数
rc参数名称 | 取值 |
---|---|
lines.linewidth(线条宽度) | 取值0~10,默认1.5 |
lines.linestyle (线条样式) | " - ", " – ", " -. ", " : " ,默认 " - " |
lines.marker (线条上点的形状) | " o ", " D ", " h ", " . ", " , ", " S " 默认None |
lines.markersize (点的大小) | 取值0~10,默认1 |
lines.linestyle参数4种取值意义如下:
lines.marker参数的20种取值及其意义如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
pic = plt.figure(dpi = 80, figsize = (6, 6))
x = np.linspace(0, 1, 1000)
# 绘制第一张图(从左往右从上到下)
pic.add_subplot(2, 2, 1) # 绘制2×2图形阵中第1张图片
plt.rcParams['lines.linestyle'] = '-.' # 修改线条类型
plt.rcParams['lines.linewidth'] = 3 # 修改线条宽度
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第二张图
pic.add_subplot(2, 2, 2)
mpl.rc('lines', linestyle = '--', linewidth = 10) # 以matplotlib.rc()函数命令 方式修改rc参数
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第三张图
pic.add_subplot(2, 2, 3)
plt.rcParams['lines.marker'] = None # 修改线条上点的形状
plt.rcParams['lines.linewidth'] = 3
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第四张图
pic.add_subplot(2, 2, 4)
plt.rcParams['lines.linestyle'] = ':'
plt.rcParams['lines.linewidth'] = 6
plt.plot(x, x ** 2)
plt.title('y = x^2')
plt.show()
结果显示:
4.2 坐标轴常用的rc参数
更多的坐标轴常用的rc参数名称、解释、取值如下表所示
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 1000)
plt.plot(x, np.sin(x))
plt.show()
结果展示:
# 坐标轴常用的rc参数
plt.rcParams['axes.edgecolor'] = 'g' # 轴颜色设置为蓝色
plt.rcParams['axes.grid'] = True # 添加网格
plt.rcParams['axes.spines.top'] = False # 去除顶部轴
plt.rcParams['axes.spines.right'] = False # 去除右侧轴
plt.rcParams['axes.xmargin'] = 0.1 # x轴余留为区间长度的0.1倍
plt.plot(x, np.sin(x))
plt.show()
结果展示:
4.3 字体常用的rc参数
除了字体与符号编码参数外,更多的字体常用rc参数名称、接收、取值
x = [-1,-2,0,1,2]
y = [-12,-3,11,9,15]
plt.title('散点图示例2') # 添加标题
plt.xlabel('数据') # 添加x轴标签
plt.ylabel('数值') # 添加y轴标签
plt.xlim(-3, 3) # 设置x轴刻度范围
plt.ylim(-15,15) # 设置y轴刻度范围
plt.bar(x, y) # 绘制散点图
plt.show()
结果展示:
# 字体常用的rc参数
plt.rcParams['font.sans-serif'] = 'SimHei' # 正常显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
x = [-1,-2,0,1,2]
y = [-12,-3,11,9,15]
plt.title('散点图示例2') # 添加标题
plt.xlabel('数据') # 添加x轴标签
plt.ylabel('数值') # 添加y轴标签
plt.xlim(-3, 3) # 设置x轴刻度范围
plt.ylim(-15,15) # 设置y轴刻度范围
plt.bar(x, y) # 绘制散点图
plt.show()
结果展示: