Matplotlib可视化数据分析图表下(常用图表的绘制、折线图、柱形图、直方图、饼形图、散点图、面积图、热力图、箱形图、3D图表、绘制多个图表、双y轴可视化图表、颜色渐变图)

  • 本文来自《Python数据分析从入门到精通》_明日科技编著

5.6 常用图表的绘制

  • 本节介绍常用图表的绘制,主要包括绘制折线图、绘制柱形图、绘制直方图、绘制饼形图、绘制散点图、绘制面积图、绘制热力图、绘制箱型图、绘制3D图表、绘制多个子图表以及图表的保存。对于常用的图表类型以绘制多种类型图表进行举例,以适应不同应用场景的需求。

5.6.1 绘制折线图

  • 折线图可以显示随时间而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。如基础体温曲线图、学生成绩走势图、股票月成交量走势图,月销售量统计分析图、微博、公众号、网站访问量统计图等都可以用折线图体现。在折线图中,类别数据沿水平轴均匀分布,所有值数据沿垂直轴均匀分布。
  • Matplotlib绘制折线图主要使用plot()函数,相信通过前面的学习,您已经了解了plot()函数的基本用法,并能够绘制一些简单的折线图,下面尝试绘制多折线图。
绘制学生语数外各科成绩分析图(12)
  • 使用plot()函数绘制多折线图。例如,绘制学生语数外各科成绩分析图,程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df1=pd.read_excel('data.xls')              #导入Excel文件
df1

在这里插入图片描述

#多折线图
x1=df1['姓名']
y1=df1['语文']
y2=df1['数学']
y3=df1['英语']
plt.rcParams['font.sans-serif']=['SimHei']    #解决中文乱码
plt.rcParams['xtick.direction'] = 'out'       #x轴的刻度线向外显示
plt.rcParams['ytick.direction'] = 'in'        #y轴的刻度线向内显示
plt.title('语数外成绩大比拼',fontsize='18')   #图表标题
plt.plot(x1,y1,label='语文',color='r',marker='p')
plt.plot(x1,y2,label='数学',color='g',marker='.',mfc='r',ms=8,alpha=0.7)
plt.plot(x1,y3,label='英语',color='b',linestyle='-.',marker='*')
plt.grid(axis='y')                             #显示网格关闭y轴
plt.ylabel('分数')
plt.yticks(range(50,150,10))
plt.legend(['语文','数学','英语'])             #图例
plt.savefig('image.png')
plt.show()

在这里插入图片描述

  • 上述举例,用到了几个参数,下面进行说明。
  • mfc:标记的颜色
  • ms:标记的大小
  • mec:标记边框的颜色
  • alpha:透明度,设置该参数可以改变颜色的深浅

5.6.2 绘制柱形图

  • 柱形图,又称长条图、柱状图、条状图等,是一种以长方形的长度为变量的统计图表。柱形图用来比较两个或两个以上的数据(不同时间或者不同条件),只有一个变量,通常用于较小的数据集分析。
  • Matplotlib绘制柱形图主要使用bar()函数,语法如下:
matplotlib.pyplot.bar(x,height,width,bottom=None,*,align='center',data=None,**kwargs)
  • x:x轴数据
  • height:柱子的高度,也就是y轴数据
  • width:浮点型,柱子的宽度,默认值为0.8,可以指定固定值
  • bottom:标量或数组,可选参数,柱形图的y坐标,默认值为None
  • *:星号本身不是参数。星号表示其后面的参数为命名关键字参数,命名关键字参数必须传入参数名;否则程序会出现错误。
  • align:对齐方式,如center(居中)和edge(边缘),默认值为center
  • data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数都将被替换
  • **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)、label(每个柱子显示的标签)等。
4行代码绘制简单的柱形图(13)
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
plt.bar(x,height)

在这里插入图片描述

  • bar()函数可以绘制出各种类型的柱形图,如基本柱形图、多柱形图、堆叠柱形图,只要将bar()函数的主要参数理解透彻,就会达到意想不到的效果。下面介绍几种常见的柱形图。
1.基本柱形图(14)
  • 使用bar()函数绘制“2013-2019年线上图书销售额分析图”,程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
height=df['销售额']
plt.grid(axis="y", which="major")  # 生成虚线网格
#x、y轴标签
plt.xlabel('年份')
plt.ylabel('线上销售额(元)')

#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5,bottom=0.8)
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
for a,b in zip(x,height):
    plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9)
#图例
plt.legend(['销售额'])

在这里插入图片描述

2.多柱形图 (15)
  • 对于线上图书销售额的统计,如果要统计各个平台的销售额,可以使用多柱形图,不同颜色的柱子代表不同的平台,如京东、天猫、自营等,程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码

