数据处理工具(一)——Matplotlib
致谢
1 Matplotlib
1.1 什么是Matplotlib
Matplotlib是一种专门用于开发2D图表的一种工具包,尽管它也能开发3D图表,但是我们很少会去使用他。我们通常用其来使数据可视化,其英文来源Matplotlib可以分解为三个单词:mat——matrix(矩阵),plot——plot(画图),lib——library(库)。其方法实际上和matlab一样。而之所以不使用matlab是因为它并不免费。
1.2 实现一个简单的图
import matplotlib.pyplot as plt
plt.figure()
plt.plot([1, 0, 9], [4, 5, 6])
plt.show()
- 1
- 2
- 3
- 4
- 5
1.3 Matplotlib三层结构
1.3.1 容器层
容器层主要由Canvas、Figure、Axes组成。其中Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具;Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色;而Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。
- Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率)
- Axes(坐标系):数据的绘图区域
- Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签
容器层的特点为:
一个figure(画布)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
一个axes(坐标系/绘图区)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系。
总结来说,Canvas是画板、Figure是白纸,Axes是纸上面的框架。当我们想要在白纸上面画多个图像,我们可以使用plt.subplots来分区。
1.3.2 辅助显示层
辅助显示层指的是绘图区内的除了根据数据绘制出的图像以外的内容,比如绘制风格、边框线、坐标轴、坐标名、刻度、网格线、图例、标题等。
1.3.3 图像层
在图像层中,我们可以在Axes之中使用plot、scatter、bar、histogram、pie等函数根据数据绘制出图像。
1.3 使用模块
1.3.1 画布的设置
我们从最简单的开始一步一步深入,我们想要绘制关于一周内天气的折线图。
plot方法可用于画图,其可以传入列表,当传入一个列表时,默认为y所在位置。当传入两个列表时,第一个列表为x所在位置,第二个列表为y所在位置。
import matplotlib.pyplot as plt
plt.figure()
plt.plot([1, 2, 3, 4, 5, 6, 7], [17, 17, 18, 15, 11, 11, 13])
plt.show()
- 1
- 2
- 3
- 4
- 5
如果我们要设置画布的大小和画布的分辨率,我们可以在figure的有参构造器中设置。
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(20,8),dpi = 80)
plt.plot([1, 2, 3, 4, 5, 6, 7], [17, 17, 18, 15, 11, 11, 13])
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
如果你要保存这个画布中的内容,除了可以直接右键保存图片外,还可以使用下面的方法:
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(20,8),dpi = 80)
plt.plot([1, 2, 3, 4, 5, 6, 7], [17, 17, 18, 15, 11, 11, 13])
plt.savefig("路径")
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
需要注意的是,保存图片这个方法不可以置于show方法之后,否则show方法执行时,上述的图片资源会被释放,再用savefig保存的图片是一张空白图。
1.3.2 添加网格辅助背景
如果想要添加网格背景,可以调用plt.grid方法,其方法默认关闭,如果要开启,需要手动给构造器一个True。在打开后,grid方法还拥有多种附加属性,你可以自己查看API去添加。
import matplotlib.pyplot as plt
plt.plot([3,1,4,5,2])
plt.ylabel('grade')
plt.grid(True,linestyle = '--',alpha = 0.5)
plt.show()
- 1
- 2
- 3
- 4
- 5
1.3.3 附加属性
我们这一小节来讲讲附加属性。我们首先来看一下plot的API。
Plt.plot(x,y,format_string,**kwargs)
- X:x轴数据,列表或者数组,可选。
- Y:y轴数据,列表或者数组。
- Format_string:控制曲线的格式字符串,可选
- **kwargs:第二组或更多(x,y.format_string)
对于kwargs,可以是更多附加属性,也可以是第二组列表。
更多附加属性有:
linewidth:线条宽度(可取0~10,默认1.5)
Color:控制颜色
控制颜色只需写对应的英文首字母即可
Linestyle:线条风格
Marker:标记风格(可取’o’'D’等20种,默认为None)
Markerfacecolor:标记颜色
Markersize:标记尺寸(取0~10的数值,默认为1)
线条风格有:
- "-"实线
- "–"破折线
- "-."点划线
- ":"虚线
- "“无线条
线条上的标记有:
- ","像素标记
- "o"实习圈标记
- "v"倒三角标记
- "^"上三角标记
- ">"右三角
- "<"左三角
- "1"下花三角
- "2"上花三角
- "3"左花三角
- "4"右花三角
- "s"实习方形
- "p"实心五角
- "*"星形
- "h"竖六边形
- "H"横六边形
字体有:
- SimHei:黑体
- Kaiti:楷体
- Lisu:隶书
- Fangsong:仿宋
- You yaun:幼圆
- Stsong:宋体
1.3.4 标签
我们可以为我们的折线图设置标签。
- plt.xlabel():对x轴增加文本标签
- plt.ylable():对y轴增加文本标签
- plt.title():对图形整体增加文本标签
- plt.text():对任意位置增加文本
- plt.annotate:在图形上加上带有箭头的注解
- plt.legend():添加图例
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('温度')
plt.xlabel('时间')
plt.title('某城市一周内的天气变化折线图')
plt.grid(True,linestyle = '--',alpha = 0.5)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
需要注意的是,在输入中文标签的时候,matplotlib是不支持中文的,所以输出的图像会有空白。为了解决这个问题,我们可以使用以下的方法。
第一种方法
pyplot并不默认支持中文显示,需要rcParams修改字体实现。(可以实现,但不推荐,毕竟是全局使用)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
- 1
- 2
- 3
- 4
其他属性:
Font.family:用于显示字体的名字
Font.style:字体风格,正常‘normal’或斜体‘italic’
Font.size:字体大小,整数字号或者‘large’,‘x-small’
第二种方法(实测还能用)
有中文输入的地方,增加一个属性:fontproperties
Plt.xlabel('横轴:时间',fontproperties = 'SimHei',fontsize = 20)
- 1
1.3.5 刻度
我们来看一下如何给我们的图像层加上刻度。
xticks(ticks, [labels], **kwargs)
- ticks:数组类型,用于设置X轴刻度间隔
- [labels]:数组类型,用于设置每个间隔的显示标签
- **kwargs:用于设置标签字体倾斜度和颜色等外观属性
1.3.6 一个图上多条线
我们如果想要在一个折现图中画出多条直线,我们可以再次使用plot,也可以在第一个plot传入第二组列表。
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('温度')
plt.xlabel('时间')
plt.title('一周内的天气变化折线图')
plt.grid(True,linestyle = '--',alpha = 0.5)
plt.plot([2,3,1,4,5])
plt.grid(True,linestyle = '--',alpha = 0.5)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
1.3.7 子区域
工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表盘的效果。
在画布上面创建子图有很多方法,这里有四种介绍,但是三种很容易混淆。
subplots和subplot
两个参数基本一样,但是区别就是subplots是直接创建一个画布和一个或多个子图返回,而subplot添加一个子图到当前画布,它会删除前面覆盖的子图。
如果想一次性的创建多个子图,就使用subplots函数,如果想一个一个地添加子图,就使用subplot函数,这是他们的主要区别。
在如今的开发中,subplot已经被版本淘汰了,使用起来实际上很不方便,所以这里我们就不再讲解它。
matoplotlib.pyplot.subplots(nrow = 1,ncol = 1,**fig_kw)
- 作用:创建一个带有多个axes的图
- return 画布figure 和 绘图区axes,对于不同的axes对象,采用的不再是plt.方法,而是使用axes.方法,且方法名不同
- set_xticks
- set_yticks
- set_xlabel
- set_ylabel
学完上面的知识后,让我们来试试下面的案例:
import matplotlib.pyplot as plt
import random
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
# 1 准备数据x,y
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
# 2 创建画布
figure,axes = plt.subplots(nrows = 1,ncols = 2,figsize = (20,8),dpi = 80)
# 3 绘制图像
axes[0].plot(x,y_shanghai,color = "r",linestyle = "-.",label = "上海")
axes[1].plot(x,y_beijing,color = "b",label = "北京")
# 4 显示图例
axes[0].legend()
axes[1].legend()
# 5 修改刻度
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::5],x_label[::5])
axes[0].set_yticks(range(0,40,5))
axes[1].set_xticks(x[::5],x_label[::5])
axes[1].set_yticks(range(0,40,5))
# 6 添加网格显示
plt.grid(linestyle = "--",alpha = 0.5)
# 7 添加描述信息
axes[0].set_xlabel("时间变化")
axes[0].set_ylabel("温度变化")
axes[0].set_title("上海11点到12点每分钟的温度变化状况")
axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("上海11点到12点每分钟的温度变化状况")
# 8 显示图
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
除了上面的方法,还有下面两种:
plt.subplot2grid()
plt.subplot2grid(Gridspec,Curspec,colspan = 1,rowspan = 1,**kwargs)
Matplotlib subplot2grid()函数在网格的特定位置创建轴对象提供了更大的灵活性。它还允许轴对象跨越多个行或列
shape:指定组合图的框架形状,以元组形式传递,如2*3的矩阵可以表示成(2,3)
loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0)
rowspan:指定某个子图需要跨几行
colspan:指定某个子图需要跨几列
可以用下面的例子试试手!
import matplotlib.pyplot as plt
import numpy as np
import math
# 显示中文设置...
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
a1 = plt.subplot2grid((3,3),(0,0),colspan = 2)
a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
x = np.arange(1,10)
a2.plot(x, x*x)
a2.set_title('平方')
a1.plot(x, np.exp(x))
a1.set_title('指数')
a3.plot(x, np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
Gridspec类
模块gridspec是一个可以指定画布中子区位置或者说是布局的"分区"模块。在模块gridspec中,有一个类GridSpec,他可以指定网格的几何形状。
import matplotlib.gridspec as gr
import matplotlib.pyplot as plt
gs = gr.GridSpec(3,3)
ax1 = plt.subplot(gs[0,:])
ax2 = plt.subplot(gs[1,:1])
ax3 = plt.subplot(gs[1:,-1])
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
这里ax1,ax2,ax3是选定在子区域里面的特定区间来划分,可以通过类似于列表中的切片操作来确定所选区域。
1.4 基础图表
plt不止可以利用plot方法画出折线图,实际上,他还能画出各种数学图像,如下所示:
- plt.plot(x,y,fmt,…):绘制一个坐标图
- plt.boxplot(data,notch,position):绘制一个箱型图
- plt.bar(left,height,width,bottom):绘制一个条形(柱状)图
- plt.barh(width,bottom,left,height):绘制一个横向条形图
- plt.polar(theta,r):绘制极坐标图
- plt.pie(date,explode):绘制饼图
- plt.psd(x,NFF = 256,pad_to,Fs):绘制功率谱密度图
- plt.specgram(x,NFF = 256,pad_to,F):绘制谱图
- plt.cohere(x,y,NFFT=256,Fs):绘制X-Y的相关性函数
- plt.scatter(x,y):绘制散点图,其中x和y长度相同
- plt.step(x,y,where):绘制步阶图
- plt.hist(x,bins,normed):绘制直方图
- plt.contour(x,y,z,n):绘制等值图
- plt.vlines():绘制垂直图
- plt.stem(x,y,linefmt,marterfmt):绘制柴火图
- plt.plot_date():绘制数据日p
在下面的讲解中,我们会慢慢地去了解一些常用的图表。
1.4.1 折线图
实际上前面讲到的plot方法是可以绘制各种函数图像的,但是它常用于绘制折线图。
当我们的点使用离散的值,如离散列表或离散元组,那么其画出来的是折线图;当我们的点取得非常密集的时候,折线图就会变成一条平滑的曲线,如二次函数图像的绘制我们可以采用以下的方式:
# 1 准备x,y数据
x = np.linspace(-1,1,1000)
y = 2 * x * x
# 2 创建画布
plt.figure(figsize = (20,8),dpi = 80)
# 3 绘制图像
plt.plot(x,y)
# 4 添加网格显示
plt.grid(linestyle = "--",alpha = 0.5)
# 5 显示图像
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
1.4.2 散点图
我们来看一下散点图的方法。
matplotlib.pyplot.scatter(x,y,s = None,c = None,marker = None,alpha = None)
- x,y:接受array,表示x轴和Y轴对应的数据,无默认
- s:接收数值或者一维的array,指定点的大小,若传入一维array则表示每个点的大小,默认为None
让我们来绘制一个简单的散点图吧!
import matplotlib.pyplot as plt
import numpy as np
# 1 准备x,y数据
x = np.random.randn(100)
y = np.random.randn(100)
# 2 创建画布
plt.figure(dpi = 80)
# 3 绘制图像
plt.scatter(x,y,7) #指定点的大小为7
plt.title('Scatter') #指定图像标题
# 4 展示图像
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
1.4.3 柱状图
我们来看一下柱状图的方法。
matplotlib.pyplot.bar(left , height , alpha = 1 ,width = 0.8 , bottom = none , data = none , **kwargs)
- left:x轴位置序列
- height:
- alpha:透明度
- bottom:底部柱形变量
- data:可以使用可被索引的对象数据类型
其他关键字参数如下:
- color:柱形填充颜色
- edgecolor:柱形边框颜色
- label:标签
- lw:柱形边框宽度
让我们来绘制一个简单的柱形图:
# 1 准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','降魔传']
tickets = [73853,57767,22354,15969]
# 2 创建画布
plt.figure(dpi = 80)
# 3 绘制柱状图
x_ticks = range(len(movie_names))
plt.bar(x_ticks,tickets,width = 0.5,color = ['b','r','g','y'])
# 4 修改刻度
plt.xticks(x_ticks,movie_names)
# 5 添加网格显示
plt.grid(linestyle = "--",alpha = 0.5)
# 6 加标签
plt.title("各大电影票房")
# 7 绘制图像
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
当然,如果取值为负,还能画出倒影柱状图。
1.4.4 直方图
直方图和柱状图有所区别,主要区别如下:
- 柱状图是根据数据直接得到一个数据的结果,只是比较数据的大小,直方图是根据原数据做一个频次的分布
- 直方图柱子无间隔,柱状图柱子有间隔
- 直方图描述数值变量(x轴是一条线),柱状图描述分类变量(x轴是分类变量)
- 直方图一般用来描述等距数据或等比数据,柱形图一般用来描述数据名称或顺序数据
- 通过直方图可以观察和估计哪些数据比较集中
画直方图的方法如下:
hist (x, bins = 10,range = none,density = false,weight = none,cumulative = false,bottom = none,histtype = u’bar’,align = u’mid’,orientation = u’vertical’,rwidth = none,log = false,color = none,label = none,stacked = false,** kwargs)
- x:直方图中数据,可以是n维数组或者n维数组序列,多维数组长度不要求一致
- bins:划分的组数,可以传入整数或序列或auto
- range:bins参数的边界,如果bins是第一个序列则无效,否则是(x.min(),x.max())
其他的参数就不说了,需要用再去查吧。
# 导入模块
import numpy as np
import matplotlib as plt
#电影时长分布状况
# 1 准备数据
time = [131,98,125,131,124,139,113,117,128,108]
# 2 创建画布
plt.figure(dpi = 80)
# 3 背景网格
plt.grid(linestyle = "-",alpha = 0.5)
# 4 绘制直方图
distance = 2
group_num = (max(time)-min(time))/distance
plt.hist(time)
# 5 修改刻度
plt.xticks(range(min(time),max(time),distance))
# 7 显示图像
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
1.4.5 饼图
让我们看一下饼图绘图的方法。
pie函数各类详解:
参数:
- X:指定绘图的数据
- Explode:指定饼图某些部分的突出显示,即呈现爆炸式
- Labels:为饼图添加标签说明,类似于图例说明
- Colors:指定饼图的填充色
- Autopct:自动添加百分比显示,可以采用格式化的方法显示
- Pctdistance:设置百分比标签和圆心的距离
- Shadow:是否添加饼图的阴影效果
- Labeldistance:设置各个扇形标签(图例)与圆心的距离
- Startangle:设置饼图的初始摆放角度
- Radius:设置饼图的半径大小
- Counterclock:是否让饼图按逆时针顺序呈现
- Wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等
- Textprops:设置饼图中文本的属性,如字体大小、颜色等
- Center:指定饼图的中心点位置,默认为原点
- Frame:是否要显示饼图后面的图框,如果是Ture,需要同时控制图框x轴,y轴的范围和饼图的中心位置
让我们来试一试!
import matplotlib.pyplot as plt
labels = 'Frog','Hogs','Dogs','Logs'
sizes = [15,30,45,10]
explode = (0,0.1,0,0)
plt.pie(sizes,explode = explode,labels = labels,autopct = '%1.1f%%',shadow = False,startangle = 90)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
让我们搞一个更复杂的!
import matplotlib.pyplot as plt
# 1 修正全局中文
matplotlib.rcParams['font.family']='SimHei'
# 2 传入数据
labels = u'汽车',u'火车',u'轮船',u'单车',u'自行车',u'步行'
sizes = [15,14,16,25,20,10]
# 3 指定各部分数据在饼图的颜色
color = 'r','g','y','b','w','p'
# 4 设定饼图突出部分
explode = (0,0.2,0,0,0,0)
# 5 绘制饼图
plt.pie(sizes,explode = explode,labels = labels,autopct = '%1.1f%%',shadow = True,startangle = 90)
# 6 使xy同方向延伸
plt.axis('equal')
# 7 设置标题
plt.title('你认为别人去学校采用什么方式',fontproperties = 'SimHei',fontsize = 20)
# 8 设置图例
plt.legend()
# 9 显示饼图
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
1.4.6 小结
除了以上的图形以外,其他的图就不再概述了,因为很少用到。至于如果你想进入更深入的学习,你可以进入官方文档。上面的工具应该在你平时学习其他有关于数据的东西时应不停地使用它,以免遗忘。你要明确的一点是:这一讲讲的是工具,而不是什么理论。
文章来源: blog.csdn.net,作者:ArimaMisaki,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chengyuhaomei520/article/details/123351087
- 点赞
- 收藏
- 关注作者
评论(0)