【Python工具包之:Matplotlib】

一、Matplotlib简介

1.1 Matplotlib简介

可以将 Matplotlib 理解为一个画二维图表的python工具库(能实现 matlab 的常用功能),专门用于开发2D图表(包括3D图表),以渐进、交互式方式实现数据可视化。故:掌握了 Matplotlib 相当于掌握了matlab,两者都是画图工具。

1.2 Matplotlib作用

Matplotlib 的作用:画图,即将数据进行可视化。注:数据可视化是在整个数据挖掘的关键辅助工具,它能将数据更直观的呈现,可以清晰的理解数据,让数据更加客观、更具说服力,从而调整我们的分析方法。例如下图为数字展示和图形展示:
在这里插入图片描述

1.3 实现一个简单的Matplotlib画图

第一步:导入画图工具 pyplot,它在 Matplotlib 库里
第二步:调用 figure() 方法定义一个画布(相当于开辟了一个内存)
第三步:调用 plot(X,Y) 方法进行画图,其中X传横坐标数据,Y传纵坐标数据
第四步:调用 show() 方法显示画图结果

在这里插入图片描述
plt.plot([1, 0, 9], [4, 5, 6]) 的作用:指定(1,4)、(0,5)、(9,6)三个点,再将这三个点描成图像。(注:当横/纵坐标未给出时,默认为[0, ···, N-1])

1.4 认识Matplotlib图形结构

在这里插入图片描述
如图,利用Matplotlib可以实现画散点图、添加表格、添加标题…等功能,只需要慢慢去丰富代码。

二、Matplotlib三层结构

2.1 容器层

2.1.1 介绍:容器层主要由Canvas、Figure、Axes组成。

1)Canvas:是位于最底层的系统层,在绘图中充当画板 的角色,即放置画布(Figure)的工具。(注:该层不需要手动设置,调用Matplotlib时自动生成!)
2)Figure:是Canvas上方的第一层,也是需要用户操作的应用层的第一层,在绘图的过程中充当画布的角色。(通过调用 figure() 方法创建画布,并设置画布大小和分辨率等功能)
3)Axes:是应用层的第二层,在绘图的过程中相当于画布上的绘图区(又叫坐标系)角色。(可通过调用 subplots() 方法创建多个绘图区)
Axes(坐标系):数据的绘图区域。Axis(坐标轴):坐标系中的一条坐标轴,包含大小限制、刻度和刻度标签(一个2D绘图区由两条坐标轴构成,所以绘图区又叫坐标系。)注:辅助显示层和图像层都是在绘图区之上的。

2.1.2 特点

一个figure(画布)可以包含多个axes(坐标系/绘图区),但一个axes只属于一个figure。一个axes(坐标系/绘图区)可包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系。

2.2 辅助显示层

2.2.1 介绍

辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括:Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(tittle)等内容。

2.2.2 作用

该层的设置可以使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质影响。

2.3 图像层

2.3.1 介绍

图像层是指Axes(绘图区)内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。其任务就是画各种图表并设置图表的各种参数,如下图:
在这里插入图片描述
总结:

  • Canvas(画板):位于最底层,不用手动设置。
  • Figure(画布):建立在Canvas之上
  • Axes(绘图区):建立在Figure之上
  • 坐标轴(axis)、图例(legend)等辅助显示层和图像层都是建立在Axes之上

三、折线图(plot)

3.1 折线图的绘制与保存图片(画布层的操作)

为了更好的理解所以基础绘图功能,通过“天气温度变化”的绘图来学习所有基础作图API的使用。

3.1.1 matplotlib.pyplot模块

matplotlib.pyplot 包含了一系列类似于matlab的画图函数。它的函数作用于当前图形(figure)的当前坐标系(axes)。调用语法:import matplotlib.pyplot as plt

3.1.2 折线图的绘制与显示

在这里插入图片描述
这样显示的效果太过单调,可以加入更多功能!

3.1.3 设置画布属性与图片保存

