Matplotlib
学习目标
应用Matplotlib的基本功能实现图形显示
应用Matplotlib实现多图显示
应用Matplotlib实现不同画图种类
1、快速入门
1.1、 Matplotlib简介
- 是专门用于开发2D图表(包括3D图表)
- 以渐进、交互式方式实现数据可视化
为什么要学习Matplotlib?
可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
1.2、实现一个简单的Matplotlib画图 — 以折线图为例
1.2.1 matplotlib.pyplot模块
matplotlib.pytplot包含了一系列类似于matlab的画图函数。
import matplotlib.pyplot as plt
1.2.2 图形绘制流程
- 1.创建画布 – plt.figure()
plt.figure(figsize=(), dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
返回fig对象
-
2.绘制图像 – plt.plot(x, y)
以折线图为例 -
3.显示图像 – plt.show()
1.2.3 折线图绘制与显示
举例:展现上海一周的天气,比如从星期一到星期日的天气温度如下
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(10, 10), dpi=100)
# 2.绘制折线图
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])
# 3.显示图像
plt.show()
figsize和dpi都可以调整图像大小
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(8,4),dpi=70)
# 2.绘制折线图
f = plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
# 3.显示图像
plt.show()
1.3、 认识Matplotlib图像结构(了解)
1.4 小结1
1.定义
主要用于开发2D图表(3D)
数据分析,基于分析,进行展示
2.绘图流程【***】
1.创建画布
2.绘制图像
3.显示图像
3.matplotlib三层结构
容器层
canvas
figure
axes
辅助显示层
添加x轴,y轴描述,标题。。。
图像层
绘制什么图像的声明
2、折线图(plot)与基础绘图功能
学习目标
-
目标
- 掌握给图形添加辅助功能(如:标注、x,y轴名称、标题等)
- 知道图形的保存
- 知道如何多次plot绘制图形
- 知道如何多个坐标系显示图形
- 知道折线图的应用场景
-
应用
- 天气的温度变化显示
2.1 保存图像
plt.savefig(path)
千万注意
如果有plt.show() 那么savefig操作一定得在show之前
plt.show() 会进行资源的释放
import matplotlib.pyplot as plt
plt.figure(figsize=(8,4),dpi=70)
f = plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
plt.show() # 会进行资源释放
plt.savefig('01.jpg') # 再保存就是空白了
此时01.jpg保存的图像为空白
import matplotlib.pyplot as plt
plt.figure(figsize=(8,4),dpi=70)
f = plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
plt.savefig('01.jpg')
plt.show() # 进行资源释放
此时01.jpg确实保存了图像
2.2 完善原始折线图 — 给图形添加辅助功能
为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用
需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
效果:
2.2.1 准备数据并画出初始折线图
random.uniform(a,b)
返回a,b之间的均匀分布里随机采样的浮点数
list1 = [random.uniform(15,18) for i in range(6)]
print(list1)
import matplotlib.pyplot as plt
import random
# 画出温度变化图
# 0.准备x,y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # 随机生成60个 [15,18]均匀分布的随机浮点数 作为温度值
# 1.创建画布
plt.figure(figsize=(20,8),dpi=60)
# 2.绘制折线图
plt.plot(x,y_shanghai)
# 3.显示图像
plt.show()
2.2.2 添加自定义x,y刻度
-
plt.xticks(x, **kwargs)
x:要对谁添加刻度值
**kwargs:添加啥子刻度值 -
plt.yticks(y, **kwargs)
y:要对谁添加刻度值
**kwargs:添加啥子刻度值
画图中文乱码
# 画图中文不乱码
from pylab import mpl# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ['SimHei']# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
绘图代码
plot之后,show之前,加上如下代码
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度
x_ticks_label = [f'11点{i}分' for i in x] # 两种写法都行
y_ticks = range(40)
# 修改x,y轴刻度显示
plt.xticks(x[::5],x_ticks_label[::5]) # 仅设置步长为5 # x.i就是(60,5)=>[0,5,10,15,20,25,30,35,40,45,50,55]
plt.yticks(y_ticks[::5]) # 也即: 每隔5个元素取一个作为刻度 [0,5,10,15,20,25,30,35]
完整代码
import matplotlib.pyplot as plt
import random
# 画出温度变化图
# 0.准备x,y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # 随机生成60个 [15,18]均匀分布的随机浮点数 作为温度值
# 1.创建画布
plt.figure(figsize=(20,8),dpi=60)
# 2.绘制折线图
plt.plot(x,y_shanghai)
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度
#x_ticks_label = ['11点{}分'.format(i) for i in x]
x_ticks_label = [f'11点{i}分' for i in x] # 两种写法都行
y_ticks = range(40)
# 修改x,y轴刻度显示
plt.xticks(x[::5],x_ticks_label[::5]) # 仅设置步长为5 # x.i就是(60,5)=>[0,5,10,15,20,25,30,35,40,45,50,55]
# 注意,第一个参数必须是数字
# plt.xticks(x_ticks_label[::5]) # 报错 第一个参数是字符串,不行
# plt.xticks(x_ticks_label) # 还是报错 第一个参数是字符串,不行
# plt.xticks(x,x_ticks_label) # 不报错 第一个参数是数字了
plt.yticks(y_ticks[::5]) # 也即: 每隔5个元素取一个作为刻度 [0,5,10,15,20,25,30,35]
# 3.显示图像
plt.show()
2.2.3 添加网格显示
为了更加清楚地观察图形对应的值
plt.grid(True, linestyle='--', alpha=0.5)
2.2.4 添加(xlabel,ylabel,title)描述信息
添加x轴、y轴描述信息及标题
通过fontsize参数可以修改图像中字体的大小
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
同样还是plt.show()正上方加代码
2.2.5 图像保存
# 保存图片到指定路径
plt.savefig("test.png")
- 注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。
完整代码:
import matplotlib.pyplot as plt
import random
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai)
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 3.图像显示
plt.show()
test.jpg:
2.3 在一个坐标系中绘制多个图像
2.3.1 多次plot(绘制多个图像)
需求:再添加一个城市的温度变化
收集到北京当天温度变化情况,温度在1度到3度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示
- 核心代码:
# 增加北京的温度数据
y_beijing = [random.uniform(1, 3) for i in x]
# 绘制折线图
plt.plot(x, y_shanghai)
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--')
我们仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例。
- 完整代码
import matplotlib.pyplot as plt
import random
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False # 设置正常显示符号
plt.figure(figsize=(20, 8), dpi=100)
# 第1条折线
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
plt.plot(x, y_shanghai)
# 第2条折线 新增代码
y_beijing = [random.uniform(1,3) for i in x]
plt.plot(x,y_beijing,color='r',linestyle='--') # 修改线条样式 以便区分
# 描述信息
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle="--", alpha=0.5)
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 3.图像显示
plt.show()
2.3.2 设置图形风格(线型和颜色)
颜色字符 | 风格字符 |
---|---|
r 红色 | - 实线 |
g 绿色 | – 虚线 |
b 蓝色 | -. 点划线 |
w 白色 | : 点虚线 |
c 青色 | ’ ’ 留空、空格 |
m 洋红 | |
y 黄色 | |
k 黑色 |
plt.plot(x,y_beijing,color='r',linestyle='--') # 修改线条样式 以便区分
2.3.3 显示图例
- 注意:如果只在plt.plot()中设置label还不能最终显示出图例,还需要通过plt.legend()将图例显示出来。
# 绘制折线图
plt.plot(x, y_shanghai, label="上海")
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")
# 显示图例
plt.legend(loc="best")
Location String | Location Code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
‘center right’ | 7 |
‘lower center’ | 8 |
‘upper center’ | 9 |
‘center’ | 10 |
- 完整代码 (增加3处)
import matplotlib.pyplot as plt
import random
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False # 设置正常显示符号
plt.figure(figsize=(20, 8), dpi=100)
# 第1条折线
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
plt.plot(x, y_shanghai,label='上海') # 增加label
# 第2条折线
y_beijing = [random.uniform(1,3) for i in x]
plt.plot(x,y_beijing,color='r',linestyle='--',label='北京') # 增加label
# 描述信息
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle="--", alpha=0.5)
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
plt.legend(loc='best') # 增加label
# 3.图像显示
plt.show()
- 完整代码2: # 添加3处
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai, label="上海") # 添加1: label="上海"
plt.plot(x, y_beijing, color="r", linestyle="--", label="北京") # 添加2:label="北京"
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 2.5 添加图例
#plt.legend(loc=0) # 添加3:plt.legend(loc=0)
plt.legend(loc='best') # 两种写法是等价的
# 3.图像显示
plt.show()
2.4 多个坐标系显示— plt.subplots(面向对象的画图方法)
如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中,效果如下:
可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数
- matplotlib.pyplot.subplots(nrows=行数, ncols=列数, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图
Parameters:
nrows, ncols : 设置有几行几列坐标系
int, optional, default: 1, Number of rows/columns of the subplot grid.
Returns:
fig : 图对象
axes : 返回相应数量的坐标系
设置标题等方法不同:
set_xticks
set_yticks
set_xlabel
set_ylabel
关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes
- 注意:plt.函数名() 相当于面向过程的画图方法,axes.set_方法名() 相当于面向对象的画图方法
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
# 1.创建画布
# plt.figure(figsize=(20, 8), dpi=100)
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100) # 注意是subplots不是subplot
# nrows=1,ncols=2 1行2列
# 2.绘制图像
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
axes[0].plot(x,y_shanghai,label='上海')
axes[1].plot(x,y_beijing,color='g',linestyle=':',label='北京')
# 2.1 添加x,y轴刻度 不变
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(x[::5])
axes[0].set_xticklabels(x[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(x[::5])
axes[1].set_xticklabels(x[::5])
# 2.2 添加网格显示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True,linestyle='--',alpha=0.5)
axes[1].grid(True,linestyle='--',alpha=1) # alpha控制网格透明度的 0~1
# 2.3 添加描述信息
# plt.xlabel("时间")
# plt.ylabel("温度")
# plt.title("中午11点--12点某城市温度变化图", fontsize=20)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 2.5 添加图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 3.图像显示
plt.show()
2.5 折线图的应用场景
-
呈现公司产品(不同区域)每天活跃用户数
-
呈现app每天下载数量
-
呈现产品新功能上线后,用户点击次数随时间的变化
-
拓展:画各种数学函数图像
- 注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像
代码:
import numpy as np
# 0.准备数据
x = np.linspace(-10,10,1000)
y = np.sin(x)
# 1.创建画布
plt.figure(figsize=(10,4),dpi=80) # 一个图线无需返回值
# 2.绘制函数图像
plt.plot(x,y)
# 2.1 添加网格显示
plt.grid()
# 3.显示图像
plt.show()
2.6 小结2
- 添加x,y轴刻度【知道】
- plt.xticks()
- plt.yticks()
- 注意:在传递进去的第一个参数必须是数字,不能是字符串,如果是字符串吗,需要进行替换操作
- 添加网格显示【知道】
- plt.grid(linestyle=“–”, alpha=0.5) # alpha=[0,1] 透明度
- 添加描述信息【知道】
- plt.xlabel()
- plt.ylabel()
- plt.title()
- 图像保存【知道】
- plt.savefig(“路径”)
- 多次plot【了解】
- 直接进行添加就OK
- 显示图例【知道】
- plt.legend(loc=“best”)
- 注意:一定要在plt.plot()里面设置一个label,如果不设置,没法显示
- 多个坐标系显示【了解】
- plt.subplots(nrows=行数, ncols=列数)
- 折线图的应用【知道】
- 1.应用于观察数据的变化
- 2.可是画出一些数学函数图像
3 常见图形绘制
学习目标
目标
掌握常见统计图及其意义
Matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。
我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据。
3.1 常见图形种类及意义
3.1.1 折线图:
以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
api:plt.plot(x, y)
3.1.2 散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
api:plt.scatter(x, y)
3.1.3 柱状图
排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
api:plt.bar(x, width, align=‘center’, **kwargs)
Parameters:
x : 需要传递的数据
width : 柱状图的宽度
align : 每个柱状图的位置对齐方式
{‘center’, ‘edge’}, optional, default: ‘center’
**kwargs :
color:选择柱状图的颜色
3.1.4 直方图
由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api:matplotlib.pyplot.hist(x, bins=None)
Parameters:
x : 需要传递的数据
bins : 组距
3.1.5 饼图
用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api:plt.pie(x, labels=,autopct=,colors)
Parameters:
x:数量,自动算百分比
labels:每部分名称
autopct:占比显示指定%1.2f%%
colors:每部分颜色
3.2 散点图绘制
需求:探究房屋面积和房屋价格的关系
房屋面积数据:
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
房屋价格数据:
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
代码: TODO
# 0.准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制散点图
plt.scatter(x, y)
# 3.显示图像
plt.show()