x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
width =0.25  #柱子宽度,若显示n个柱子,则width值需小于1/n ,否则柱子会出现重叠
#y轴标签
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,y1,width = width,color = 'darkorange')
plt.bar(x+width,y2,width = width,color = 'deepskyblue')
plt.bar(x+2*width,y3,width = width,color = 'g')
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
# plt.text是设置文本的位置
for a,b in zip(x,y1):
    plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a,b in zip(x,y2):
    plt.text(a+width, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a, b in zip(x, y3):
    plt.text(a + 2*width, b, format(b, ','), ha='center', va='bottom',fontsize=8)
plt.legend(['京东','天猫','自营'])#图例

在这里插入图片描述

5.6.3 绘制直方图

  • 直方图,又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。直方图是数值数据分布的精确图形表示,是一个连续变量(定量变量)的概率分布的估计。
  • 绘制直方图主要使用hist()函数,语法如下:
matplotlib.pyplot.hist(x,bin=None,range=None,density=None,bottom=None,histtype='bar',align='mid',bog=False,color=None,labe=None,stacked=False,normed=None)
  • x:数据集,最终的直方图将对数据集进行统计
  • bins:统计数组的区间分布
  • range:元组类型,显示的区间
  • density:布尔型,显示的频率统计结果,默认值为None。设置值为False,不显示频率统计结果;设置值为True,则显示频率统计结果。需要统计结果=区间数目/(总数x区间宽度)。
  • histtype:可选参数,设置值为bar、barstacked、step或stepfilled,默认值bar,推荐使用默认配置,其中step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似。
  • align:可选参数,控制柱状图的水平分布,设置值为left、mid或right,默认值为mid,其中,left或者right会有部分空白区域,推荐使用默认值。
  • log:布尔型,默认值为False,即y坐标轴是否选择指数刻度。
  • stacked:布尔型,默认值为False,是否为堆积柱状图。
绘制简单直方图(16)
import matplotlib.pyplot as plt
x=[22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]
plt.hist(x, bins = [0,25,50,75,100])

在这里插入图片描述

直方图分析学生数学成绩分布情况(17)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('grade1.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['得分']
plt.xlabel('分数')
plt.ylabel('学生数量')
# 显示图标题
plt.title("高一数学成绩分布直方图")
plt.hist(x, bins = [0,25,50,75,100,125,150],facecolor="blue", edgecolor="black", alpha=0.7)

在这里插入图片描述

5.6.4 绘制饼形图

  • 饼形图常用来显示各个部分在整体中所占的比例。例如,在工作中如果遇到需要计算总费用或金额的各个部分构成的情况,一般通过各个部分与总额相除来计算,而且这种比例表示方法很抽象,而通过饼形图将直接显示各个组成部分所占比例,一目了然。
  • Matplotlib绘制饼形图主要使用pie()函数,语法如下:
matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,radius=None,counterclock=True,wedgeprops=None,textprops=None,center=(0,0),frame=False,rotatelabels=False,hold=None,data=None)
  • x:每一块饼图的比例,如果sum(x) > 1会使用sum(x)归一化。
  • explode:每一块饼图离中心的距离。
  • labels:每一块饼图外侧显示的说明文字
  • autopct:设置饼图百分比,可以使用格式化字符串format()函数。如’%1.1f’保留小数点前后1位。
  • pctdistance:类似于labeldistance参数,指定百分比的位置刻度,默认值为0.6
  • shadow:在饼图下面画一个阴影,默认值为False,即不画阴影。
  • labeldistance:标记的绘制位置,相对于半径的比例,默认值为1.1,如设置值为90则从y轴正方向画起。
  • radius:饼图半径,默认值为1
  • counterclock:指定指针方向,布尔型,可选参数。默认值为True,表示逆时针;如果值为False,则表示顺时针
  • wedgeprops:字典类型,可选参数,默认值为None。字典传递给wedge对象,用来画一个饼图。例如wedgeprops={‘linewidth’:2}设置wedge线宽为2.
  • textprops:设置标签和比例文字的格式,字典类型,可选参数,默认值为None。传递给text对象的字典参数
  • center:浮点类型的列表,可选参数,默认值为(0,0),表示图表中心位置。
  • frame:布尔型,可选参数,默认值为False,不显示框架(也就是网络);如果值为True,则显示轴框架,与grid()函数配合使用。实际应用中建议使用默认设置,因为显示轴框架会干扰饼形图效果。
  • rotatelabels:布尔型,可选参数,默认值为False;如果值为True,则旋转每个标签到指定的角度。
绘制简单饼形图(18)
import matplotlib.pyplot as plt
x = [2,5,12,70,2,9]
plt.pie(x,autopct='%1.1f%%')

在这里插入图片描述

1.基础饼形图(19)
  • 通过饼形图分析各地区销量占比情况:
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        startangle=90,# 设置饼图的初始角度
        radius = 0.5, # 设置饼图的半径
        center = (0.2,0.2), # 设置饼图的原点
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        pctdistance=0.6)# 设置百分比标签与圆心的距离
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('20201月各地区销量占比情况分析')

在这里插入图片描述