通过参数设置图像大小和清晰度:figsize(x,y):指定画布大小,其中长为x、宽为y;dpi:指定图像清晰度。
在这里插入图片描述
保存绘制出的图片:通过savefig(path)函数保存图片,其中参数path为保存路径。注意:plt.show()会释放figure(画布)资源,因此假如在显示图像之后再保存图片则只能保存空图片!

3.2 完善原始折线图1(辅助显示层的操作)

需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度 - 18度。
在这里插入图片描述

3.2.1 添加功能一:自定义x、y刻度(ticks)

通过xticks(x , **kwargs)函数修改X轴的刻度;通过yticks(y , **kwargs)函数修改Y轴的刻度,其中参数x/y是原本的刻度,**kwargs是修改以后的刻度。
在这里插入图片描述
显示结果:
在这里插入图片描述
我们发现虽然达到了需求,但是X轴上的刻度无法显示中文。

3.2.2 添加功能二:中文显示问题解决

只需添加两行代码:

在这里插入图片描述

3.2.3 添加功能三:添加网格显示

通过调用 grid(True , linestyle=’–’ , alpha=0.5) 函数添加网格。第一个参数指定是否添加网格,默认True;linestyle指定线条风格,虚线就是–;alpha指定网格透明度,如果希望网格线条不影响原图就把透明度开高一点(alpha参数越小网格越透明)。
在这里插入图片描述

3.2.4 添加功能四:添加描述信息

添加标题:调用title(“标题”)函数
添加X轴描述:调用Xlabel(“X轴描述”)函数
添加Y轴描述:调用ylabel(“Y轴描述”)函数

在这里插入图片描述

3.3 完善原始折线图2(图像层的操作)

(1)功能一:再添加一个城市的温度变化 —— 收集到北京当天温度变化情况,温度在1-3度。
在这里插入图片描述
只需添加上面划线的两行代码即可。

在这里插入图片描述
(2)功能二:添加图例
第一步:在plot( )函数中通过label参数指定图例,例如label=”上海”
第二步:调用legend( )函数显示图例

在这里插入图片描述
显示结果:
在这里插入图片描述
注:可以在legend( )函数中通过指定参数loc 设置图例的位置:plt.legend(loc=””)
在这里插入图片描述
其中Location Srting与Location Code等价,即loc=”best”和loc=0一个效果。
(3)功能三:在同一画布上的多个绘图区画图(面向对象的画图方法)
需求:将上海和北京的天气图显示在同一个图的不同坐标系当中。
第一步:通过调用subplots函数创建一个带有多个axes(坐标系/绘图区)的图:
figure,axes=matplot.pyplot.subplots(nrows=1 , ncols=1 , ** fig_kw)
参数:nrows:指定将坐标系分割为几行,默认为1;
ncols: 指定将坐标系分割为几列,默认为1;(例如要创建的两个图对象在同一行:则nrows=1,ncols=2)
** fig_kw:对图对象参数的一系列设置
返回:figure:图对象;ax :绘图区
第二步:有了两个绘图区对象之后,现分别去操作不同的绘图区对象作图
1)指定两个对象区域:axes[0]、axes[1](其中axes[0]代表要操作的区域1,axes[1]代表要操作的区域2)。
2)通过调用图对象的方法作图,例如:axes[0].方法名、axes[1].方法名
注意: plt.函数名( )相当于面向过程的画图方法,而axes.set_方法名( )相当于面向对象的画图方法
在这里插入图片描述
在这里插入图片描述

3.4 折线图应用场景

(1)应用场景:

  • 呈现公司产品(不同区域)每天活跃的用户数;
  • 呈现app每天的下载数量;
  • 呈现产品新功能上线后,用户点击次数随时间的变化;
    综上,折线图可反映某事物或指标随时间的变化。
    (2)拓展:画各种数学函数图像
    plt.plot( )除了可以画折线图,还可以画各种函数图像

四、散点图(scatter)

4.1 常见图形种类及其作用

