文章目录
- 1.什么是Matplotlib
- 2.常见图形种类及意义
- 1.折线图
- 2.散点图
- 3.柱状图
- 4.直方图
- 5.饼图
- 3.认识Matplotlib图像结构
- 1.第一层
- 2.第二层
- 3.第三层
- 4.折线图初体验
- 1.设置标题
- 2.中文显示
- 3.自定义X轴刻度
- 4.一图多线
- 5.一图多个坐标系子图
1.什么是Matplotlib
Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。
Matplotlib试图让简单的事情变得更简单,让无法实现的事情变得可能实现。也是Python中最常用的可视化工具之一,它的功能非常强大,可以通过调用函数轻松方便地绘制数据分析中常见的各种图像,比如折线图、条形图、柱状图、散点图、饼图等。
2.常见图形种类及意义
选择最重要,一个选择和另一个选择结果可能会有天壤之别。在我们将数据的可视化之前,同样也需要根据图形的特点来选择绘制数据的图形,从而让我们快速发现数据的特点。
接下来,我们一起了解一下Matplotlib常见图形种类及意义。
1.折线图
以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
2.散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)。
3.柱状图
排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
4.直方图
由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)。
5.饼图
用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)。
当然,除了这些常用图之外,matplotlib还可以绘制一些其它的图像,那么,这些图究竟是如何绘制的呢?
3.认识Matplotlib图像结构
通常情况下,我们可以将一张Matplotlib图像分成三层结构:
1.第一层是底层的容器层,主要包括Canvas、Figure、Axes;
2. 第二层是辅助显示层,主要包括axis、spines、grid、legend、title等;
3. 第三层为图像层,即通过plot、scatter等方法绘制的图像。
1.第一层
第一层是底层的容器层,主要包括Canvas、Figure、Axes;
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具,用户一般接触不到。
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色,我们可以设置画布的大小和分辨率等.
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。一个Figure对象可以包含多个Axes对象,每个Axes都是一个独立的坐标系,绘图过程中的所有图像都是基于坐标系绘制的。
2.第二层
第二层是辅助显示层,主要包括axis、spines、grid、legend、title等;
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括
Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis
label)、坐标轴刻度(tick)、坐标轴刻度标签(tick
label)、网格线(grid)、图例(legend)、标题(title)等内容。
3.第三层
第三层为图像层,即通过plot、scatter等方法绘制的图像。
图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
🚩总结得出
Canvas(画板)位于最底层,用户一般接触不到
Figure(画布)建立在Canvas之上
Axes(绘图区)建立在Figure之上
坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上
4.折线图初体验
跟Pandas的使用一样,使用matplotlib之前,我们需要将它的模块,因为我们是使用Matplotlib的pyplot模块进行图形绘制,所以我们要导入pyplot模块。
from matplotlib import pyplot as plt
我们从matplotlib包中导入了pyplot模块并将其改名为plt,编写代码时,直接使用plt调用方法即可。
#在使用jupyter notebook时调用matplotlib.pyplot的绘图函数plot()
# 进行绘图的时候,或者生成一个figure画布的时候,需要加上%matplotlib
%matplotlib inline
from matplotlib import pyplot as plt
x = range(1,8)
y = [17, 17, 18, 1, 11, 11, 13]
plt.plot(x,y)
plt.show()
代码含义
绘制二维图形需要确定x、y值:图形中点的值(x, y值的个数要相同) plt.plot(x,y):根据传过来的x,y值进行绘制折线图
plt.show():显示绘制的图形
折线的颜色、折点以及宽度该怎么设置呢
plt.plot(x, y, color='green',alpha=1,linestyle='-',linewidth=5,marker='v')
plt.show()
✨效果
color='green'
:设置线的颜色alpha=0.5
:设置线的透明度,让其拥有似漏非漏的感觉inestyle='—'
:设置线的样式,-
实线(solid)、-- 短线(dashed)、-. 短点相间线(dashdot)、:虚点线(dotted)linewidth=3
:设置线的宽度marker='o'
:设置折点的样式
下面是折点的各种样式
1.设置标题
对一个图形最重要的是内容的绘制,其次就是标题,我们需要让其他人清楚这张图的含义是什么,图中x轴表示什么,y轴表示什么,这个时候我们就需要为图像添加一些标题。
%matplotlib inline
from matplotlib import pyplot as plt
x = range(1,8)
y = [17, 17, 18, 15, 11, 11, 13]
plt.plot(x, y, color='green',alpha=0.5,linestyle='-',linewidth=3,marker='*')
plt.xlabel('Time')
plt.ylabel("Temp")
plt.title('Title')
plt.show()
✨效果
🚩结果我们发现,通过plt.xlabel('Time')、plt.ylabel("Temp")、plt.title('Title')三个方法
,将x轴标题,y轴标题以及图片标题成功添加上了,这样就可以清晰明了地看出图片及每个轴的含义。
2.中文显示
相信大家在练习的时候也遇到过这样的问题,使用Matplotlib画的图居然不显示中文,那怎么能行呢
如果想要Matplotlib显示中文我们可以使用三种方法:
第一种:直接修改Matplotlib配置文件matplotlibrc
第二种:动态修改配置
第三种:设置自定义字体
我们就用第三种方法,因为自定义的字体自由度比较高,同时也方便我们在一个图中使用不同风格的字体。
plt.rcParams['font.sans-serif'] = ['SimHei'] #windows下使用这种方法
plt.rcParams['font.family'] = 'Arial Unicode MS' #mac下使用这种方法
来试一试下面的代码
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
# 创建字体对象
plt.rcParams['font.sans-serif'] = ['SimHei'] #windows下使用这种方法
y = [random.randint(10,30) for i in range(120)]
# 添加字体属性
plt.ylabel("次数")
plt.xlabel("时间")
# 设置标题
plt.title('每分钟跳动次数')
plt.plot(x,y)
plt.show()
✨效果
3.自定义X轴刻度
在写的过程中我发现2个问题:
- 刻度的文字过长,但是图片的宽度不够。
- x轴和y轴刻度会默认根据x值和y值生成,并且Matplotlib默认会生成它认为合适的刻度间距。
这些情况会导致x轴的刻度值全都重叠在一起
要想改变图像的大小,我们需要更改画布的大小来实现,matplotlib 中设置图形大小的语句如下:
plt.figure(figsize=(a, b), dpi=dpi)
其中:
- figsize 设置图形的大小,a 为图形的宽, b 为图形的高,单位为英寸
- dpi 为设置图形每英寸的点数,即每英寸多少个像素
我们将图形的宽和高分别设置为20,10英寸,分辨率设置为80后发现,x轴的重叠的效果减轻一些。但是如果我们以后遇到很长的刻度怎么办呢?
plt.figure(figsize=(20, 20),dpi=80)
展示底部图像
✨效果
那我们是不是还要继续修改宽和高呢,答案肯定是No,如果继续放大,图形会变的很大,不是我们想要的效果,所以,并不是所有的刻度问题我们都可以使用改变图片的大小来解决。
如果x轴的刻度我们能自己设置,岂不是完美了,我们可以根据自己的想法,对x轴刻度的疏密程度和刻度值进行设置。
当然有解决办法,使用plt.xticks()这个方法自定义x轴的刻度
xticks(locs, [labels], **kwargs)
locs参数为数组参数,表示x-axis的刻度线显示标注的地方,即ticks放置的地方
第二个参数也为数组参数,表示在locs数组表示的位置添加的标签。
plt.xticks(range(0,len(x),4),x[::4],rotation=45)
✨效果
range(0,len(x),4)为xticks()的第一个参数,根据x值的个数调整x轴的刻度疏密程度。
x[::4]为xticks()的第二个参数,还是使用x的值作为刻度的标签值,但是这里获取了其中的一部分,确保第一个参数和第二个参数的个数相同。
rotation=45默认刻度的值是横向书写的,这样会有一定的重叠,所以我们将文字进行旋转操作,45位旋转的度数。
4.一图多线
一个坐标系中绘制两条折线,只需要使用两次plt.plot()方法就可以了。看下面的代码。
%matplotlib inline
from matplotlib import pyplot as plt
x = range(1,8)
y = [17, 17, 18, 15, 11, 11, 13]
z=[11,4,2,6,7,1,8]
plt.plot(x, y, color='green',alpha=0.5,linestyle='-',linewidth=3,marker='*')
plt.plot(x,z)
plt.xticks(range(0,len(x),2),x[::2],rotation=0)
plt.xlabel('Time')
plt.ylabel("Temp")
plt.title('Title')
plt.show()
✨效果
一个坐标系中绘制两条折线,只需要使用两次plt.plot()方法就可以了。
但是,通过图形大家有没有发现,我们并不知道哪条线是哪条线,所以,我们应该在图像中添加对应的图例,从而标明每条线的作用是什么。
plt.legend()方法就是图形添加图例的方法
,但是这个方法比较特殊,一共需要两步才能成功的添加上图例,我们先运行下放代码,看一下图例的效果:
plt.plot(x, y, color='green',alpha=0.5,linestyle='-',label='绿色')
plt.grid(alpha=0.8)
plt.plot(x,z,label='蓝色')
plt.legend()
✨效果
细心的小伙伴会发现,结果中我们不仅添加上了图例,在图形中我们发现了很多网格。
没错,代码中添加这这样一行代码plt.grid(alpha=0.4)
,这行代码就是添加网格的效果,这里面的alpha=0.4是设置网格线的透明度,范围是(0~1)。
绘制网格的作用就是为了辅助我们更好的观察数据的x值和y值。
5.一图多个坐标系子图
调用plt.subplot()函数就可以在画布上创建一个子图,
plt.subplot(nrows, ncols, index)
函数的
nrows 参数指定将数据图区域分成多少行;
ncols 参数指定将数据图区域分成多少列;
index 参数指定获取第几个区域。
Axes1、Axes2、Axes3、Axes4分别代表四个区域。
尝试运行下面的代码
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = [1,10,14,15,16,17]
y = np.array([3,4,6,2,1,5])
plt.figure(figsize = (10,8))
# 第一个子图
# 折线图
plt.subplot(2, 2, 1)
plt.plot(y)
plt.title('Axes1')
#第二个子图
# 折线图,y轴每个数据的立方
plt.subplot(2, 2, 2)
plt.plot(y**3)
plt.title('Axes2')
#第三个子图
# 折线图,x轴和y轴均指定数据
plt.subplot(2, 2, 3)
plt.plot(x,y)
plt.title('Axes3')
plt.subplot(2, 2, 4)
plt.plot(x,y)
plt.title('Axes4')
plt.show()#当存在多个show时会重新开始一个画板
✨效果
🚩到这里相信大家对matplotlib有了一定了解,这些函数方法都不需要去死记,而是要多敲代码,时间久了自然能够信手拈来。