2.分裂饼形图(20)
  • 分裂饼形图是将您认为主要的饼图部分分裂出来,以达到突出显示的目的。
  • 将销量占比量最多的广东省分裂显示,效果如下面第一个图所示。分裂饼形图可以同时分裂多块,如下面第二个图所示。
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        startangle=90,# 设置饼图的初始角度
        radius = 0.5, # 设置饼图的半径
        center = (0.2,0.2), # 设置饼图的原点
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        pctdistance=0.6,# 设置百分比标签与圆心的距离
        #shadow=True,      #阴影
        explode = (0.1,0,0,0,0,0,0,0,0,0))  #设置分裂饼图
        #explode = (0.1,0,0,0,0,0,0,0.1,0.1,0))  #设置多分裂饼图
# 设置x,y轴刻度一致,保证饼图为圆形

plt.axis('equal')
plt.title('20201月各地区销量占比情况分析')

在这里插入图片描述
在这里插入图片描述

  • 分裂饼图主要是通过设置explode参数实现,该参数用于设置饼图距中心的距离,我们需要将哪块饼图分裂出来,就设置它与中心的距离即可。例如,上图中,我们将占比最多的”广东省“分裂出来,如上面第二个图所示。广东省排在第一位,那么就设置第一位距中心的距离为0.1,其他为0,关键代码如下:
explode = (0.1,0,0,0,0,0,0,0,0,0))
3.立体感带阴影的饼形图
  • 立体感带阴影的饼形图看起来更美观,效果如下图所示:
  • 立体感带阴影的饼形图主要通过shadow参数实现,设置该参数值为True即可,主要代码如下:
shadow=True,      #阴影
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        startangle=90,# 设置饼图的初始角度
        radius = 0.5, # 设置饼图的半径
        center = (0.2,0.2), # 设置饼图的原点
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        pctdistance=0.6,# 设置百分比标签与圆心的距离
        shadow=True,      #阴影
        explode = (0.1,0,0,0,0,0,0,0,0,0))  #设置分裂饼图,本例中第一个数字最大
        #explode = (0.1,0,0,0,0,0,0,0.1,0.1,0))  #设置多分裂饼图
# 设置x,y轴刻度一致,保证饼图为圆形

plt.axis('equal')
plt.title('20201月各地区销量占比情况分析')

在这里插入图片描述

4.环形图(21)
  • 环形图是由两个及以上大小不一的饼图在一起,挖去中间的部分所构成的图形,效果如下:
import pandas as pd
from matplotlib import pyplot as plt
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
        labels=labels,#添加区域水平标签
        colors=colors,# 设置饼图的自定义填充色
        autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
        #radius =1 , # 设置饼图的半径
        pctdistance=0.85,
        startangle = 180,
        textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
        wedgeprops = {'width': 0.4, 'edgecolor': 'k'})
plt.title('20201月各地区销量占比情况分析')

在这里插入图片描述

  • 这里还是通过pie()函数实现,一个关键参数wedgegroups,字典类型,用于设置饼形图内、外边界的属性,如环的宽度,环边界颜色和宽度,主要代码如下:
wedgeprops = {'width': 0.4, 'edgecolor': 'k'}
5.内嵌环形图(22)
  • 内嵌环形图实际是双环形图,效果如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
df1 = pd.read_excel('data2.xls')
df2=pd.read_excel('data2.xls',sheet_name='2月')
#数据集,x1,x2分别对应外环、内环百分比例
x1=df1['销量']
x2=df2['销量']
#设置饼状图各个区块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
#外环
plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w'))
#内环
plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w'))
#图例
legend_text=df1['地区']
plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))#设置图例标题、位置、去掉图例边框
plt.axis('equal')#设置坐标轴比例以显示为圆形
plt.title('20201月和2月各地区销量占比情况分析')

在这里插入图片描述

  • 绘制嵌套环形图需要注意以下三点:
  • (1)连续使用两次pie()函数。
  • (2)通过wedgeprops参数设置环形边界。
  • (3)通过radius参数设置不同的半径。
  • 另外,由于图例内容比较长,为了图例能够正常显示,图例代码中引入了两个主要参数,即frameon和bboox_to_anchor。其中,frameon参数设置图例有无边框;bbox_to_anchor参数设置图例位置,主要代码如下:
#外环
plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w'))
#内环
plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w'))
#图例
legend_text=df1['地区']
plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))#设置图例标题、位置、去掉图例边框

5.6.5 绘制散点图

  • 散点图主要用来查看数据的分布情况或相关性,一般在线性回归分析中,查看数据点在坐标系平面的分布情况。散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据进行拟合。
  • 散点图与折线图类似,也是一个个点构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。
  • Matplotlib绘制散点图使用plot()函数和scatter()函数都可以实现,本节使用scatter()函数绘制散点图,scatter()函数专门用于绘制散点图,使用方式和plot()函数类似,区别在于前者具有更高的灵活性,可以单独控制每个散点与数据匹配,并让每个散点具有不同的属性。scatter()函数的语法如下:
