您的位置:首页 > 编程语言 > Python开发

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

2020-02-17 04:29 399 查看

分析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()# 显示在终端上

    最终结果

    散点图和折线图

    直方图:

    饼图

    箱线图

    • 点赞 1
    • 收藏
    • 分享
    • 文章举报
    DicoY 发布了1 篇原创文章 · 获赞 1 · 访问量 41 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: