目录
Matplotlib介绍
线形图(折线图)
直方图
条形图
饼状图
散点图
matplotlib是一个Python 的2D绘图库,提供了一套表示和操作图以及图内部对象的函数,借助它可以绘制多种多样的数据图,如线形图、饼状图等。
Matplotlib中提供了两种绘图接口:
基于MATLAB:自动创建和管理图和坐标系,用 pyplot 中函数作图;
基于面向对象:显示创建图和坐标系,再调用对象的方法来作图。
本文介绍的绘图都是基于MATLAB的绘图接口。
Pyplot 是一个有命令风格的函数集合,和MATLAB很相似,通过调用函数不断完善绘图,最开始时图中什么都没有,需要什么就调用对应函数进行添加。pyplot 子库中的figure()用来创建图,subplot()用来创建子图。所有的操作都是在子图上进行,pyplot 表示当前子图,若没有就创建一个子图,实际应用中经常直接用pyplot调用相关函数。
Python标准库中默认不包含 matplotlib,需要自己下载安装:
命令行安装 pipinstall matplotlib (安装过程中会涉及到相关依赖包的安装,稍微有点慢)
借助于第三方软件,例如通过Anaconda进行软件的安装和包管理。
Matplotlib中的所有对象都称为Artist,大致可分为两类:
容器类:图、坐标系、坐标轴、刻度;(图中可包含若干个坐标系,坐标系中又包含多个坐标轴,坐标轴上包含多个刻度)
基础类:线、点、文本、图例、网格、标题等
Matplotlib中图的构成如图所示,(该图来源于官网),主要包括:图(figure)、坐标系(axes)、坐标轴(axis)、主刻度(Major tick)、分刻度(Minor tick)、主刻度标签(Major tick label)、分刻度标签( Minor tick label)、Y 轴标签(Y axis label)、X 轴标签(X axis label)、线(line)、点(marker)、图例(legend)、网格(grid)、标题(title)等。
注意:并不是所有图中都包含这些内容,图中默认什么都没有,需要什么调用相应的方法即可将其添加进去。Pyplot中常见的方法如下:
pyplot.figure()
num:整数或字符串,可选的,如果没有传值,则采用自增值,可通过number属性访问;如果传递整数,则会检查是否存在对应的图,存在则直接返回,否则创建新的图;如果传的是字符串,则设置为窗口的标题;
figsize:浮点型元组,可选。图的宽、高值,单位为英寸,默认为[6.4, 4.8];
dpi:整数,可选。分辨率 ,默认为100;
facecolor:背景颜色,默认为白色;
edgecolor:边框颜色,默认为白色,默认看不出效果,需要将linewidth设置为一个比较大的值才能观察到;
frameon:是否绘制边框和背景,默认为True;
FigureClass: 图对应的类;
clear: 是否清空画布,默认为False,设置为True,且图已存在时,会清空已有内容;
kwargs:其他关键字参数,例如线条宽度。
可以同时创建和显示多个图(figure)。
pyplot.subplot()
如果想在同一个图中绘制多个坐标系,可调用多次调用subplot()方法,每次在当前图中添加一个子块,返回一个坐标系对象。方法定义如下:
线形图主要是通过线条将序列中相邻的两个点进行连接而成,使用非常广泛,通过plot()函数绘制,可以指定线条的样式,点的标记以及颜色等。使用plot()方法绘制点或线等,需指定所有点的坐标,可同时绘制多条线。调用方式有如下两种:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
主要参数及其含义如下:
x:x轴坐标,可选,当没有传值时,采用默认值,值的个数与y轴坐标个数相同,从0开始不断增大;
y:y轴坐标,不可省略,通常是一个数或一维数组;
data: 通常为可检索的对象,例如字典、DataFrame等;
fmt:定义基本样式,由[颜色][点的标记][线条样式]三部分字符组成,也可通过关键字参数设置;
kwargs:关键字参数,例如:color(颜色)、marker(标记)、linestyle(线条样式)、linewidth(线条宽度)、markersize(标记大小)、label(标签,用于图例)等。
如果通过color关键字参数单独设置颜色,可使用颜色单词全称(如“green”)以及十六进制字符串(如“#aabbcc”)。
注意:三种字符顺序可打乱,也可省略部分,没指定线条样式时,将不显示线条,没指定标记则不显示点。
线形图案例
参考代码:
注意:pyplot 默认不支持中文显示,两种解决方案:
使用 rcParams['font.family']属性修改字体,此时,整个图中的字体都会改变;
在需要显示中文的地方,增加一个属性:fontproperties,此时只修饰部分地方,其他地方的字体不会跟随改变;
rcParams中关键的属性及其默认值如下:
采用中文字体时,部分字体下,负号不能正常显示,需设置 axes.unicode_minus为 False。
绘制正弦曲线、余弦曲线
思路:首先需要一系列的X轴坐标,可通过numpy中的arange()函数生成,例如从0 到 4,步长为0.02;然后借助 numpy 中的正弦、余弦函数对每个x坐标分别求值;最后根据x坐标和对应的y坐标画图。
运行效果图如下:
参考代码如下:
直方图是用一系列等宽不等高的长方形来表示数据,宽度表示数据范围的间隔,高度表示在给定间隔内数据出现的频数,矩形的高度跟落在间隔内的数据数量成正比,变化的高度形态反映了数据的分布情况。
直方图的一些效果举例:
pyplot 中使用hist() 绘制直方图,并以元组形式返回直方图的计算结果,包括各区间中元素的数量,区间的取值范围,以及具体每个区间对象。
hist (x,bins=None, range=None, density=False,weights=None, cumulative=False, bottom=None,histtype='bar', align='mid', orientation='vertical',**kwargs)
一些关键参数说明:
x:数组或者数组序列(不要求每个数组长度相同),用于存放数据;
bins: 整数、序列或字符串,整数表示等宽区间的个数,自动计算区间范围,序列则表示区间的范围,除了最后一个以外,都是包含左边不包含右边,字符串则表示对应的策略,默认为hist.bins;
range:元组,指定最小值和最大值,默认为数据中的最小值和最大值,如果bins是一个序列,则range没什么影响;
density:布尔值,可选,如果为True,则返回的是归一化的概率密度,所有区间的概率之和为1;
weight:类似于数组的值,可选,形状和 x 相同,表示每个值对应的权重,默认情况下所有数据的权重相同;
cumulative:布尔值或-1,累积求和,表示小于某个数的所有元素个数之和,随着数的增大而不断增大,如果为-1,则反转方向,表示大于某个数的所有元素个数之和,随着数量增大而不断减小;
histtype :直方图类型,'bar'(多个并列摆放), 'barstacked'(多个堆叠摆放), 'step'(生成对应的折线), 'stepfilled'(填充相关区域);
orientation: 直方图的方向,默认为垂直。
直方图案例
思路:随机生成1000个以10为中心的正态分布的数,和1000个以12为中心的正态分布的数,然后将结果取值范围划分为30个等距离的区间,然后统计各个区间上数出现的个数,最终绘制出直方图。如图所示。
参考代码如下:
条形图跟直方图类似,只不过 x 轴表示的不是数值而是类别。直方图的各矩形通常是连续排列,而条形图则是分开排列。使用 pyplot 的 bar()函数绘制的条形图。
bar(x, height, width=0.8, bottom=None, *, align='center', data=None,**kwargs)
x:x 轴的位置序列,即条形的起始位置;
height:y轴的数值序列,即条形图的高度,需展示的数据;
width:每个矩形的宽度,可选,默认为0.8;
bottom :y轴坐标的基线,默认为0;
align:对齐方式,可选,center和edge两种,默认为'center';
color:条形图的填充颜色;
edgecolor:条形图边框的颜色;
orientation:方向,vertical(垂直)、 horizontal(水平)
如果需要在一个图上显示多种条形图,可调整位置和宽度让多个条形图并列摆放,也可以堆叠摆放。
条形图案例
饼状图显示一个数据系列中各项的大小与各项总和的比例。Pyplot中绘制饼状图的函数为 pie(),主要参数如下:
x:饼图中每一块的比例,通常是一个数组。如果 sum(x) > 1 会使用归一化后的比例,即每一块除以sum(x),如果sum(x) < 1,则按照实际比例,此时有一部分为空白;
explode:指定饼图中每块离开中心的距离,通常是一个数组,默认为0;
labels:为饼图添加标签说明,类似于图例说明,标签列表;
colors:指定饼图的填充色,颜色列表;
autopct:设置饼图内每块百分比显示样式,可以使用format字符串或者格式化函数'% width. Precision f %%'指定饼图内百分比的数字显示宽度和小数的位数;
radius:设置饼图的半径;
labeldistance:每块旁边的文本标签的位置离饼的中心点的距离;
shadow:是否有阴影效果,默认为False。
案例:已知一个员工一天的活动时间分配为:工作8小时、睡觉7小时、吃饭3小时,玩乐6小时,根据这些信息,绘制该员工一天时间分配饼状图,效果如下。
参考代码如下:
散点图是以一个变量为横坐标,另一变量为纵坐标,利用散点的分布形态反映变量统计关系的一种图形,以不同颜色、不同大小的点表示数据之间的关系。Pyplot 中绘制散点图的函数为scatter(),主要参数如下:
scatter(x, y, s=None, c=None,marker=None, cmap=None,norm=None, vmin=None,vmax=None, alpha=None,**kwargs)
x:散点图中点的x轴坐标;
y:散点图中点的y轴坐标;
s:散点图点的大小,默认为20,标量或数组;
c:散点图点的颜色,默认为蓝色,标量或数组;
marker:指定散点图点的形状,默认为圆形;
cmap:颜色映射,可选,将颜色映射到已有色系,例如plt.cm.Blues;
norm:将亮度数据归一化到 0-1 之间;
vmin:亮度的最小值;
vmax:亮度的最大值;
alpha:设置散点的透明度;
编程程序,绘制散点图,要求图中的每个散点随机呈现不同的大小和颜色。效果如图所示,随机生成30个点,x轴坐标和y轴坐标都在0-10之间,颜色取值在0-30之间。大小在30-300之间。效果图如下:
代码参考如下:
更多关于手把手教你学Python的文章请关注微信公众号:手把手教你学编程。详细的视频讲解可查看 CSDN学院 里的手把手教你学Python系列视频:https://edu.csdn.net/lecturer/5686。