matplotlib.pyplot.scatter(x,y,s=None,marker=None,cmap=None,norm=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,data=None,**kwargs)
  • x,y:数据
  • s:标记大小,以平方磅为单位的标记面积,设置值如下。数值标量:以相同的大小绘制所有标记。行或列向量:是每个标记具有不同的大小。x、y和sz中的相应元素确定每个标记的位置和面积。sz的长度必须等于x和y的长度。[]:使用36平方磅的默认面积。
  • c:标记颜色,可选参数,默认标记颜色为蓝色
  • marker:标记样式,可选参数,默认值为’o’
  • cmap:颜色地图,可选参数,默认值为None
  • norm:可选参数,默认值为None
  • vmin,vmax:标量,可选,默认值为None
  • alpha:透明度,可选参数,0~1的数,表示透明度,默认值为None
  • linewidths:线宽,标记边缘的宽度,可选参数,默认值为None
  • verts:(x,y)的序列,可选参数,如果参数marker为None,这些顶点将用于构建标记。标记的中心位置为(0,0)
  • edgecolors:轮廓颜色,与参数c类似,可选参数,默认值为None
  • data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换
  • **kwargs:关键字参数,其他可选参数
绘制简单散点图(23)
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6]
y=[19,24,37,43,55,68]
plt.scatter(x, y)

在这里插入图片描述

散点图分析销售收入与广告费的相关性(24)
  • 接下来,绘制销售收入与广告费散点图,用以观察销售收入与广告费的相关性:
import pandas as pd
import matplotlib.pyplot as plt
aa =r'JDdata.xls'
bb=r'JDcar.xls'
dfaa = pd.DataFrame(pd.read_excel(aa))
dfbb=pd.DataFrame(pd.read_excel(bb))
df1=dfaa[['业务日期','金额']]
df2=dfbb[['投放日期','支出']]
df1

在这里插入图片描述

#去除空日期和金额为0的记录
df1=df1[df1['业务日期'].notnull() & df1['金额'] !=0]
df2=df2[df2['投放日期'].notnull() & df2['支出'] !=0]
df1['业务日期'] = pd.to_datetime(df1['业务日期'])
df2['投放日期'] = pd.to_datetime(df2['投放日期'])

# set_index用法:https://zhuanlan.zhihu.com/p/143839744
dfData = df1.set_index('业务日期',drop=True) #将业务日期设置列设置为索引,并删掉原来的日期索引列
dfCar=df2.set_index('投放日期',drop=True)
dfData

在这里插入图片描述

# 按月度统计并显示销售金额
dfData_month=dfData.resample('M').sum().to_period('M')
# 按月度统计并显示广告费支出金额
dfCar_month=dfCar.resample('M').sum().to_period('M')
dfData_month

在这里插入图片描述

在这里插入图片描述

#x为广告费用,y为销售收入
x=pd.DataFrame(dfCar_month['支出'])
y=pd.DataFrame(dfData_month['金额'])
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.title('销售收入与广告费散点图')   #图表标题
plt.scatter(x, y,  color='red') #真实值散点图

在这里插入图片描述

5.6.6 绘制面积图

  • 面积图用于体现数量随时间而变化的程度,也可以用于引起人们对总值趋势的注意。例如,表示随时间而变化的利润的数据可以绘制在面积图中,以强调总利润。
  • Matplotlib绘制面积图主要使用stackplot()函数,语法如下:
matplotlib.pyplot.stackplot(x,*args,data=None,**kwargs)
  • x:x轴数据
  • args:当传入的参数个数未知时使用args。这里指y轴数据可以传入多个y轴。
  • data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
  • **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)等。
绘制简单面积图(25)
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y1 =[6,9,5,8,4]
y2 = [3,2,5,4,3]
y3 =[8,7,8,4,3]
y4 = [7,4,6,7,12]
plt.stackplot(x, y1,y2,y3,y4, colors=['g','c','r','b'])

在这里插入图片描述

  • 面积图也有很多种,如标准面积图、堆叠面积图和百分比堆叠面积图等。下面主要介绍标准堆叠面积图。
1.标准面积图(26)
  • 通过标准面积图分析2013-2019年线上图书销售情况,通过该图可以看出每一年线上图书销售的一个趋势:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y=df['销售额']
#图表标题
plt.title('2013-2019年线上图书销售情况')
plt.stackplot(x, y)

在这里插入图片描述

2.堆叠面积图(27)
  • 通过堆叠面积图分析2013-2019年线上各平台图书销售情况。堆叠图不仅可以看到各平台每年销售变化趋势,通过将各平台数据堆叠到一起还可以看到整体的变化趋势。
  • 实现堆叠面积图的关键在于增加y轴,通过增加多个y轴数据,形成堆叠面积图,代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
#图表标题
plt.title('2013-2019年线上图书销售情况')
plt.stackplot(x, y1,y2,y3,colors=['#6d904f','#fc4f30','#008fd5'])
#图例
plt.legend(['京东','天猫','自营'],loc='upper left')