(1)折线图:之前已经介绍过了。
(2)散点图:用两组数据构成多个坐标点,考察坐标的的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量间是否存在数量关联,展示离群点(分布规律),故散点图用于判断数量间关系和总结规律。
在这里插入图片描述
(3)柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(常用于统计和对比)
在这里插入图片描述
(4)直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续型的数据用于展示一组或者多组数据的分布状况(统计)
在这里插入图片描述
(5)饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:用于展示分类数据的占比情况
在这里插入图片描述

4.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]
    代码及图像:
    在这里插入图片描述

五、柱状图(bar)

5.1 需求:对比每部电影的票房收入

(1)准备数据

  • 电影名称:
    movie_names = [‘雷神3:诸神黄昏’,‘正义联盟’,‘东方快车谋杀案’,‘寻梦环游记’,‘全球风暴’, ‘降魔传’,‘追捕’,‘七十七天’,‘密战’,‘狂兽’,‘其它’]
  • 票房收入:
    tickets = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
    (2)绘制:matplotlib.pyplot.bar(x , width , align=’center’ , **kwargs)
    参数:x:指定有几个类别;width:指定柱状图宽度
    在这里插入图片描述
    在这里插入图片描述

5.2 需求:比较相同天数的票房

有时候为了公平起见,需要对比不同电影首日和首周的票房,效果如下:
在这里插入图片描述
(1)准备数据
电影名:movie_name = [‘雷神3:诸神黄昏’,‘正义联盟’,‘寻梦环游记’]
首日票房:first_day = [10587.6,10062.5,1275.7]
首周票房:first_weekend=[36224.9,34479.6,11830]
(2)代码如下
在这里插入图片描述

六、直方图(histogram)

6.1 直方图介绍

(1)介绍:直方图涉及统计学的概念。直方图的绘制首先要对数据进行分组,然后统计每个分组内数据元的数量。在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。
示例:某校初三(1)班36位同学的身高的频数分布直方图如下图所示:

在这里插入图片描述
(2)相关概念

  • 组数:在统计数据时,把数据按照不同的范围分成几组,分成的组的个数成为组数。组数=极差/组距(极差=最大值-最小值)
  • 组距:每一组两个端点的差。

6.2 直方图与柱状图的对比

  • 直方图展示数据的分布,柱状图比较数据的大小(根本差别)
  • 直方图的横轴表示定量数据(有数学意义),柱状图的横轴表示分类数据(无数学意义)
  • 直方图的柱子是无间隔的,柱状图的柱子是有间隔的
  • 直方图的柱子宽度可以不等,柱状图的柱子宽度必须相同

6.3 直方图的绘制

需求:现有250部电影的时长,希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现频率)等信息,应该如何呈现这些数据?
(1)准备数据
电影时长:time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
(2)API
matplotlib.pyplot.hist(x , bins=None , normed=None , **kwargs)
参数:X:传入数据集;bins:指定组数;normed:指定是否显示频率,默认值为None
(3)代码及结果

在这里插入图片描述
在这里插入图片描述

6.4 应用

直方图利于展示大量数据集的统计结果。有助于了解数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或异常值。例如:用户年龄分布、商品价格分布

七、饼状图(pie)

案例:显示不同的电影排片占比
(1)准备数据
电影名称:movie_name = [‘雷神3:诸神黄昏’,‘正义联盟’,‘东方快车谋杀案’,‘寻梦环游记’,‘全球风暴’,‘降魔传’,‘追捕’,‘七十七天’,‘密战’,‘狂兽’,‘其它’]
排片数量:place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]
(2)API:matplotlib.pyplot.pie(x , labels= , autopct= , colors)
参数:
x:传入准备计算占比数据的数量(自动计算百分比)
labels:传入每个占比数量的名称
autopct:用%的形式占比显示,例如 autopct=%1.2f%%
colors:每部分的颜色
注意:为了让显示的饼图为圆形,需要添加axis保证长宽一样:plt.axis(‘equal’)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值