机器学习听课 | Matplotlib | 02
Matplotlib之HelloWorld
什么是Matplotlib
(1) 是专门用于开发2D图表(包括3D图表,但是不擅长)
(2) 使用起来简单方便
(3) 以渐进,交互式方式实现数据可视化
为什么要学习Matplotlib
可视化是在整个数据挖掘过程的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法.
(1) 能将数据进行可视化,更直观的呈现
(2) 使数据更加客观,更具说服力.
例如下图,左边是使用数字展示,右边是使用图像展示,显然是右图更加直观清晰.
实现一个简单的Matplotlib画图
matplotlib
实现画图的三个步骤:
(1) 创建画布 plt.figure([figsize=(..,..),dpi=..])
(2) 绘制图像 plt.plot(x,y)
(3) 显示图像 plt.show()
Matplotlib三层结构
容器层
容器层主要由Canvas
,Figure
,Axes
组成.
(1) Canvas
是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure
)的工具.
(2) Figure
是Canvas
上方的第一层,也是需要用户来操作的应用层的第一层.
我们不需要关注Canvas
. 做比喻的话, Canvas
就是画板,Figure
就是画纸.
(3) Axes
是应用层的第二层,在绘图过程中相当于画布上的绘图区的角色.
* figure
: 指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
* axes(坐标系/绘图区)
: 数据的绘图区域
* axis(坐标轴)
: 坐标系中的一条轴,包含大小限制,刻度和刻度标签
辅助显示层
辅助显示层为Axes
(绘图区)内的除了根据数据绘制出的图像以外的内容.
主要包括Axes的外观facecolor
,边框线spines
,坐标轴axis
,坐标轴名称axis label
坐标轴刻度axis tick
,坐标轴刻度标签tick label
,网格线grid
,图例legend
,标题title
该层的设置可使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质的影响.
图像层
图像层指Axes
内通过plot
,scatter
,bar
,histogram
,pie
等函数根据数据绘制出的图像.
折线图(plot)与基础绘图功能
折线图绘制与保存图片
为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用.
matplotlib.pyplot模块
matplotlijb.pyplot
包含了一系列类似于matlab
的画图函数.
它的函数作用于当前图像figure
的当前坐标系axes
.
import matplotlib.pyplot as plt
折线图绘制与显示
展示上海一周的天气,比如从星期一到星期天的天气温度
可以看到这样的显示效果并不好,我们可以加入更多的功能.
设置画布属性与图片保存
plt.figure(figsize=(),dpi=...)
# figsize: 指定图的长宽
# dpi: 图像的清晰度
# 返回fig对象
plt.savefig(path)
# 保存图片路径
例:
# 1.创建画布,并设置画布属性
plt.figure(figsize=(20, 8), dpi=80)
# 2.保存图片到指定路径
plt.savefig("test.png")
注意: plt.show()
会释放figure
资源,如果在显示图像之后保存图片只能保存空图片.
完善原始折线图1 -- 辅助显示层
案例: 显示温度变化状况
需求: 画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度.
效果如下图:
准备数据并画出初始折线图
添加自定义x,y刻度
plt.xticks(x,x_label)
# x: 要显示的刻度值(必须是数值)
plt.yticks(y,y_label)
# y: 要显示的刻度值(必须是数值)
中文显示问题解决
(1) 临时解决方法
在使用中文之前加上以下两行代码
matplotlib.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
(2) 从配置上解决
首先没有字体需要先现在字体,然后反映在对应的地方.
一般是下载SimHei
字体.
linux
下载完字体后需要拷贝到usr/share/fonts
下
windows
下载完字体后直接安装即可.
删除~/.matplotlib
中的缓存文件
cd ~/.matplotlib
rm -r *
修改配置文件matplotlibrc
vi ~/.matplotlib/matplotlibrc
将文件内容修改为
font.family : sans-serif
font.sans-serif : SimHei
axes.unicode_minus : False
添加网格显示
plt.grid(True[,linestyle='--',alpha=0.5])
# 增加网格,更加清楚的看到网格对应的值
添加描述信息
添加x轴,y轴描述信息以及标题
plt.xlabel(...)
plt.ylabel(...)
plt.title(...)
完善原始折线图2 -- 图像层
多次plot
需求: 在添加一个城市的问题变化
收集到北京当天温度变化情况,温度在1度到3度.
怎么去添加另一个在同一个坐标轴(绘图区)当中的不同图形?
其实很简单,只需要再次plot
即可,但是需要区分线条.
如下图所示:
plt.legend(loc="best")
# 增加图例
plt.plot(x,y[,color=..,linestyle=..,label=..])
# 绘制折线图
设置风格
显示图例
注意: 如果只在plt.plot()
中设置label
还不能最终显示出图例,还需要通过plt.legend()
将图例显示出来.
plt.legend(loc="best")
完整代码:
import random
# 多次plot
# 0.创建数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(-5, 5) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图
plt.plot(x, y_shanghai, label="上海", color="r", linestyle="--")
plt.plot(x, y_beijing, label="北京")
# 2.1 添加x,y轴的刻度
x_labels_ticks = ["11点{}分".format(i) for i in x]
y_labels_ticks = range(-10, 30)
plt.xticks(x[::5], x_labels_ticks[::5])
plt.yticks(y_labels_ticks[::5])
# 2.2 添加网格线
plt.grid(linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间", fontsize=16)
plt.ylabel("温度", fontsize=16)
plt.title("某城市11点-12点温度变化", fontsize=20)
# 2.4 增加图例
plt.legend(loc="best")
# 3.显示
plt.show()
多个坐标系(绘图区)显示
显示多个绘图区,这里推荐使用plt.subplots()
,面向对象的画图方法
如果我们想要将上海和北京的天气图显示在同一个图的不同坐标,效果如下:
fig,axes = subplots(nrow=x,ncol=y[,figsize=(..),dpi=...])
# fig 图对象
# axes/ax 一个绘图区的数组
# 设置标题等方法不同
set_xticks()
set_yticks()
set_xlabel()
set_ylabel()
set_title()
折线图的应用场景
折线图就是用来展示变量之间的关系
比如:
呈现公司产品(不同区域)每天活跃用户数
呈现app每天下载数量
呈现新功能上线后,用户点击次数随时间的变化
注意: plt.plot
还可以画各种数学的函数图像
常见图形绘制
(1) 折线图
能够显示数据的变化趋势,反映事物的变化情况(变化)
plt.plot()
(2) 散点图
判断变量之间是否存在数量关系趋势,展示离群点(分布规律)
plt.scatter()
(3) 柱状图
绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计/对比)
plt.bar(x,width,align="center")
(4) 直方图
绘制连续性的数据展示,展示一组或多组的分布状况(统计)
plt.hist(x,bins)
(5) 饼图
用于表示不同分类情况的占比,通过弧度大小来对比各种分类
plt.pie(x,labels,autopct,colors)