在这里插入图片描述

5.6.7 绘制热力图

  • 热力图是通过密度函数进行可视化用于表示地图中的密度的热图。它使人们能够独立于缩放因子感知点的密度。热力图可以显示不可点击区域发生的事情。利用热力图可以看到数据表里多个特征两两的相似度。例如,以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图在网页分析、业务数据分析等其他领域也有较为广泛的应用。
绘制简单热力图(28)
  • 热力图是数据分析的常用方法,通过色差、亮度来展示数据的差异,易于理解。
import matplotlib.pyplot as plt
X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
plt.imshow(X)

在这里插入图片描述

  • 上述代码中,plt.imshow(X)中传入的数组X=[[1,2],[3,4],[5,6],[7,8],[9,10]]为颜色的对应值,按照矩阵X进行颜色分布,如左上角颜色为深蓝,右下角颜色为黄色,其对应值为10,具体如下:
[1,2] [深蓝,蓝色]
[3,4] [蓝绿,深绿]
[5,6] [海藻绿,春绿色]
[7,8] [绿色,浅绿色]
[9,10] [草绿色,黄色]
热力图对比分析学生各科成绩(29)
  • 根据学生成绩统计数据绘制热力图,通过热力图直观地对比每名学生各科成绩的高低。程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('data1.xls',sheet_name='高二一班')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
X = df.loc[:,"语文":"生物"].values
name=df['姓名']
plt.imshow(X)
plt.xticks(range(0,6,1),['语文','数学','英语','物理','化学','生物'])#设置x轴刻度标签
plt.yticks(range(0,12,1),name)#设置y轴刻度标签
plt.colorbar()  #显示颜色条
plt.title('学生成绩统计热力图')

在这里插入图片描述

  • 从上图可知,颜色以高亮显示的,成绩越高;反之,成绩越低。

5.6.9 绘制箱形图

  • 箱型图又称箱线图、盒须图或盒式图,它是一种显示一组数据分散情况下的资料的统计图。因形状像箱子而得名。箱形图最大的优点就是不受异常值的影响,可以以一种相对稳定的方式描述数据的离散程度分布情况,因此在各种领域经常被使用。另外,箱形图也常用于异常值的识别。Matplotlib绘制箱型图主要使用boxplot()函数,语法如下:
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positon=None,widths=None,patch_artist=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfiers=None,boxprops=None,labels=None,flierprops=None,medianprops=None,meanprops=None,capprops=None,whiskerprops=None)
  • x:指定要绘制箱型图的数据
  • notch:是否以凹口的形式展现箱形图,默认非凹口
  • sym:指定异常点的形状,默认为加号(+)显示
  • vert:是否需要将箱形图垂直摆放,默认垂直摆放
  • whis:指定上下限于与上下四分位的距离,默认为1.5倍的四分位差。
  • position:指定箱形图的位置,默认为[0,1,2,…]
  • widths:指定箱形图的宽度,默认为0.5
  • patch_artist:是否填充箱体的颜色。
  • meanline:是否用线的形式表示均值,默认用点来显示。
  • showmeans:是否显示均值,默认不显示
  • showcaps:是否显示箱形图顶端和末端的两条线,默认显示。
  • showbox:是否显示箱形图的箱体,默认显示。
  • showfliers:是否显示异常值,默认显示。
  • boxprops:设置箱体的属性,如异常点的形状、大小、填充色等。
  • medianprops:设置中位数的属性,如线的类型、粗细等。
  • meanprops:设置均值的属性,如点的大小、颜色等。
  • capprops:设置箱形图顶端和末端线条的属性,如颜色、粗细等。
  • whiskerprops:设置须的属性,如颜色、粗细等。
绘制简单箱形图(30)
import matplotlib.pyplot as plt
x=[1,2,3,5,7,9]
plt.boxplot(x)

在这里插入图片描述

绘制多组数据的箱形图(31)
  • 上述举例是一组数据的箱形图,还可以绘制多组数据的箱形图,需要指定多组数据。例如,为三组数据绘制箱形图,程序代码如下:
import matplotlib.pyplot as plt
x1=[1,2,3,5,7,9]
x2=[10,22,13,15,8,19]
x3=[18,31,18,19,14,29]
plt.boxplot([x1,x2,x3])

在这里插入图片描述

  • 箱形图将数据切割分离(实际上就是将数据分为4大部分),如图5.57所示。
    在这里插入图片描述
  • 下面介绍箱形图每部分具体含义以及如何通过箱形图识别异常值。
  • 下四分位:图5.57中的下四分位数指的是数据的25%分位点所对应的值(Q1)。计算分位数可以使用Pandas的quantile()函数。例如,Q1=df[‘总消费’].quantile(q=0.25)。
  • 中位数:中位数即为数据的50%分位点所对应的值(Q2)
  • 上四分位数:上四分位数则为数据的75%分位点所对应的值(Q3)
  • 上限:上线的计算公式为Q3+1.5(Q3-Q1)
  • 下限:上线的计算公式为Q1-1.5(Q3-Q1)
  • 其中Q3-Q1表示四分位差。如果使用箱形图识别异常值,其判断标准是,当变量的数据值大于箱形图的上限或者小于箱形图的下限时,就可以将这样的数据判定为异常值。
  • 下面了解以下判断异常值的算法,如图5.58所示。
    在这里插入图片描述
