实训2分析1996~2015年人口数据各个特征的分布与分散状况(详细版)

实训1分析1996~2015年人口数据特征间的关系(详细版)
链接: https://blog.csdn.net/XQC_KKK/article/details/123935134.

实训2分析1996~2015年人口数据各个特征的分布与分散状况

1.训练要点

(1)掌握直方图绘制。
(2)掌握饼图绘制。
(3)掌握箱线图绘制。

2.需求说明

通过绘制各年份男女人口数目及城乡人口数目的直方图,男女人口比例及城乡人口比例的饼图可以发现人口结构的变化。而绘制每个特征的箱线图则可以发现不同特征增长或者减少的速率是否变得缓慢。

3.实现步骤

(1)创建3幅画布并添加对应数目的子图。
# 1.直方图
p1 = plt.figure(figsize=(12, 10))  # 设置画布大小
a1 = p1.add_subplot(211)
b1 = p1.add_subplot(212)
# 2.饼图
p2 = plt.figure(figsize=(8, 8))
a2 = p2.add_subplot(221)
b2 = p2.add_subplot(222)
c2 = p2.add_subplot(223)
d2 = p2.add_subplot(224)
p3 = plt.figure(figsize=(8, 8))
(2)在每一幅子图上绘制对应的图形。

总体准备

import numpy as np
import matplotlib.pyplot as plt

# 实训2分析1996~2015年人口数据各个特征的分布与分散状况
# 使用numpy库读取人口数据
data = np.load('..\Code02\populations.npz', allow_pickle=True)
print(data.files)  # 查看文件中的数组
print(data['data'])
print(data['feature_names'])

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

name = data['feature_names']  # 提取其中的feature_names数组,视为数据的标签
values = data['data'][0:-2, :]  # 提取其中的data数组,视为数据的存在位置
values2 = data['data'][0:-2, :]
print(values)

label1 = ['男性', '女性']  # 标签
label2 = ['城镇', '乡村']


# 写一个逆序方法
def reverse_array(arr):
    n = len(arr)
    for i in range(int(n / 2)):
        arr[i], arr[n - i - 1] = arr[n - i - 1], arr[i]
    return arr


for i in range(20):
    values[i, 0] = values[i, 0].replace("年", "")  # 去除第一列的汉字

ex = [0.01, 0.01]  # 饼图:设定各项距离圆心n个半径

①柱形图(之前在这里写成了直方图,后面发现错了现在改正)

bar_width = 0.4  # 设置分组条形的宽度
# 子图1
a1 = p1.add_subplot(211)
reverse_array(values[:, 0])
reverse_array(values[:, 3])  # 调用逆序方法
reverse_array(values[:, 2])

柱形图第1个子图

plt.bar(np.arange(len(values[:, 0])), values[:, 2], width=bar_width,
        color='steelblue', label=label1[0], alpha=0.7)
plt.bar(np.arange(len(values[:, 0])) + bar_width, values[:, 3],
        color='indianred', width=bar_width, label=label1[1], alpha=0.7)

plt.ylabel('人口(万人)')
plt.ylim(40000, 80000)  # 设置当前图形y轴的范围
plt.xlabel('时间(年)')
plt.xticks(np.arange(20) + bar_width / 2, values[:, 0], rotation=45)
# 添加图例
plt.legend()
plt.title('1996~2015年男、女人口数直方图')  
plt.subplots_adjust(hspace=0.3, wspace=0)  # 控制子图距离

柱形图第2个子图

reverse_array(values[:, 4])  # 调用逆序方法
reverse_array(values[:, 5])
plt.bar(np.arange(len(values[:, 0])), values[:, 4], width=bar_width,
        color='orange', label=label2[0], alpha=0.7)
plt.bar(np.arange(len(values[:, 0])) + bar_width, values[:, 5],
        color='indianred', width=bar_width, label=label2[1], alpha=0.7)
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.ylim(10000, 100000)
plt.xticks(np.arange(20) + bar_width / 2, values[:, 0], rotation=45)
# 添加图例
plt.legend()
plt.title('1996~2015年城、乡人口数直方图')

②饼图

