实训1分析1996~2015年人口数据特征间的关系(详细版)
链接: https://blog.csdn.net/XQC_KKK/article/details/123935134.
(1)掌握直方图绘制。
(2)掌握饼图绘制。
(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))
总体准备
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年各特征人口箱线图')
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()