[Python]Numpy读取npz文件并且使用matplotlib绘制散点图和折线图

分析1996- -2015年人口数据特征间的关系以及各个特征的分布与分散状况

需求说明

人口数据总共拥有6个特征,分别为年末总人口、男性人口、女性人口、城镇人口、乡村人口和年份。在看各个特征随着时间推移发生的变化情况可以分析出未来男女人口比例、城乡人口变化的方向。通过绘制各年份男女人口数目及城乡人口数目的柱状图,男女人口比例及城乡人口比例的饼图可以发现人口结构的变化。而绘制每个特征的箱线图则可以发现不同特征增长成者减少的速率是否变得级慢。

训练要点

掌握pyplot基础语法,掌握子图的绘制方法。
掌握散点图、折线图、柱状图、饼图、箱线图的绘制方法。

具体实现

打开npz文件

因为npz是压缩的格式,里面会包含npy格式的文件,不可直接访问npz,numpy提供了方法可以访问

import numpy as np
import matplotlib.pyplot as plt

# allow_pickle = True后才可打开,因为numpy版本过高
Alldata = np.load('populations.npz',allow_pickle = True)

Run
然后在终端上输入

Alldata.files

即可看见此npz文件下的所有npy文件
此项目里包含“data”和“feature_names”两个文件

完整代码

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'# 设置中文显示
plt.rcParams['axes.unicode_minus'] = False

# 读取数据文件
Alldata = np.load('populations.npz',allow_pickle = True)# allow_pickle = True后才可打开,因为numpy版本过高
data = Alldata['data']
features = Alldata['feature_names']

# 颜色数组,用于区分
col = ['y','r','b','g','purple']

ex=[0.01,0.01]#饼图:设定各项距离圆心n个半径
label1=['男性','女性']# 标签
label2=['城镇','乡村']# 标签
labelAll=['年末总人口','男性人口','女性人口','城镇人口','乡村人口']# 标签

# 删除日期里的汉字,使图片看起来简洁
for i in range(19,-1,-1):
   data[i][0] = data[i][0][:-1]
    
# 创建x轴,即年份
x = []
for i in range(19,-1,-1):
    x.append(data[i][0])

# 总人口
y1 = []
for i in range(19,-1,-1):
    y1.append(data[i][1])
    
# 男性人口
y2 = []
for i in range(19,-1,-1):
    y2.append(data[i][2])
    
# 女性人口
y3 = []
for i in range(19,-1,-1):
    y3.append(data[i][3])
    
# 城镇人口
y4 = []
for i in range(19,-1,-1):
    y4.append(data[i][4])
    
# 农村人口
y5 = []
for i in range(19,-1,-1):
    y5.append(data[i][5])
    
y = [y1,y2,y3,y4,y5]

# 设置画布1:散点图和折线图a
p1 = plt.figure(figsize=(12,12))

# 子图1
a1 = p1.add_subplot(2,1,1)
for i in range(0,5):
    plt.scatter(x,y[i],c = col[i])
plt.xlabel('年份') # x轴标签   
plt.ylabel('人口数量(万人)') # y轴标签
plt.title('散点图') # 子图1题目
plt.legend(['年末总人口','男性人口','女性人口','城镇人口','乡村人口'])# 添加图例

# 子图2
a2 = p1.add_subplot(2,1,2)
for i in range(0,5):
    plt.plot(x,y[i],marker = 'x',mec = col[i])
plt.xlabel('年份') # x轴标签
plt.ylabel('人口数量(万人)') # y轴标签
plt.title('折线图') # 子图2题目
plt.legend(['年末总人口','男性人口','女性人口','城镇人口','乡村人口'])# 添加图例

plt.savefig('散点及折线图.png')# 保存图片

# 设置画布2:直方图b
p2 = plt.figure(figsize=(24,12))

# 子图1
b1 = p2.add_subplot(2,2,1)
plt.bar(range(20),y2,width=0.5)# 绘制直方图
plt.xlabel('年份') # x轴标签
plt.ylabel('人口数量(万人)') # y轴标签
plt.xticks(range(20),x)# x轴刻度以及取值
plt.title('男性人口数量直方图') # 子图题目

# 子图2
b2 = p2.add_subplot(2,2,2)
plt.bar(range(20),y3,width=0.5)# 绘制直方图
plt.xlabel('年份') # x轴标签
plt.ylabel('人口数量(万人)') # y轴标签
plt.xticks(range(20),x)# x轴刻度以及取值
plt.title('女性人口数量直方图') # 子图题目

# 子图3
b3 = p2.add_subplot(2,2,3)
plt.bar(range(20),y4,width=0.5)# 绘制直方图
plt.xlabel('年份') # x轴标签
plt.ylabel('人口数量(万人)') # y轴标签
plt.xticks(range(20),x)# x轴刻度以及取值
plt.title('城镇人口数量直方图') # 子图题目

# 子图4
b4 = p2.add_subplot(2,2,4)
plt.bar(range(20),y5,width=0.5)# 绘制直方图
plt.xlabel('年份') # x轴标签
plt.ylabel('人口数量(万人)') # y轴标签
plt.xticks(range(20),x)# x轴刻度以及取值
plt.title('乡村人口数量直方图') # 子图题目

plt.savefig('各类人口直方图.png')

# 设置画布3:饼图c
p3 = plt.figure(figsize=(8,8))

# 子图1
c1 = p3.add_subplot(2,2,1)
plt.pie(data[19,2:4],explode=ex,labels=label1,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')

# 子图2
c2 = p3.add_subplot(2,2,2)
plt.pie(data[0,2:4],explode=ex,labels=label1,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')

# 子图3
c3 = p3.add_subplot(2,2,3)
plt.pie(data[19,4:6],explode=ex,labels=label2,colors=['pink','crimson'],autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')

# 子图4
c4 = p3.add_subplot(2,2,4)
plt.pie(data[0,4:6],explode=ex,labels=label2,colors=['PeachPuff','skyblue'],autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')

plt.savefig('1996、2015年各类人口饼图.png')

# 设置画布4:箱线图d
p4 = plt.figure(figsize=(8,8))
plt.boxplot(data[0:20,1:6],notch=True,labels=labelAll,meanline=True)
plt.xlabel('年份') # x轴标签   
plt.ylabel('人口数量(万人)') # y轴标签
plt.title('1996~2015年各特征人口箱线图') # 箱线图题目

plt.savefig('箱线图.png')

plt.show()# 显示在终端上

最终结果

散点图和折线图
在这里插入图片描述
直方图:
在这里插入图片描述
饼图
在这里插入图片描述
箱线图
在这里插入图片描述

  • 31
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值