通过箱形图判断异常值(32)
  • 通过箱形图查找客人总消费数据中存在的异常值,程序代码如下:
import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_excel('tips.xlsx')
plt.boxplot(x = df['总消费'], # 指定绘制箱线图的数据
            whis = 1.5, # 指定1.5倍的四分位差
            widths = 0.3, #指定箱线图中箱子的宽度为0.3
            patch_artist = True, #填充箱子颜色
            showmeans = True, #显示均值
            boxprops = {'facecolor':'RoyalBlue'}, # 指定箱子的填充色为宝蓝色
            flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':3}, # 指定异常值的填充色、边框色和大小
            meanprops = {'marker':'h','markerfacecolor':'black', 'markersize':8},# 指定均值点的标记符号(六边形)、填充色和大小
            medianprops = {'linestyle':'--','color':'orange'}, # 指定中位数的标记符号(虚线)和颜色
            labels = ['']) # 去除x轴刻度值

# 计算下四分位数和上四分位
Q1 = df['总消费'].quantile(q = 0.25)
Q3 = df['总消费'].quantile(q = 0.75)
# 基于1.5倍的四分位差计算上下限对应的值
low_limit = Q1 - 1.5*(Q3 - Q1)
up_limit = Q3 + 1.5*(Q3 - Q1)
# 查找异常值
val=df['总消费'][(df['总消费'] > up_limit) | (df['总消费'] < low_limit)]
print('异常值如下:')
print(val)

在这里插入图片描述
在这里插入图片描述

5.6.9 绘制3D图表

  • 3D图表有立体感也比较美观,看起来更加“高大上”。下面介绍两种3D图表,即三维柱形图和三维曲面图。
  • 绘制3D图表,我们仍使用Matplotlib,但需要安装mpl_toolkits工具包,使用pip安装命令:
pip install -upgrade matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装好这个模块后,即可调用mpl_tookits下的mplot3d类进行3D图表的绘制。
1. 3D柱形图(33)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import numpy as np
fig = plt.figure()
axes3d = Axes3D(fig)
zs = [1, 5, 10, 15, 20]
for z in zs:
    x = np.arange(0, 10)
    y = np.random.randint(0, 30, size=10)
    axes3d.bar(x, y, zs=z, zdir='x', color=['r', 'green', 'yellow', 'c'])

在这里插入图片描述

