项目14使用matplotlib进行数据可视化•Python扩展库matplotlib包括pylab、pyplot等绘图模块以及大量用于字体、颜色、图例等图形元素的管理与控制的模块。其中pylab和pyplot模块提供了类似于MATLAB的绘图接口,支持线条样式、字体属性、轴属性以及其他属性的管理和控制,可以使用非常简洁的代码绘制出优美的各种图案。•使用pylab或pyplot绘图时一般过程为:首先读入数据,然后根据实际需要绘制折线图、散点图、柱状图、饼状图、雷达图或三维曲线和曲面,接下来设置轴和图形属性,最后显示或保存绘图结果。14.1认识matplotlib•例14-1某商品进价49元,售价75元,现在商场新品上架搞促销活动,顾客每多买一件就给优惠1%,但是每人最多可以购买30件。对于商场而言,活动越火爆商品单价越低,但总收入和盈利越多。对于用户而言,虽然买的越多单价越低,但是消费总金额却是越来越多的,并且购买太多也会因为用不完而导致过期不得不丢弃造成浪费。现在要求计算并使用折线图可视化顾客购买数量num与商家收益、顾客总消费以及顾客省钱情况的关系,并标记商家收益最大的批发数量和收益。14.2绘制带有中文标题、标签和图例的折线图14.2绘制带有中文标题、标签和图例的折线图code\例14-1.py4•例14-2绘制余弦曲线散点图。importnumpyasnpimportmatplotlib.pylabasplx=np.arange(0,2.0*np.pi,0.1)#x轴数据y=np.cos(x)#y轴数据pl.scatter(x,y)#绘制散点图pl.show()#显示绘制的结果图像14.3绘制散点图•例14-3设置散点图的线宽、散点符号及大小。importnumpyasnpimportmatplotlib.pylabasplx=np.arange(0,2.0*np.pi,0.1)#x轴数据y=np.cos(x)#y轴数据pl.scatter(x,#x轴坐标y,#y轴坐标s=40,#散点大小linewidths=6,#线宽marker='+')#散点符号pl.show()14.3绘制散点图•例14-4某商场开业三个月后,有顾客反应商场一楼的手机信号不好,个别收银台有时无法正常使用微信支付或支付宝,商场内也有些位置无法正常使用微信。为此,商场安排工作人员在不同位置对手机信号强度进行测试以便进一步提高服务质量和用户体验,测试数据保存于文件“D:\服务质量保证\商场一楼手机信号强度.txt”中,文件中每行使用逗号分隔的三个数字分别表示商场内一个位置的x、y坐标和信号强度,其中x、y坐标值以商场西南角为坐标圆点且向东为x正轴(共150米)、向北为y正轴(共30米),信号强度以0表示无信号、100表示最强。14.3绘制散点图14.3绘制散点图•编写程序,使用散点图对该商场一楼所有测量位置的手机信号强度进行可视化,既可以直观地发现不同位置信号的强度以便分析原因,也方便观察测试位置的分布是否合理。在散点图中,使用横轴表示x坐标位置、纵轴表示y坐标位置,使用五角星标记测量位置,五角星大小表示信号强度,五角星越大表示信号越强,信号强度高于或等于70的位置使用绿色五角星,低于70且高于或等于40的使用蓝色五角星,低于40的位置使用红色五角星。814.3绘制散点图importmatplotlib.pyplotaspltxs=[]ys=[]strengths=[]#读取文件中的数据withopen(r'D:\服务质量保证\商场一楼手机信号强度.txt')asfp:forlineinfp:x,y,strength=map(int,line.strip().split(','))xs.append(x)ys.append(y)strengths.append(strength)#绘制散点图,s指大小,c指颜色,marker指符号形状forx,y,sinzip(xs,ys,strengths):ifs40:color='r'elifs70:color='b'else:color='g'plt.scatter(x,y,s=s,c=color,marker='*')plt.show()9•例14-5饼状图绘制与属性设置。importnumpyasnpimportmatplotlib.pyplotaspltlabels=('Frogs','Hogs','Dogs','Logs')colors=('#FF0000','yellowgreen','gold','blue')explode=(0,0.02,0,0.08)#使所有饼状图中第2片和第4片裂开fig=plt.figure(num=1,#num为数字表示图像编号,#如果是字符串则表示图形窗口标题figsize=(10,8),#图形大小,格式为(宽度,高度),#单位为英寸dpi=110,#分辨率facecolor='white')#背景色ax=fig.gca()#获取当前轴14.4绘制饼状图ax.pie(np.random.random(4),#4个介于0和1之间的随机数据explode=explode,#设置每个扇形的裂出情况labels=labels,#设置每个扇形的标签colors=colors,#设置每个扇形的颜色pctdistance=0.8,#设置扇形内百分比文本与中心的距离autopct='%1.1f%%',#设置每个扇形上百分比文本的格式shadow=True,#使用阴影,呈现一定的立体感startangle=90,#设置第一块扇形的起始角度radius=0.25,#设置饼的半径center=(0,0),#设置饼在图形窗口中的坐标counterclock=False,#顺时针绘制,默认是逆时针frame=True)#显示图形边框14.4绘制饼状图ax.pie(np.random.random(4),explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=45,radius=0.25,center=(1,1),frame=True)ax.pie(np.random.random(4),explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=90,radius=0.25,center=(0,1),frame=True)ax.pie(np.random.random(4),explode=explode,labels=labels,colors=colors,autopct='%1.2f%%',shadow=False,startangle=135,radius=0.35,center=(1,0),frame=True)14.4绘制饼状图14.4绘制饼状图ax.set_xticks([0,1])#设置x坐标轴刻度ax.set_yticks([0,1])#设置y轴坐标轴刻度ax.set_xticklabels([Sunny,Cloudy])#设置坐标轴刻度上的标签ax.set_yticklabels([Dry,Rainy])ax.set_xlim((-0.5,1.5))#设置坐标轴跨度ax.set_ylim((-0.5,1.5))ax.set_aspect('equal')#设置纵横比相等plt.show()1314.4绘制饼状图1414.5绘制柱状图•例14-6某商场2019年几个部门每个月的业绩如表14-1所示。编写程序绘制柱状图可视化各部门的业绩,可以借助于pandas的DataFrame结构,要求坐标轴、标题和图例能够显示中文。15月份123456789101112男装513258573046383840535850女装703048738280432530497960餐饮604046505776703370614945化妆品11075130808395878996888689金银首饰14310089907812910097108152968714.5绘制柱状图importpandasaspdimportmatplotlib.pyplotaspltimportmatplotlib.font_managerasfmdata=pd.DataFrame({'月份':[1,2,3,4,5,6,7,8,9,10,11,12],'男装':[51,32,58,57,30,46,38,38,40,53,58,50],'女装':[70,30,48,73,82,80,43,25,30,49,79,60],'餐饮':[60,40,46,50,57,76,70,33,70,61,49,45],'化妆品':[110,75,130,80,83,95,87,89,96,88,86,89],'金银首饰':[143,100,89,90,78,129,100,97,108,152,96,87]})#绘制柱状图,指定月份数据作为x轴data.plot(x='月份',kind='bar')#设置x、y轴标签和字体plt.xlabel('月份',fontproperties='simhei')plt.ylabel('营业额(万元)',fontproperties='simhei')#设置图例字体myfont=fm.FontProperties(fname=r'C:\Windows\Fonts\STKAITI.ttf')plt.legend(prop=myfont)plt.show()1614.5绘制柱状图1714.6绘制雷达图•例14-7很多学校的毕业证和学位证只能体现一种学习经历或者证明达到该学习阶段的最低要求,并不能体现学生的综合能力以及擅长的学科与领域,所以大部分单位在招聘时往往还需要借助于成绩单进行综合考察。但表格式的成绩单不是很直观,并且存在造假的可能。在证书上列出学生所有课程的成绩不太现实,但是可以考虑把每个学生的专业课成绩绘制成雷达图印在学位证书上,这样既可以让用人单位非常直观地了解学生综合能力,也比单独打印的成绩单要权威和正式很多。•编写程序,根据某学生的部分课程和成绩清单绘制雷达图。1814.6绘制雷达图importnumpyasnpimportmatplotlib.pyplotasplt#某学生的课程与成绩courses=['C++','Python','高数','大学英语','软件工程','组成原理','数字图像处理','计算机图形学']scores=[80,95,78,85,45,65,80,60]dataLength=len(scores)#数据长度#angles数组把圆周等分为dataLength份angles=np.linspace(0,#数组第一个数据2*np.pi,#数组最后一个数据dataLength,#数组中数据数量endpoint=False)#不包含终点scores.append(scores[0])angles=np.append(angles,angles[0])#闭合#绘制雷达图plt.polar(angles,#设置角度scores,#设置各角度上的数据'rv--',#设置颜色、线型和端点符号linewidth=2)#设置线宽#设置角度网格标签plt.thetagrids(angles*180/np.pi,courses,fontproperties='simhei')#填充雷达图内部plt.fill(angles,scores,facecolor='r',alpha=0.6)plt.show()1914.7绘制三维图形•例14-8绘制三维曲线。importmatplotlibasmplfrommpl_toolkits.mplot3dimportAxes3Dimportnumpyasnpimportmatplotlib.pyplotasp