# 子图1
a2 = p2.add_subplot(221)
plt.pie(values2[19, 2:4], explode=ex, labels=label1,
        colors=['steelblue', 'indianred'], autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')
# 子图2
b2 = p2.add_subplot(222)
plt.pie(values2[0, 2:4], explode=ex, labels=label1,
        colors=['steelblue', 'indianred'], autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')
# 子图3
c2 = p2.add_subplot(223)
plt.pie(values2[19, 4:6], explode=ex, labels=label2,
        colors=['orange', 'indianred'], autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')
# 子图4
d2 = p2.add_subplot(224)
plt.pie(values2[0, 4:6], explode=ex, labels=label2,
        colors=['orange', 'indianred'], autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')

③箱线图

# 3.箱线图
p3 = plt.figure(figsize=(8, 8))
plt.boxplot(values2[0:20, 1:6], notch=True,
            labels=['总人口', '男性', '女性', '城镇', '乡村'], meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')
(3)保存和显示图形。

①柱形图
请添加图片描述

②饼图
请添加图片描述

③箱线图
请添加图片描述

(4)根据图形,分析我国人口结构变化情况以及变化速率的增减状况。

1996至2015年我国男女人口持续增长,且始终保持男多女少的情况,总的来看2015年较1996年男性比例提高了0.4个百分点,可见我国性别比例失衡加剧。城镇人口稳步增长,乡村人口持续减少。城镇人口占比从原来的30.5%增加到了56.1%,乡村人口占比从原来的69.5%减少到了43.9%,农村人口大量涌入城市。从箱线图来看男性人口变化速率有减小趋势,女性人口变化速率则相对稳定。城镇和乡村的人口变化速率保持稳定。

项目完整代码
import numpy as np
import matplotlib.pyplot as plt

# 实训2分析1996~2015年人口数据各个特征的分布与分散状况
# 使用numpy库读取人口数据
data = np.load('..\Code02\populations.npz', allow_pickle=True)
print(data.files)  # 查看文件中的数组
print(data['data'])
print(data['feature_names'])

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

name = data['feature_names']  # 提取其中的feature_names数组,视为数据的标签
values = data['data'][0:-2, :]  # 提取其中的data数组,视为数据的存在位置
values2 = data['data'][0:-2, :]
print(values)

label1 = ['男性', '女性']  # 标签
label2 = ['城镇', '乡村']


# 写一个逆序方法
def reverse_array(arr):
    n = len(arr)
    for i in range(int(n / 2)):
        arr[i], arr[n - i - 1] = arr[n - i - 1], arr[i]
    return arr


for i in range(20):
    values[i, 0] = values[i, 0].replace("年", "")  # 去除第一列的汉字

ex = [0.01, 0.01]  # 饼图:设定各项距离圆心n个半径

# --------------------------------------------------------------------------------
# 1.直方图
p1 = plt.figure(figsize=(12, 10))  # 设置画布大小
bar_width = 0.4  # 设置分组条形的宽度
# 子图1
a1 = p1.add_subplot(211)
reverse_array(values[:, 0])
reverse_array(values[:, 3])  # 调用逆序方法
reverse_array(values[:, 2])
plt.bar(np.arange(len(values[:, 0])), values[:, 2], width=bar_width,
        color='steelblue', label=label1[0], alpha=0.7)
plt.bar(np.arange(len(values[:, 0])) + bar_width, values[:, 3],
        color='indianred', width=bar_width, label=label1[1], alpha=0.7)
# 堆叠直方图
# plt.bar(values[:, 0], values[:, 2], width=bar_width, color='orange')
# plt.bar(values[:,0], values[:, 3], bottom=values[:, 2],
# color='indianred', alpha=1, width=bar_width)

plt.ylabel('人口(万人)')
plt.ylim(40000, 80000)  # 设置当前图形y轴的范围
plt.xlabel('时间(年)')

plt.xticks(np.arange(20) + bar_width / 2, values[:, 0], rotation=45)
# 添加图例
plt.legend()
plt.title('1996~2015年男、女人口数直方图')

plt.subplots_adjust(hspace=0.3, wspace=0)  # 控制子图距离
# ------------------------------------------------------------------------
# 子图2
b1 = p1.add_subplot(212)
reverse_array(values[:, 4])  # 调用逆序方法
reverse_array(values[:, 5])
plt.bar(np.arange(len(values[:, 0])), values[:, 4], width=bar_width,
        color='orange', label=label2[0], alpha=0.7)
plt.bar(np.arange(len(values[:, 0])) + bar_width, values[:, 5],
        color='indianred', width=bar_width, label=label2[1], alpha=0.7)
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.ylim(10000, 100000)
plt.xticks(np.arange(20) + bar_width / 2, values[:, 0], rotation=45)
# 添加图例
plt.legend()
plt.title('1996~2015年城、乡人口数直方图')

# ------------------------------------------------------------------------

# 2.饼图
p2 = plt.figure(figsize=(8, 8))
print(values)
# 子图1
a2 = p2.add_subplot(221)
plt.pie(values2[19, 2:4], explode=ex, labels=label1,
        colors=['steelblue', 'indianred'], autopct='%1.1f%%')
plt.title('1996年男、女人口数饼图')

# 子图2
b2 = p2.add_subplot(222)
plt.pie(values2[0, 2:4], explode=ex, labels=label1,
        colors=['steelblue', 'indianred'], autopct='%1.1f%%')
plt.title('2015年男、女人口数饼图')

# 子图3
c2 = p2.add_subplot(223)
plt.pie(values2[19, 4:6], explode=ex, labels=label2,
        colors=['orange', 'indianred'], autopct='%1.1f%%')
plt.title('1996年城、乡人口数饼图')

# 子图4
d2 = p2.add_subplot(224)
plt.pie(values2[0, 4:6], explode=ex, labels=label2,
        colors=['orange', 'indianred'], autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')

# 3.箱线图
p3 = plt.figure(figsize=(8, 8))
plt.boxplot(values2[0:20, 1:6], notch=True,
            labels=['总人口', '男性', '女性', '城镇', '乡村'], meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')

# 显示
plt.show()

  • 22
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值