【python数据分析07】——matplotlib绘图(直方图、饼图、箱线图)

前言

另外3种数据分析常用的图形是直方图、饼图和箱线图,主要用于分析数据内部的分布状态和分散状态。

  • 直方图主要用于查看各分组数据的数量分布,以及各个分组数据之间的数量比较
  • 饼图主要用于查看各分组数据在总数据中的占比
  • 箱线图主要是发现整体数据的分布分散情况

1. 绘制直方图

直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,用纵轴表示数量或者占比。用直方图可以比较直观地看出产品质量特性的分布状态,便于判断其总体质量分布情况。
在直方图中可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布

pyplot绘制直方图的函数为bar,函数形式为:

matplotlib.pyplot.bar(left,height,width = 0.8,bottom = None,hold = None,data = None,** kwargs)

bar 函数常用参数说明如下:

参数名称说明
left接收array,表示x轴数据。无默认
height接收array,表示x轴所代表数据的数量。无默认
width接收0—1之间的float。指定直方图宽度。默认是0.8
color接收特定string或者包含颜色字符串的array。表示直方图颜色。默认为None

使用bar函数绘制2017年第一季度各产业国民生产总值直方图

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'## 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = np.load('C:/Users/Lenovo/jupyter/data/国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns']## 提取其中的columns数组,视为数据的标签
values = data['values']## 提取其中的values数组,数据的存在位置
label = ['第一产业','第二产业','第三产业']## 刻度标签
plt.figure(figsize=(6,5))## 设置画布
plt.bar(range(3),values[-1,3:6],width = 0.5)## 绘制散点图
plt.xlabel('产业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(3),label)
plt.title('2017年第一季度各产业国民生产总值直方图')## 添加图表标题
plt.savefig('C:/Users/Lenovo/jupyter/pic/2017年第一季度各产业国民生产总值直方图.png')
plt.show()

输出:
在这里插入图片描述
通过上图可以看出,2017年第一季度的第一产业生产总值不到第二产业的六分之一,基本与第三产业的十分之一持平。第二产业生产总值和第三产业生产总值相差大约三分之一。

2 绘制饼图

饼图是将各项的大小与各项总和的比例显示在一张“饼”中,以“饼”的大小确定每一项占比。饼图可以清楚的反映出部分与部分、部分与整体之间的关系。

pyplot中绘制饼图的函数为pie,函数形式为:

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, 
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, 
counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, 
rotatelabels=False, *, normalize=None, data=None)

常用参数说明如下:

参数名称说明
x接收array。表示用于绘制饼图的数据。无默认
explode接收array。表示指定项距离饼图圆心为n个半径。默认为None
labels接收array。指定每一项的名称。默认为None
color接收特定string或包含颜色字符串的array。表示饼图颜色,默认为None
autopct接收特定string。指定数值的显示方式。默认为None
pctdistance接收float。指定每一项的比例autopct和距离圆心的半径。默认为0.6
labeldistance接收float。指定每一项的比例autopct和距离圆心的半径。默认为1.1
radius接收float。表示饼图的半径,默认为1

绘制2017年第一季度各产业国民生成总值饼图

import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(6,6))## 将画布设定为正方形,则绘制的饼图是正圆
label= ['第一产业','第二产业','第三产业']## 定义饼状图的标签,标签是列表
explode = [0.01,0.01,0.01]## 设定各项离心n个半径
plt.pie(values[-1,3:6],explode=explode,labels=label,
        autopct='%1.1f%%')## 绘制饼图
plt.title('2017年第一季度各产业国民生产总值饼图')
plt.savefig('C:/Users/Lenovo/jupyter/pic/2017年第一季度各产业生产总值占比饼图')
plt.show()

输出:
在这里插入图片描述
上图可以看出3个产业在整个国民生成总值中的占比,第一产业不到5%,第三产业超过50%,说明现阶段我国经济的主要贡献产业为第三产业。

3 绘制箱线图

箱线图能提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异。如下图
在这里插入图片描述
箱线图利用数据中的5个统计量:最小值,下四分位数、中位数、上四分位数和最大值,来描述数据,他也可以数据是否具有对称性、分布的分散程度等信息,特别是可以用于对几个样本的比较。

pyplot中绘制箱线图的函数为boxplot,函数形式为:

matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None,
 positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, 
 conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None,
 showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, 
 meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, 
 autorange=False, zorder=None, *, data=None)
                          

常用参数如下:

参数名称说明
x接收array。表示用于绘制箱线图的数据。无默认
notch接收boolean。表示中间箱体是否有缺口。默认为None
sym接收特定string。指定异常点形状。默认为None
vert接收特定boolean。表示图形式纵向或者横向。默认为None
positions接收array。表示图形位置。默认为None
widths接收saclar或array。表示每个箱体的宽度。默认为None
labels接收array。指定每一个箱线图的标签。默认为None
radius接收boolean。表示是否显示均值线,默认为False

绘制2000—2017各产业国民生成总值箱线图

label= ['第一产业','第二产业','第三产业']## 定义标签
gdp = (list(values[:,3]),list(values[:,4]),list(values[:,5]))
plt.figure(figsize=(6,4))
plt.boxplot(gdp,notch=True,labels = label, meanline=True)
plt.title('2000-2017各产业国民生产总值箱线图')
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017各产业国民生产总值箱线图.png')
plt.show()

输出:
在这里插入图片描述
上图可以看出,在2000—2017年,第一产业在某一年的某个季度具有一个异常值。第三产业整体增速变大,导致了第三产业数据前半部分相对密集,后半部分相对分散。

4 小案例实现

4.1 绘制国民生产总值构成分布直方图

通过直方图分析2000年第一季度和2017年第一季度的三大产业的国民生成总值,可以发现各产业绝对数值之间的关系和产业结构的变化。代码如下:

