版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章可视化分析目录contents从数据到图形面向对象的绘图模式实例:人口金字塔可视化分析实例:电商数据可视化分析实例:气象数据可视化分析Matplotlib大数据和人工智能时代,数据科学一项重要的任务是对海量的数据进行直观地描述、总结和表示。相比文本数据,图表数据可以更加清晰、高效地展示数据的信息。在很多情况下,执行数据分析的第一步便是对数据进行可视化分析,并从中获得数据的异常值、必要的数据转换、模型设计的洞察等信息。Matplotlib是Python社区中应用最广泛的可视化库,其基于NumPy的数组绘制出版级别的可视化图形(包括二维图像和三维图形),并可与Scipy,Pandas等第三方库联合使用。随着Python的流行,Matplotlib衍射出了诸如Seaborn,ggplot等高级封装的数据可视化库,这些库都使用Matplotlib作为底层进行绘图。本章将讲解Matplotlib的基本功能,并介绍基于Matplotlib的数据可视化分析任务处理。Matplotlib库包含有pylab和pyplot两类接口。在最初时,Matplotlib的设计与MATLAB高度类似,并因此产生了pylab模块,其旨在模仿MATLAB的全局风格。然而,pylab的使用会影响Python的内置函数并可能导致难以跟踪的错误污染命名空间,如今Matplotlib官方已放弃pylab并明确建议不使用该模块。为此,在任何情况下都应该使用pyplot模块。Matplotlib可以通过conda或者pip命令进行安装,在安装完成后,通常以如下方式进行引用>>>importmatplotlib.pyplotasplt从数据到图形01基础图形下面通过一个图形案例来熟悉Matplotlib中pyolot的基础功能。在以下的例子中,将绘制正弦曲线的图形,其思路为首先使用NumPy生成包含[0,4π]之间的等距分割的200个点的一维数组,计算出其对应的正弦值,再基于这两个数组使用pyplot生成如图所示的图形。>>>x=np.linspace(0,4*np.pi,200)#生成正弦曲线上的点的横轴坐标>>>y=np.sin(x)#计算正弦曲线上的点的纵轴坐标>>>plt.plot(x,y)#绘制正弦曲线图形>>>plt.show()#将生成的图形展示plot()函数matplotlib.pyplot.plot(x,y,fmt,data,**kwargs)其中x,y是标量或“array-like”的对象,作为数据点的横轴、纵轴坐标,当“x”没有明确给定时,其默认为等于range(len(y));“fmt”为格式字符串,不是必须项,用于对绘制图形的样式属性进行快速设置。其格式为“[标记(marker)][线条(line)][颜色(color)]”,这三项的每一项都是可选的且不需明确按上述的顺序。如“bo”中没有给定线条参数,代表蓝色圆圈的标记但不绘制线条。表7-1至表7-3给出了每项格式字符串参数常用的取值,这些属性也可以通过关键字参数进行设定;“data”是可索引对象,不是必须项,其为有标签数据的对象(如字典对象),用于提供参数中的数据。格式字符串fmt中标记样式的常用符号符号描述符号描述'.'点标记'*'星号标记','像素标记'h'垂直六边形标记'o'圆标记'H'水平六边形标记'v'下三角标记'+'加号标记'^'上三角标记'P'实心加号标记'<'左三角标记'x'叉号标记'>'右三角标记'X'实心加号标记'8'八角形标记'D'菱形标记's'正方形标记'|'垂直线标记'p'五边形标记'_'水平线标记格式字符串fmt中线条样式的常用取值符号描述'-'实线样式'--'破折线样式'-.'点划线样式':'点虚线样式格式字符串fmt中颜色的常用取值符号描述符号描述'b'蓝色(Blue)'m'品红色(magenta)'g'绿色(Green)'y'黄色(Yellow)'r'红色(Red)'k'黑色(Black)'c'青色(Cyan)'w'白色(White)Matplotlib展现图像绘制正弦曲线图形代码的最后一行是将结果进行展现供可视化分析。Matplotlib展现图像的方式可以分为三种情况:1.在脚本文件(.py)中:需要调用plt.show()函数,该函数会启动事件循环,查找所有当前活动的图形对象,并打开显示图形交互的窗口。2.在IPython笔记本(如JupyterNotebook)中:在内核中运行%matplotlibinline后,创建绘图的单元格都将嵌入所得图形的PNG图像,而无需调用plt.show()函数。3.在IPythonshell中:在启动后输入%matplotlib魔术命令后,任何pyplot的绘图命令都会打开一个图形窗口,可以运行更多命令来更新绘制窗口,而无需调用plt.show()函数。多组数据绘制1.多次调用plt.plot()函数:此方法最为直接且最为常用。如下列代码所示,正弦曲线使用绿色实现绘制,余弦曲线使用红色虚线绘制。值得注意的是当有多项数据时,可以使用关键字参数“label=”明确每个数据对应的图像名称,并利用plt.legend()函数将图例进行显示,以便在分析时更好地认识数据结构。>>>x=np.linspace(0,4*np.pi,200)#生成横轴坐标>>>y_sin=np.sin(x)#生成正弦曲线的纵轴坐标>>>y_cos=np.cos(x)#生成余弦曲线的纵轴坐标>>>plt.plot(x,y_sin,'g-',label='sin(x)')#绘制正弦曲线图形为绿色实线>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#绘制余弦曲线图形为红色虚线>>>plt.legend()#显示图例>>>plt.show()多组数据绘制在同一个plt.plot()指定多组x,y和fmt参数:此类方法只需要调用一次plt.plot()函数,但需在函数内部输入每组(x,y,fmt)的数据。使用此种方法需要注意无法在plt.plot()函数中制定多个标签,故需要将标签信息移动到图例展示的函数plt.legend()中,具体代码如下所示>>>x=np.linspace(0,4*np.pi,200)#生成横轴坐标>>>y_sin=np.sin(x)#生成正弦曲线的纵轴坐标>>>y_cos=np.cos(x)#生成余弦曲线的纵轴坐标>>>plt.plot(x,y_sin,'g-',x,y_cos,'r-.')#同时绘制正弦曲线和余弦曲线图形>>>plt.legend(['sinx','cosx'])#显示图例,并在图例中明确正弦和余弦曲线的标签图像设置通常完整的绘图图形还包括标题,轴标签等信息,分别可以通过pyplot中的title()、xlabel()、ylabel()等函数进行设置。同时在数据分析时常运用到网格线进行辅助观察,这可以通过pyplot中的gird()函数设置。下列代码将正弦与曲线图形的横纵轴分别标记为x轴和y轴,设置图形标题为“正弦与余弦曲线”,并设置横纵轴的网格线>>>x=np.linspace(0,4*np.pi,200)#生成横轴坐标>>>y_sin=np.sin(x)#生成正弦曲线的纵轴坐标>>>y_cos=np.cos(x)#生成余弦曲线的纵轴坐标>>>plt.plot(x,y_sin,'g-',label='sin(x)')#绘制正弦曲线图形为绿色实线>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#绘制余弦曲线图形为红色虚线>>>plt.legend()#显示图例>>>plt.xlabel('x')#设置x轴标签为“x”>>>plt.ylabel('y')#设置y轴标签为“y”>>>plt.title('GraphsofSineandCosineCruves')#设置标题>>>plt.grid()#设置网格线>>>plt.show()中文支持在Matplotlib中,默认的字体是不支持中文格式的,因此如果在上述代码直接将标题和轴坐标设置为中文将会出现中文乱码。若需要在图像中显示中文字符,有两种方式:1.修改配置文件:Matplotlib从配置文件matplotlibrc中读取相关配置信息,比如字体、样式等,因此可修改此配置文件中的字体为支持中文字体的样式。此方法虽然可以在当前本地终端正确显示中文,但在新的终端上运行代码依然存在乱码问题,且不同操作系统的配置文件修改方法亦不尽相同。2.在代码中动态设置:直接在Python代码中动态设置字体信息,此方法方便灵活,亦避免了修改配置文件。如下列代码所示,需要注意的是更改字体后会导致负号符号的显示异常,故还需对符号进行配置。同时这种方式仅针对当前的脚本或内核,重新启动内核或运行脚本需重新运行这段代码。>>>plt.rcParams['font.family']='SimHei'#指定默认字体为黑体>>>plt.rcParams['axes.unicode_minus']=False#解决负号负号异常问题>>>plt.rcParams['font.family']='SimHei'#指定默认字体为黑体>>>plt.rcParams['axes.unicode_minus']=False#解决负号负号异常问题中文支持>>>plt.rcParams['font.family']='SimHei'#指定默认字体为黑体>>>plt.rcParams['axes.unicode_minus']=False#解决负号负号异常问题>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>plt.plot(x,y_sin,'g-',label='正弦曲线')#设置中文图例标签>>>plt.plot(x,y_cos,'r-.',label='余弦曲线')#设置中文图例标签>>>plt.xlabel('x轴')#设置中文x轴标签>>>plt.ylabel('y轴')#设置中文y轴标签>>>plt.title('正弦与余弦曲线图形')#设置中文标题>>>plt.grid()>>>plt.legend()>>>plt.show()图像保存在完成图形的绘制后,有时需要将其保存供后续查看分析,为此可以将plt.show()更改为plt.savefig()函数。该函数将当前图形画布按指定方式保存,其接收的第一个参数为需保存为的文件名,同时可以利用“dpi=”关键字参数设置保存图像的分辨率,“transparent=”关键字参数设置背景是否设置为透明等。如下行代码表示将当前图形命名为“graph.jpeg”文件存储在工作目录下,并将存储图形的分辨率设置为300dpi,背景设置为透明。需要注意的是当使用plt.show()后,当前工作画布会被清除,因此需要保存的图形不建议调用plt.show()函数。#存储当前画布的图形>>>plt.savefig('graph.jpeg',dpi=300,transparent=True)统计图函数描述函数描述scatter(x,y)散点图hist(x)直方图bar(x,height)垂直柱状图boxplot(X)箱形图barh(y,width)水平柱状图errorbar(x,y,yerr,xerr)误差线图stem(x,y)火柴杆图pie(x)饼图step(x,y)阶梯图polar(theta,r)极坐标图散点图在统计分析,尤其是回归分析领域,常用到散点图来直观地显示数据变量的分布情况,从而判断数据之间是否存在某种关联或总结分布模式。在pyplot中可以使用scatter()函数绘制散点图 matplotlib.pyplot.scatter(x,y,s=None,c=None,data,**kwargs)>>>np.random.seed(42)#随机数生成器种子>>>N=30#散点数量>>>data={'a':np.arange(N),#随机生成散点横坐标
'c':np.random.randint(0,N,N),#随机生成散点颜色
'd':np.random.randn(N)}#随机生成散点大小序列>>>data['b']=data['a']+70*np.random.randn(N)#散点纵坐标>>>data['d']=np.abs(data['d'])*500#散点大小幅度>>>plt.scatter('a','b',c='c',s='d',data=data)#绘制散点图>>>plt.xlabel('XAxis')>>>plt.ylabel('YAxis')>>>plt.grid()>>>plt.show()垂直柱状图在pyplot中可以使用bar()函数绘制垂直柱状图 matplotlib.pyplot.bar(x,height,width=0.8,**kwargs)>>>plt.rcParams['font.family']='SimHei'#设置中文字体>>>x=['黄焖鸡','鱼香肉丝','水煮肉片','梅菜扣肉','糖醋里脊']#套餐类别>>>height=[25,41,25,36,19]#套餐销量>>>plt.bar((x,height,width=0.6))#绘制垂直柱状图>>>plt.xlabel('套餐名称')>>>plt.ylabel('销量(份)')>>>plt.title('午餐套餐销量垂直柱状图')>>>plt.show()水平柱状图在pyplot中可以使用bar()函数绘制垂直柱状图 matplotlib.pyplot.bar(y,width,height=0.8,**kwargs)>>>plt.rcParams['font.family']='SimHei'>>>y=['黄焖鸡','鱼香肉丝','水煮肉片','梅菜扣肉','糖醋里脊']>>>width=[25,41,25,36,19]>>>plt.barh(y,width,height=0.6)#绘制水平柱状图>>>plt.xlabel('套餐名称')>>>plt.ylabel('销量(份)')>>>plt.title('午餐套餐销量水平柱状图')>>>plt.show()直方图不同于柱状图,直方图是一种可视化在连续间隔,或者是特定时间段内数据分布情况的图形。其描述数据的频次分布,并能够直观显示数据的众数、中位数、缺失值与异常值等统计信息。在pyplot中可以使用hist()函数绘制垂直柱状图,其语法格式如下 matplotlib.pyplot.hist(x,**kwargs)>>>x1=np.random.normal(0,2,1100)#生成正态分布数据>>>x2=np.random.normal(-5,1,900)#生成正态分布数据>>>x3=np.random.normal(4,1,700)#生成正态分布数据>>>kwargs={'bins':30,'alpha':0.5}#将关键字参数保存至字典中>>>plt.hist(x1,**kwargs)#绘制直方图>>>plt.hist(x2,**kwargs)#绘制直方图>>>plt.hist(x3,**kwargs)#绘制直方图>>>plt.xlabel('Data')>>>plt.ylabel('Amount')>>>plt.show()饼图饼图是一种划分为几个扇形的圆形图标,常用来可视化描述数量、频率或百分比之间的相对关系。在pyplot中可以使用pie()函数绘制饼图,其语法格式如下 matplotlib.pyplot.hist(x,**kwargs)>>>plt.rcParams['font.family']='SimHei'>>>x=[25,41,25,36,19]>>>labels=['黄焖鸡','鱼香肉丝','水煮肉片','梅菜扣肉','糖醋里脊']>>>explode=(0,0,0,0,0.15)#设置分离显示的扇形>>>plt.pie(x,explode,labels,autopct='%1.1f%%')#绘制饼图>>>plt.title('午餐套餐销量水平柱状图')>>>plt.show()极坐标图极坐标图是使用值和角度来将信息显示为极坐标的圆形图,当数据点之间的关系可以根据半径和角度可视化时,它非常实用。其常用用于科学计算的分析,同时也可以绘制雷达图等可视化图形。在pyplot中,既可以在plot()函数中设置极坐标,也可以直接使用polar()函数绘制垂直柱状图,其语法格式如下
matplotlib.pyplot.polar(theta,r,**kwargs)>>>rad=np.arange(0,2*np.pi,0.01)#生成数据>>>foriinrad:...r=i...plt.polar(i,r,'g.')#绘制极坐标图>>>plt.show()数组绘制在Matplotlib中,若要显示二维数组或特定的三维数组,可以使用pyplot中的imshow()函数,其通常用于图像的绘制与显示。语法格式如下:matplotlib.pyplot.imshow(x,cmap=None,norm=None,**kwargs)其中,x为“array-like”的对象或者PIL图像,其支持的形状有:1.(M,N):标量数据的图像,M和N分别定义了图像的行和列,图像的值通过‘norm’和‘cmap’的参数设置转化为颜色;2.(M,N,3):RGB值的图像,M和N分别定义了图像的行和列,支持0-1的浮点数或0-255的整数,超出范围的值将被裁剪;3.(M,N,4):RGBA值的图像,M和N分别定义了图像的行和列,其中第4维度(即A维度)为透明度,超出范围的值将被裁剪。cmap为字符串或“Colormap”对象,用于将标量数据映射到色彩空间,对于RGB(A)格式的数据,此参数将被忽略;norm用来将数据标量映射至色彩空间前将数据缩放至[0,1]之间的范围,默认采取线性缩放,对于RGB(A)格式的数据,此参数将被忽略;imshow()还有丰富的关键字参数用来控制图像显示的效果,读者可自行查阅Matplotlib官方文档。以下通过几个案例阐述imshow()函数的用法:条形码图绘制条形码是典型的二维单色图像,下列代码首先将定义一维的NumPy数组,其中“0”代表白色,“1”代表黑色,接着设置图像画布大小,随后利用imshow()函数绘制条形码图,这里“aspect=”关键字需要设置成“auto”,该参数代表轴的横纵比,当设置为“auto”时,轴域的长度保持固定并调整横纵比以适应图形>>>code=np.array([1,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,0,1,1,1,0,0,1,0,0,0,1,1,0,1,1,1])>>>pixel_per_bar=4#单个条码的像素>>>dpi=100>>>plt.figure(figsize=(len(code)*pixel_per_bar/dpi,2))#设置画布>>>plt.imshow(code.reshape(1,-1),cmap='binary',aspect='auto')#绘制条形码>>>plt.axis('off')>>>plt.show()分类热力图绘制分类热力图通常用来直观显示两组分类变量之间的强度分布关系。下列代码用于绘制某村各家户作物收成的热力图。>>>plt.rcParams['font.family']='SimHei'>>>vegetables=["黄瓜","番茄","生菜","芦笋","马铃薯","小麦","大麦"]>>>farmers=["老王家","老李家.","老孙家","老谢家","老刘家","小亮家","大庆家"]>>>harvest=np.array([[0.8,2.4,2.5,3.9,0.0,4.0,0.0],[2.4,0.0,4.0,1.0,2.7,0.0,0.0],[1.1,2.4,0.8,4.3,1.9,4.4,0.0],[0.6,0.0,0.3,0.0,3.1,0.0,0.0],[0.7,1.7,0.6,2.6,2.2,6.2,0.0],[1.3,1.2,0.0,0.0,0.0,3.2,5.1],[0.1,2.0,0.0,1.4,0.0,1.9,6.3]])>>>plt.imshow(harvest)#绘制热力图>>>plt.xticks(np.arange(len(farmers)),labels=farmers,rotation=45)>>>plt.yticks(np.arange(len(vegetables)),labels=vegetables)#给每个单元增加文字注释>>>foriinrange(len(vegetables)):forjinrange(len(farmers)):text=plt.text(j,i,harvest[i,j],ha="center",va="center",color="w")>>>plt.title("各家户作物收成(吨/年)")>>>plt.colorbar()#显示色阶的颜色栏>>>plt.show()图像显示imshow()另一个常用的功能是用来显示图片,下列代码首先利用pyplot中的imread()函数读取目录下的“Panda.jpg”图片为NumPy数组,使用imshow()函数将数组显示为图片>>>img=plt.imread('Panda.jpg')#将图像读取为NumPy数组#type(img):numpy.ndarray#img.shape:(480,720,3)>>>plt.imshow(img)#将数组显示为图像>>>plt.show()面向对象的绘图模式02图形对象在Matplotlib中,每个绘图中都有一个树状结构的Matplotlib对象。具体来说,最外层容器为画布(Figure)对象,其可以包含一个或多个轴域(Axes)对象;每个轴域(Axes)代表一个实际的绘图单元,其层次结构的下方是如刻度线、坐标轴、图例、线条、文字等绘图中的基础类对象。整体的层次结构如图7-14所示,而这其中每一个元素都是可以独立控制的Python对象。创建步骤1.创建画布(Figure)实例2.在画布(Figure)上创建轴域(Axes)实例3.在每个轴域(Axes)中添加基础类对象面向对象的模式绘图下列代码以面向对象的模式绘制正弦曲线图形。首先创建画布实例为fig,随后在fig上使用add_axes()方法构建轴域实例ax,并设置轴域起点在画布的左下角,宽度和高度与画布的相等,最后在ax上进行图形绘制和样式设置>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y=np.sin(x)>>>fig=plt.figure(dpi=300)#创建画布实例fig>>>fig.tight_layout()>>>ax=fig.add_axes([0,0,1,1])#在画布上添加轴域实例ax>>>ax.plot(x,y)#在轴域中绘图>>>ax.set(xlabel='x轴',ylabel='y轴',title='正弦曲线图形')#设置轴域>>>plt.show()子图绘制在进行可视化分析时,并排比较不同的数据视图有时会对分析起到较大的帮助,为此,可以利用Matplotlib中的子图,即在单个画布中划分不同的轴域,并在每个单独的轴域上绘制不同的图形。常用的子图绘制有subplot()和subplots()两种常用的方法。基于subplot()的子图绘制>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>plt.subplot(2,1,1)#设置索引为1的子图>>>plt.plot(x,y_sin)#绘制正弦曲线>>>plt.grid()>>>plt.title('正弦曲线图形')>>>plt.subplot(2,1,2)#设置索引为2的子图>>>plt.plot(x,y_cos)#绘制余弦曲线>>>plt.title('余弦曲线图形')>>>plt.grid()>>>plt.tight_layout()>>>plt.show()基于subplots()的子图绘制>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>y_tan=np.tan(x)#2行2列4个子图,同列共用横轴>>>fig,ax=plt.subplots(2,2,sharex='col')>>>fig.tight_layout()#第一个子图绘制>>>ax[0,0].plot(x,x)>>>ax[0,0].set_title('自变量值')>>>ax[0,0].grid()#第二个子图绘制>>>ax[0,1].plot(x,y_sin)>>>ax[0,1].set_title('正弦曲线图形')>>>ax[0,1].grid()#第三个子图绘制>>>ax[1,0].plot(x,y_cos)>>>ax[1,0].set_title('余弦曲线图形')>>>ax[1,0].grid()#第四个子图绘制>>>ax[1,1].plot(x,y_tan)>>>ax[1,1].set_title('正切曲线图形')>>>ax[1,1].grid()>>>plt.show()文字注释在可视化分析的过程中,很多情况需要对图表中的信息进行文字标识和注解,以求更完整地描述图形。在之前的章节中已运用了标题、轴标签、图例等形式注释图形,当需要更细致的文字注释时,可以运用到text()和annotate()等函数text()函数>>>fig,ax=plt.subplots(2,2)>>>foriinrange(2):...forjinrange(2):...ax[i,j].text(0.5,0.5,str((i,j)),fontsize=25,ha='center')...ax[i,j].set_xticks([])#隐藏x轴刻度标签...ax[i,j].set_yticks([])#隐藏y轴刻度标签>>>plt.show()annotate()函数>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>fig,ax=plt.subplots()>>>fig.tight_layout()>>>ax.plot(x,y_sin)>>>ax.annotate('最高点',(0.5*np.pi,1),(4,0.5),fontsize=15,bbox=dict(boxstyle="round",fc="none",arrowprops=dict(arrowstyle="->"))>>>ax.annotate('最低点',(1.5*np.pi,-1),(8,-1),fontsize=15,arrowprops=dict(arrowstyle='fancy'))>>>plt.show()实例:人口金字塔可视化分析03问题分析在对某地人口进行分析时,人口金字塔是一项十分重要的可视化分析工具。其按男女人口年龄自然顺序自下而上在纵轴左右画成并列的横条柱,各条柱代表各个年龄组,用于表现某时间点上的年龄直方图,能够直观地反映当地人口数据、老龄化程度、生育年龄人口、人口抚养比、未来的出生率和死亡率等关键数据,是各类涉及人口发展或规划的基础。在本节中,将读取某地的人口数据,采用可视化手段对其分析,并构建人口金字塔图形。数据导入和风格设置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.style.use('seaborn-whitegrid')#风格设置>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False人口数据提取使用np.loadtext()函数将数据导入为NumPy数组以便后续分析。在导入时需跳过第一行表头的数据。导入后使用索引将代表男性和女性的年龄人口数据分别赋值给两个新变量。实际上,使用Pandas(PythonDataAnalysisLibrary)库可以对csv格式的数据进行更便捷的读取,后续的章节将对Pandas的使用方法进行介绍。>>>np.set_printoptions(suppress=True)#设置不使用科学计数法#导入数据>>>data_2020=np.loadtxt("Population2020.csv",delimiter=",",skiprows=1,usecols=(1,2))>>>male_2020=data_2020[:,0]>>>female_2020=data_2020[:,1]人口数据提取由于年龄段以5岁为间隔,可以使用列表生成式快速地生成包含年龄段字符串的列表,赋值给age变量,对于末尾的“大于100岁”,使用列表的append()方法进行添加>>>age=['{}至{}岁'.format(5*i,5*(i+1)-1)foriinrange(20)]>>>age.append('大于100岁')>>>print(age)['0至4岁','5至9岁','10至14岁','15至19岁','20至24岁','25至29岁','30至34岁','35至39岁','40至44岁','45至49岁','50至54岁','55至59岁','60至64岁','65至69岁','70至74岁','75至79岁','80至84岁','85至89岁','90至94岁','95至99岁','大于100岁']人口数据提取下一步,计算每个年龄段、每个性别的人口数量占总人口的百分比。首先计算人口总数,使用NumPy数组的广播功能可以快速地计算百分比,如下列代码所示#计算人口总数>>>sum_pop_2020=np.sum(data_2020)#计算男性占比>>>male_2020_pct=male_2020/sum_pop_2020#计算女性占比>>>female_2020_pct=female_2020/sum_pop_2020>>>str_male_2020_pct=','.join(str('{:.2}%').format(i*100)foriinmale_2020_pct).split(',')>>>str_female_2020_pct=','.join(str('{:.2}%').format(i*100)foriinfemale_2020_pct).split(',')人口数据提取接下来可以使用print()函数对现有数据进行解读,以女性数据为例>>>print('2020年女性数据:')...fori,vinenumerate(age):...print('{}占总人口的{}'.format(v,str_female_2020_pct[i]))2020年女性数据:0至4岁占总人口的2.7%5至9岁占总人口的2.8%10至14岁占总人口的2.7%15至19岁占总人口的2.7%20至24岁占总人口的2.8%25至29岁占总人口的3.2%30至34岁占总人口的4.3%35至39岁占总人口的3.4%40至44岁占总人口的3.3%45至49岁占总人口的4.1%50至54岁占总人口的4.2%55至59岁占总人口的3.4%60至64岁占总人口的2.7%65至69岁占总人口的2.6%70至74岁占总人口的1.6%75至79岁占总人口的1.0%80至84岁占总人口的0.65%85至89岁占总人口的0.33%90至94岁占总人口的0.11%95至99岁占总人口的0.025%大于100岁占总人口的0.0043%可视化人口数据以女性数据为例,进行饼图的绘制,下列代码绘首先将画布尺寸设置为宽和高分别为7英寸,使用plt.pie()函数将2020年女性年龄人口数据绘制为饼图,其中注释采用之前定义的f_pct函数来隐藏百分比占比在1%以下的数据,并确定注释颜色为白色,在饼图右侧绘制图例>>>f_pct=lambdapct:('{:.2f}%'.format(pct))ifpct>1else''>>>plt.figure(figsize=(7,7))>>>plt.pie(female_2020,autopct=f_pct,textprops=dict(color="w"))>>>plt.legend(age,title="年龄段",loc="centerleft",bbox_to_anchor=(1,0,0.5,1))>>>plt.title('2020年女性年龄分布饼图')>>>plt.show()可视化人口数据饼图虽然能展示出数据的结构信息,但在数据比较时却不够直观。另一种常用于针对数据分布情况的可视化分析工具是柱状图。下列代码首先制定一行二列包含二幅子图的画布,尺寸为宽20英尺、高7英尺。第一幅子图绘制男性数据的柱状图,第二幅子图绘制女性数据的柱状图,并使用ax.set()函数对每幅子图的轴标签、刻度标签进行调整。每幅子图的横轴代表年龄段、纵轴代表人口数,由于图形的限制,还需要调整横轴的轴标签旋转90度以避免混叠>>>fig,ax=plt.subplots(1,2,figsize=(20,7))>>>ax[0].bar(age,male_2020)>>>ax[0].set(xlabel='年龄段',ylabel='人口数',title='2020年男性年龄分布柱状图',yticks=[0,10000000,20000000,30000000,40000000,50000000,60000000,70000000],yticklabels=['0',r'$1\times10^7$',r'$2\times10^7$',r'$3\times10^7$',r'$4\times10^7$',r'$5\times10^7$',r'$6\times10^7$',r'$7\times10^7$'])>>>ax[0].tick_params(axis='x',labelrotation=90)#旋转横轴标签90度>>>ax[1].bar(age,female_2020,color='#CC6699')>>>ax[1].set(xlabel='年龄段',ylabel='人口数',title='2020年女性年龄分布柱状图',yticks=[0,10000000,20000000,30000000,40000000,50000000,60000000,70000000],yticklabels=['0',r'$1\times10^7$',r'$2\times10^7$',r'$3\times10^7$',r'$4\times10^7$',r'$5\times10^7$',r'$6\times10^7$',r'$7\times10^7$'])>>>ax[1].tick_params(axis='x',labelrotation=90)#旋转横轴标签90度>>>plt.show()人口金字塔前一节提到,使用柱状图可以较直观的阐述数据中各个类别之间的关系,但无法较好地结合年龄与性别的数据。为此,可采取人口金字塔的方式进行可视化分析。人口金字塔又被称为“性别—年龄金字塔”,其按照年龄和性别划分某阶段某一地区的人口,其由连续堆叠的水平直方图构成,每个条的大小可以显示为总人口的百分比或人口数字,在大部分情况下男性数据分布在左侧而女性数据分布在右侧。人口金字塔经可以清晰地可视化人口性别和年龄分布,从而推导出地区人口依赖性、生育水平、人口抚养比等关键指标,能为人口发展政策的制定提供有效的支撑。通常来说,人口金字塔可分为扩张型、稳定型和缩减型三种类型:1.扩张型:年轻人口比重较大,从最低年龄段到最高年龄段依次逐渐缩小,人口金字塔的塔形下宽上尖,这类地区有较好的人口增长快速。2.稳定型。除最老年龄组外,其余各年龄段大致相差不多,扩大或缩小均不明显,人口金字塔的塔形较直,这类地区出生人数和死亡人数大致平衡,人口保持稳定。3.缩减型。年轻人口有规则的逐渐缩小,中年以上各年龄段比重较大,人口金字塔的塔形下窄上宽,这类地区死亡率较低,但出生率也较低,可能出现高抚养比。人口金字塔绘制>>>fig,ax=plt.subplots(figsize=(17,12))>>>fig.tight_layout()>>>bar_male=ax.barh(age,-male_2020,label='男',color='#6699FF')>>>bar_female=ax.barh(age,female_2020,label='女',color='#CC6699')>>>ax.bar_label(bar_male,labels=str_male_2020_pct,size=16,label_type='edge',padding=5)>>>ax.bar_label(bar_female,labels=str_female_2020_pct,size=16,label_type='edge',padding=5)>>>ax.legend(prop={'size':20})>>>ax.set_xticks([-60000000,-40000000,-20000000,0,20000000,40000000,60000000])>>>ax.set_xticklabels([r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$','0',r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$'],fontsize=16)>>>ax.set_yticklabels(age,fontsize=16)>>>ax.set_ylabel('年龄段',fontsize=16)>>>ax.set_xlabel('人数',fontsize=16)>>>ax.set_title('2020年人口金字塔',fontsize=25)>>>plt.show()实例:电商数据可视化分析04问题分析随着互联网的蓬勃发展,在线购物平台使全国乃至全世界各地的人在同一平台上浏览、购买和销售数据成为可能。为用户提供良好的用户体验并提升用户满意度是在线购物平台最首要的任务,这需要对用户进行合理且确切的分析,了解用户群及其偏好,为用户提供个性化的服务。在本节中,将读取某电商公司的销售与用户信息数据,采用可视化手段对其进行多维度的分析,以挖掘有价值的信息。数据导入和风格设置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False电商数据提取该数据集一共由8项特征组成,本案例中需要用“商品编号”、“性别”、“年龄”、“职业类型”、“购买金额”共5项特征用于可视化分析。使用np.loadtext()将每项特征导入为NumPy数组供后续分析使用,导入时需跳过第一行表头内容,并注意特征数据的格式:前3项特征的数据格式为字符串,后2项特征的数据格式为浮点数。#商品编号数据>>>product_id=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(2),dtype=np.str_,encoding='utf_8_sig')#性别数据>>>gender=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(3),dtype=np.str_,encoding='utf_8_sig')#年龄数据>>>age=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(4),dtype=np.str_,encoding='utf_8_sig')#职业类型数据>>>occupation=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(5),encoding='utf_8_sig')#购买金额数据>>>purchase=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(8),encoding='utf_8_sig')销售量与销售额前十位的商品>>>defgroupby(x):...x_uniques=np.unique(x)...return{xi:np.where(x==xi)forxiinx_uniques}#根据商品编号分组>>>id_index=groupby(product_id)#计算每种商品编号的销售总额并按降序排序>>>purchase_group={key:purchase[id_index[key]].sum()forkeyinid_index.keys()}>>>sorted_purchase=sorted(purchase_group.items(),key=lambdakv:(kv[1],kv[0]),reverse=True)>>>purchase_top_label=[i[0]foriinsorted_purchase[:10]]>>>purchase_top_data=[i[1]foriinsorted_purchase[:10]]#计算每种商品编号的数量并按降序排序>>>product_group={key:id_index[key][0].shape[0]forkeyinid_index.keys()}>>>sorted_product=sorted(product_group.items(),key=lambdakv:(kv[1],kv[0]),reverse=True)>>>purchase_count_top_label=[i[0]foriinsorted_product[:10]]>>>purchase_count_top_data=[i[1]foriinsorted_product[:10]]#对销售额和销售量前十位的商品进行可视化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(purchase_top_label,purchase_top_data,'co-')>>>ax[0].grid()>>>ax[0].set_xlabel('商品编号')>>>ax[0].set_ylabel('商品销售额')>>>ax[0].set_title('销售额前十位的商品',fontsize='20')>>>ax[1].plot(purchase_count_top_label,purchase_count_top_data,'yo-')>>>ax[1].grid()>>>ax[1].set_xlabel('商品编号')>>>ax[1].set_ylabel('商品销售量')>>>ax[1].set_title('销售量前十位的商品',fontsize='20')>>>plt.show()销售量与销售额后十位的商品#销售额后十位的商品>>>purchase_last_label=[i[0]foriinsorted_purchase[-10:]]>>>purchase_last_data=[i[1]foriinsorted_purchase[-10:]]#销售量后十位的商品>>>purchase_count_last_label=[i[0]foriinsorted_product[-10:]]>>>purchase_count_last_data=[i[1]foriinsorted_product[-10:]]#对销售额和销售量后十位的商品进行可视化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(purchase_last_label,purchase_last_data,'co-')>>>ax[0].grid()>>>ax[0].set_xlabel('商品编号')>>>ax[0].set_ylabel('商品销售额')>>>ax[0].set_title('销售额后十位的商品',fontsize='20')>>>ax[1].plot(purchase_count_last_label,purchase_count_last_data,'yo-')>>>ax[1].grid()>>>ax[1].set_xlabel('商品编号')>>>ax[1].set_ylabel('商品销售量')>>>ax[1].set_title('销售量后十位的商品',fontsize='20')>>>plt.show()各年龄段消费水平统计图#根据年龄分组>>>age_index=groupby(age)#计算消费者中每个年龄段消费额的平均值>>>ages_purchase_mean={key:purchase[age_index[key]].mean()forkeyinage_index.keys()}>>>ages_purchase_mean_label=[iforiinages_purchase_mean.keys()]>>>ages_purchase_mean_data=[iforiinages_purchase_mean.values()]#计算消费者中每个年龄的总消费额>>>ages_purchase_sum={key:purchase[age_index[key]].sum()forkeyinage_index.keys()}>>>ages_purchase_sum_label=[iforiinages_purchase_sum.keys()]>>>ages_purchase_sum_data=[iforiinages_purchase_sum.values()]#对年龄段与消费水平的关系进行可视化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(ages_purchase_mean_label,ages_purchase_mean_data,'gs-')>>>ax[0].grid();>>>ax[0].set_xlabel('年龄段')>>>ax[0].set_ylabel('平均消费额(元)')>>>ax[0].set_title('各年龄段平均消费额',fontsize='20')>>>ax[1].plot(ages_purchase_sum_label,ages_purchase_sum_data,'rs-')>>>ax[1].grid()>>>ax[1].set_xlabel('年龄段')>>>ax[1].set_ylabel('总消费额(元)')>>>ax[1].set_title('各年龄段总消费额',fontsize='20')>>>plt.show()消费者年龄与性别分布图#计算消费者中每个年龄段的人数>>>age_group={key:age_index[key][0].shape[0]forkeyinage_index.keys()}>>>ages_group_label=[iforiinage_group.keys()]>>>ages_group_data=[iforiinage_group.values()]#计算消费者中男性与女性的占比>>>gender_label,gender_data=np.unique(gender,return_counts=True)>>>gender_label=np.array(['女性','男性'])#对消费者的年龄与性别分布进行可视化分析>>>fig,ax=plt.subplots(1,2,figsize=(16,8),dpi=300)>>>ax[0].pie(ages_group_data,labels=ages_group_label,autopct='%d%%',colors=['orange','salmon','lightgreen','gold','yellowgreen','turquoise','darkorange','y'])>>>ax[0].axis('equal')>>>ax[0].set_title("消费者年龄分布图",fontsize='20')>>>ax[1].pie(gender_data,labels=gender_label,autopct='%d%%',colors=['yellowgreen','darkorange'])>>>ax[1].axis('equal')>>>ax[1].set_title("消费者性别分布图",fontsize='20')>>>plt.show()消费者职业类型分布与消费水平关系图#计算消费者中每种职业类别的人数>>>occupation_label,occupation_data=np.unique(occupation,return_counts=True)#按照职业类型进行分组>>>occupation_index=groupby(occupation)#计算每种职业类型的平均消费额>>>occupation_purchase_group={key:purchase[occupation_index[key]].mean()forkeyinoccupation_index.keys()}>>>occupation_purchase_label=[iforiinoccupation_purchase_group.keys()]>>>occupation_purchase_data=[iforiinoccupation_purchase_group.values()]#对职业类型和消费水平的关系进行可视化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].bar(occupation_label,occupation_data,color='purple')>>>ax[0].set_xticks(occupation_label)>>>ax[0].set_xlabel('职业类型')>>>ax[0].set_ylabel('人数')>>>ax[0].set_title('消费者中的职业类型分布',fontsize='20')>>>ax[1].plot(occupation_purchase_label,occupation_purchase_data,'ro-')>>>ax[1].grid();>>>ax[1].set_xlabel('职业类型');>>>ax[1].set_ylabel('平均消费额(元)');>>>ax[1].set_title('各职业的平均消费额',fontsize='20');>>>ax[1].set_xticks(occupation_purchase_label)>>>plt.show()实例:气象数据可视化分析05问题分析气象信息数据与民生息息相关,尤其是在指导生产与生活中起着举足轻重的作用。如人们每天都习惯查看气象软件或气象新闻,了解当地的温度、降雨情况,安排出行计划。随着获取气象数据的手段逐渐增加,合理地对气象数据进行探索与可视化分析能够为气象监测、气象预报与灾害预警提供有效的科学支撑。在本节中,将读取上海2021年全年的气象数据,使用可视化手段对温度、降雨、气候、风向等信息开展全面的分析。数据导入和风格设置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromscipy.statsimportnorm>>>plt.style.use('s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤炭合作框架协议书
- 雪上运动器材租赁担保合同
- 垃圾处理兼职操作员协议
- 仓储物流环境管理员聘用协议
- 学校自来水供应系统安装协议
- 上市公司保姆服务合同样本
- 机场扩建箱涵施工协议
- 生态园生态能源基地施工合同
- 电子元件清罐施工合同
- 网络存储服务器租赁合同
- 过驳操作计划SHIP-TO-SHIP
- 拆迁复耕施工方案
- 锚索施工安全技术交底
- 现代材料分析测试技术智慧树知到课后章节答案2023年下烟台南山学院
- 小数乘除法四则混合运算含简算专项练习(6套)
- 《数学建模》期末考试试卷一与参考答案
- 五年级信息技术上册期末测试卷答案
- 2019第五版新版PFMEA-注塑实例
- 新团员入团仪式PPT模板
- 八年级历史上册教案:第16课 毛泽东开辟井冈山道路
- 2023春国家开放大学-04016人文英语4-期末考试题带答案
评论
0/150
提交评论