2. 3D曲面图(34)
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
delta = 0.125
# 生成代表X轴数据的列表
x = np.arange(-4.0, 4.0, delta)
# 生成代表Y轴数据的列表
y = np.arange(-3.0, 4.0, delta)
# 对x、y数据执行网格化
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 计算Z轴数据(高度数据)
Z = (Z1 - Z2) * 2
# 绘制3D图形
ax.plot_surface(X, Y, Z,
    rstride=1,  # rstride(row)指定行的跨度
    cstride=1,  # cstride(column)指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 设置颜色映射
# 设置Z轴范围
ax.set_zlim(-2, 2)

在这里插入图片描述

5.6.10 绘制多个图表

  • Matplotlib可以实现在一张图表上绘制多个子图表。Matplotlib提供了3种方法:一是subplot()函数;二是subplots()函数;三是add_subplots()函数,下面分别介绍:
1.subplot()函数
  • subplot()函数直接指定划分方式和位置,它可以将一个绘图区域划分为n个子图,每个subplot()函数只能绘制一个子图。语法如下:
matplotlib.pyplot.subplot(*args,**kwargs)
  • args:当传入的参数个数未知时使用args
  • **kwargs:关键字参数,其他可选参数
  • 例如,绘制一个2x3的区域,subplot(2,3,3),将画布分成2行3列在第3个区域中绘制,用坐标表示如下:
(1,1),(1,2),(1,3)
(2,1),(2,2),(2,3)
  • 如果行列的值都小于10,那么可以把它们缩写成一个整数,如subplot(233)。
  • 另外,subplot()函数在指定的区域中创建一个轴对象,如果新创建的轴和之前所创建的轴重叠,那么,之前的轴将被删除。
使用subplot()函数绘制多个子图的空图表(35)
  • 绘制一个2x3包含6个子图的空图表,程序代码如下:
import matplotlib.pyplot as plt
plt.subplot(2,3,1)
plt.subplot(2,3,2)
plt.subplot(2,3,3)
plt.subplot(2,3,4)
plt.subplot(2,3,5)
plt.subplot(2,3,6)

在这里插入图片描述

绘制包含多个子图的图表(36)
  • 通过上述举例了解了subplot()函数的基本用法,接下来将前面所学的简单图表整合到一张图表上,结果如下图所示:
import matplotlib.pyplot as plt
#第1个子图表-折线图
plt.subplot(2,2,1)
plt.plot([1, 2, 3, 4,5])
#第2个子图表-散点图
plt.subplot(2,2,2)
plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')
#第3个子图表-柱形图
plt.subplot(2,1,2)
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
plt.bar(x,height)

图5.65
  • 上述举例,以下两个关键点一定要掌握。
  • (1)每绘制一个子图表都要调用一次subplot()函数
  • (2)绘图区域位置编号
  • subplot()函数的前面两个参数指定的是一个画布被分割成的行数和列数,后面一个参数则指的是当前绘制区域位置编号,编号规则是行优先。
  • 例如,图5.64中有3个子图表,第1个子图表subplot(2,2,1),即将画布分成2行2列,在第1个子图中绘制折线图;第二子图表subplot(2,2,2),将画布分成2行2列,在第二个子图中绘制散点图;第3个子图表subplot(2,1,2),将画布分成2行1列,由于第1行已经占用了,所以在第2行也就是第3个子图中绘制柱形图。示意图如图5.65所示。
    在这里插入图片描述
  • subplot()函数在画布中绘图时,每次都要调用它指定绘图区域非常麻烦,而subplots()函数则更直接,它会事先把画布区域分割好。下面介绍subplots()函数。
2.subplots()函数
  • subplots()函数用于创建画布和子图,语法如下:
matplotlib.pyplot.subplots(nrows,ncols,sharex,sharey,squeeze,subplot_kw,gridspec_kw,**fig_kw)
  • nrows和ncols:表示将画布分割成几行几列,例如,nrows=2、ncols=2表示将画布分割成2行2列,起始值均为0。当调用画布中的坐标轴时,ax[0,0]表示调用左上角的坐标,ax[1,1]表示调用右下角的坐标。
  • sharex和sharey:布尔值或者值为“none”“all”“row”“col”,默认值为False。用于控制x或y轴之间的属性共享。具体参数值说明如下。
    – True或者“all”:表示x或y轴属性在所有子图中共享。
    – False或者“none”:表示每个子图的x或y轴都是独立的部分。
    – row:表示每个子图在一个x或y轴上共享行(row)
    – col:表示每个子图在一个x或y轴上共享列(column)
  • squeeze:布尔值,默认值为True,额外的维度从返回的axes(轴)对象中挤出,对应nx1或1xn个子图,返回一个一维数组,对于nxm,n>1和m>1返回一个二维数组;如果值为False,则表示不进行挤压操作,返回一个元素为Axes实例的二维数组,即使它最终是1x1
  • subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()函数来创建每个子图。
  • gridspec_kw:字典类型,可选参数。把字典的关键字传递给GridSpec()构造函数创建网格区域,然后将子图放在网格(grid)里。
  • **fig_kw:把所有详细的关键字参数传递给figure
使用subplots()函数绘制多子图的空图表(37)
  • 绘制一个2x3包含6个子图的空图表,使用subplots()函数只需3行代码:
import matplotlib.pyplot as plt
figure,axes=plt.subplots(2,3)

在这里插入图片描述

  • 上述代码中,figure和axes是两个关键点。
  • figure:绘制图表的画布。
  • axes:坐标轴对象,可以理解为在figure(画布)上绘制坐标轴对象,它帮我们规划出了一个科学作图的坐标轴系统。
  • 通过上面可以明白,外面的是画布(figure),里面带坐标轴的是坐标轴对象(axes)。
使用subplots()函数绘制多子图图表(38)
  • 使用subplots()函数将前面所学的简单图表整合到一张图表上,结果如图所示:
import matplotlib.pyplot as plt
figure,axes=plt.subplots(2,2)
axes[0,0].plot([1, 2, 3, 4,5])  #折线图
axes[0,1].plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')#散点图
#柱形图
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
axes[1,0].bar(x,height)
#饼形图
x = [2,5,12,70,2,9]
axes[1,1].pie(x,autopct='%1.1f%%')

在这里插入图片描述

3.add_subplot()函数
  • add_subplot()函数也可以实现在一张图上绘制多个子图表,用法与subplot()基本相同,先来看下列一段代码:
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,3,1)
ax2 = fig.add_subplot(2,3,2)
ax3 = fig.add_subplot(2,3,3)
ax4 = fig.add_subplot(2,3,4)
ax5 = fig.add_subplot(2,3,5)
ax6 = fig.add_subplot(2,3,6)
  • 上述代码同样是绘制一个2x3包含6个子图的空图表。首先创建一个figure实例(画布),然后通过ax1=fig.add_subplot(2,3,1)创建第1个子图表,返回Axes实例(坐标轴对象),第1个参数为行数,第2个参数为列数,第3个参数为子图表的位置。
  • 以上用3中方法实现了在一张图上绘制多个子图表,3中方法各有所长。subplot()函数和add_subplot()函数比较灵活,定制化效果比较好,可以实现子图表在图中的各种布局(如一张图上可以随意摆放3个或5个图表);而subplots()函数较为不灵活,但它可以用较少的代码实现绘制多个子图表。