import numpy as np
import matplotlib.pyplot as plt
data = np.load('C:/Users/Lenovo/jupyter/data/国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns'] ## 提取其中的columns数组,视为数据的标签
values = data['values']## 提取其中的values数组,数据的存在位置
plt.rcParams['font.sans-serif'] = 'SimHei' ## 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
label1 = ['第一产业','第二产业','第三产业']## 刻度标签1
label2 = ['农业','工业','建筑','批发','交通',
        '餐饮','金融','房地产','其他']## 刻度标签2
p = plt.figure(figsize=(12,12))

## 子图1
ax1 = p.add_subplot(2,2,1)
plt.bar(range(3),values[0,3:6],width = 0.5)## 绘制散点图
plt.xlabel('产业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(3),label1)
plt.title('2000年第一季度国民生产总值产业构成分布直方图') 

## 子图2
ax2 = p.add_subplot(2,2,2)
plt.bar(range(3),values[-1,3:6],width = 0.5)## 绘制散点图
plt.xlabel('产业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(3),label1)
plt.title('2017年第一季度国民生产总值产业构成分布直方图') 

## 子图3
ax3 = p.add_subplot(2,2,3)
plt.bar(range(9),values[0,6:],width = 0.5)## 绘制散点图
plt.xlabel('行业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(9),label2)
plt.title('2000年第一季度国民生产总值行业构成分布直方图')## 添加图表标题

## 子图4
ax4 = p.add_subplot(2,2,4)
plt.bar(range(9),values[-1,6:],width = 0.5)## 绘制散点图
plt.xlabel('行业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(9),label2)
plt.title('2017年第一季度国民生产总值行业构成分布直方图')## 添加图表标题

## 保存并显示图形
plt.savefig('C:/Users/Lenovo/jupyter/pic/国民生产总值构成分布直方图.png')
plt.show()

输出:
在这里插入图片描述
通过代码看出,第一产业与第二产业和第三产业的国民生成总值差距愈发巨大。根据坐标轴变化可以发现,国民生产总值增长接近10倍。2000—2017年,金融行业与其他行业增长幅度相比较较明显。

4.2 绘制国民生成总值构成分布饼图

通过分析2000年与2017年不同的产业和行业在国民生产总值中的占比,可以发现我国的产业结构变化和行业变迁。

label1 = ['第一产业','第二产业','第三产业']## 标签1
label2 = ['农业','工业','建筑','批发','交通',
        '餐饮','金融','房地产','其他']## 标签2
explode1 = [0.01,0.01,0.01]
explode2 = [0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]
p = plt.figure(figsize=(12,12))

## 子图1
ax1 = p.add_subplot(2,2,1)
plt.pie(values[0,3:6],explode=explode1,labels=label1,
        autopct='%1.1f%%')## 绘制散点图
plt.title('2000年第一季度国民生产总值产业构成分布饼图') 

## 子图2
ax2 = p.add_subplot(2,2,2)
plt.pie(values[-1,3:6],explode=explode1,labels=label1,
        autopct='%1.1f%%')## 绘制散点图
plt.title('2017年第一季度国民生产总值产业构成分布饼图') 

## 子图3
ax3 = p.add_subplot(2,2,3)
plt.pie(values[0,6:],explode=explode2,labels=label2,
        autopct='%1.1f%%')## 绘制散点图
plt.title('2000年第一季度国民生产总值行业构成分布饼图')## 添加图表标题

## 子图4
ax4 = p.add_subplot(2,2,4)
plt.pie(values[-1,6:],explode=explode2,labels=label2,
        autopct='%1.1f%%')## 绘制散点图
plt.title('2017年第一季度国民生产总值行业构成分布饼图')## 添加图表标题

## 保存并显示图形
plt.savefig('C:/Users/Lenovo/jupyter/pic/国民生产总值构成分布饼图.png')
plt.show()

输出:
在这里插入图片描述
上图可以看出,2000—2017年,第三产业在整个国民生产总值中的占比约提高了10%,第一产业和第二产业在国民生产总值中的占比分别下降了约4%和6%。工业在整个国民生产总值中的比例下降7%,其他行业与金融行业则分别提升了6.7%与3.7%

4.3 绘制国民生产总值分散情况箱线图

通过箱线图分析2000—2017年不同的产业和行业在国民生产总值中的分散情况,从而判断整体增速是否加快。

label1 = ['第一产业','第二产业','第三产业']## 标签1
label2 = ['农业','工业','建筑','批发','交通',
        '餐饮','金融','房地产','其他']## 标签2
gdp1 = (list(values[:,3]),list(values[:,4]),list(values[:,5]))
gdp2 = ([list(values[:,i]) for i in range(6,15)])
p = plt.figure(figsize=(8,8))

## 子图1
ax1 = p.add_subplot(2,1,1)
## 绘制散点图
plt.boxplot(gdp,notch=True,labels = label1, meanline=True)
plt.title('2000-2017各产业国民生产总值箱线图')
plt.ylabel('生产总值(亿元)')## 添加y轴名称

## 子图2
ax2 = p.add_subplot(2,1,2)
## 绘制散点图
plt.boxplot(gdp2,notch=True,labels = label2, meanline=True)
plt.title('2000-2017各行业国民生产总值箱线图')
plt.xlabel('行业')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称

## 保存并显示图形
plt.savefig('C:/Users/Lenovo/jupyter/pic/国民生产总值分散情况箱线图.png')
plt.show()

输出:
在这里插入图片描述
如上图,整体经济趋势是上升的,结合箱线图可以看出产业中的第二产业增长平缓。行业中的工业与餐饮业的增长比较平缓,其他行业、批发行业、建筑行业、金融行业和房地产行业增速均有所加快。

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值