5.6.11 图表的保存
  • 实际工作中,有时需要将绘制的图表保存为图片放置到报告中。Matplotlib的savefig()函数可以实现这一功能,将图表保存为JPEG、TIFF或PNG格式的图片。
  • 例如,保存之前绘制的折线图,主要代码如下:
plt.savefig('image.png')
  • 需要注意一个关键问题,保存代码必须在图表预览前,也就是plt.show()代码前;否则保存后的图片是白色,图表无法保存。

5.7 综合应用

5.7.1 双y轴可视化数据分析图表的实现

  • 双y轴顾名思义就是两个y轴,其特点是通过双y轴看出发展情况的同时还可以看到其增长速度。对于产品而言,通过此图可以看到产品销量的同时还可以看到产品增长率,效果如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel('mrbook.xlsx')                 #导入Excel文件
x=[1,2,3,4,5,6]
y1=df['销量']
y2=df['rate']
fig = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  #用来正常显示负号
ax1 = fig.add_subplot(111)                  #添加子图
plt.title('销量情况对比')                   #图表标题
#图表x轴标题
plt.xticks(x,['1月','2月','3月','4月','5月','6月'])
ax1.bar(x,y1,label='销量')
lin1=ax1.legend(('销量',)) #设置图例
ax1.set_ylabel('销量(册)')            #y轴标签
ax2 = ax1.twinx()                       #共享x轴添加一条y轴坐标轴
ax2.plot(x,y2,color='black',linestyle='--',marker='o',linewidth=2,label='增长率')
ax2.set_ylabel('增长率')
lin2=ax2.legend(('增长率',))
for a,b in zip(x,y2):
    plt.text(a, b+0.02, '%.2f' % b, ha='center', va= 'bottom',fontsize=10,color='red')
plt.show()

在这里插入图片描述

5.7.2 颜色渐变饼形图的实现

from matplotlib import font_manager as fm
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.style.use('ggplot') #设置背景样式,https://blog.csdn.net/qq_22592457/article/details/105636480
from  matplotlib import cm
#原始数据
shapes = ['天津', '江西省', '安徽省', '云南省', '福建省', '河南省', '辽宁省',
       '重庆', '湖南省', '四川省', '北京', '上海', '广西壮族自治区', '河北省',
       '浙江省', '江苏省', '湖北省', '山东省', '广东省']
values = [287,383,842,866,1187,1405,1495,1620,1717,
          2313,2378,3070,4332,5841,6482,7785,9358,9818,20254]
explode=[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
s = pd.Series(values, index=shapes)
labels = s.index
sizes = s.values
fig, ax = plt.subplots(figsize=(6,6)) # 设置绘图区域大小
# 绘制彩虹图,https://blog.csdn.net/weixin_48964486/article/details/124144183
colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # 颜色地图:秋天→彩虹→灰色→春天→黑色
patches, texts, autotexts = ax.pie(sizes, labels=labels, autopct='%1.0f%%',
        shadow=False, startangle=170, colors=colors)
ax.axis('equal')
ax.set_title('各地区线上图书销售占比图',loc='left')
# 重新设置字体大小
proptease = fm.FontProperties()
# 字体大小(从小到大): xx-small、x-small、small、medium、large、x-large、xx-large,或者是数字,如18
proptease.set_size('small')
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
plt.show()

在这里插入图片描述

  • 如果画分裂饼形图,可在本文搜索关键词“分裂饼形图”。
  • 颜色渐变主要使用了Matplotlib内置颜色地图模块cm,在该模块中指定一组数据可以生成多种颜色,由浅入深。例如,渐变蓝色,cmap=plt.cm.Blues。

5.7.3 等高线图的实现

  • 等高线图是地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中。等高线图实现结果如下图所示:
import numpy as np
import matplotlib.pyplot as plt
# 计算x,y坐标对应的高度值
def f(x, y):
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2)
# 生成x,y的数据
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 把x,y数据转换为二维数据
X, Y = np.meshgrid(x, y)
# 填充等高线
plt.contourf(X, Y, f(X, Y))
# 显示图表
plt.show()

在这里插入图片描述

  • 关键代码解析:需画出等高线,核心函数是Matplotlib的coutourf()函数,但该函数中参数x和y对应的值是二维数据,因此需要使用NumPy的meshgrid()函数将x和y值转换成二维数据,代码如下:
np.meshgrid(x,y)

5.8 小 节

  • 数据统计的再好都不如一张图表清晰、直观。本章用大量的举例详细地介绍了Matplotlib图表,其根本在于能够使读者全面透彻地了解和掌握最基础的图表,并应用到实际数据统计工作中,同时也为以后学习其他绘图库奠定坚实的基础。
  • 6
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值