实训1分析1996~2015年人口数据特征间的关系(详细版)

实训1

    • 实训1分析1996~2015年人口数据特征间的关系
      • 1.训练要点
      • 2.需求说明
      • 3.实现步骤
        • (1)使用 NumPy 库读取人口数据。
        • (2)创建画布,并添加子图。
        • (3)在两个子图上分别绘制散点图和折线图。
        • (4)保存,显示图片。
        • (5)分析未来人口变化趋势。
        • *下面给出完整代码:*

实训2分析1996~2015年人口数据各个特征的分布与分散状况(详细版)
链接: https://blog.csdn.net/XQC_KKK/article/details/123947369.

实训1分析1996~2015年人口数据特征间的关系

1.训练要点

(1)掌握 pyplot 基础语法。
(2)掌握子图的绘制方法。
(3)掌握散点图、折线图的绘制方法。

2.需求说明

人口数据总共拥有6个特征,分别为年末总人口、男性人口、女性人口、城镇人口、乡村人口和年份。查看各个特征随着时间推移发生的变化情况可以分析出未来男女人口比例、城乡人口变化的方向。

3.实现步骤

(1)使用 NumPy 库读取人口数据。

引入包

import numpy as np
import matplotlib.pyplot as plt

读取数据

data = np.load('..\Code02\populations.npz', allow_pickle=True)
# 这里的地址根据你文件存放的具体位置而定
print(data.files)  # 查看文件中的数组
print(data['data'])
print(data['feature_names'])

输出内容:

['data', 'feature_names']
[['2015年' 137462.0 70414.0 67048.0 77116.0 60346.0]
 ['2014年' 136782.0 70079.0 66703.0 74916.0 61866.0]
 ['2013年' 136072.0 69728.0 66344.0 73111.0 62961.0]
 ['2012年' 135404.0 69395.0 66009.0 71182.0 64222.0]
 ['2011年' 134735.0 69068.0 65667.0 69079.0 65656.0]
 ['2010年' 134091.0 68748.0 65343.0 66978.0 67113.0]
 ['2009年' 133450.0 68647.0 64803.0 64512.0 68938.0]
 ['2008年' 132802.0 68357.0 64445.0 62403.0 70399.0]
 ['2007年' 132129.0 68048.0 64081.0 60633.0 71496.0]
 ['2006年' 131448.0 67728.0 63720.0 58288.0 73160.0]
 ['2005年' 130756.0 67375.0 63381.0 56212.0 74544.0]
 ['2004年' 129988.0 66976.0 63012.0 54283.0 75705.0]
 ['2003年' 129227.0 66556.0 62671.0 52376.0 76851.0]
 ['2002年' 128453.0 66115.0 62338.0 50212.0 78241.0]
 ['2001年' 127627.0 65672.0 61955.0 48064.0 79563.0]
 ['2000年' 126743.0 65437.0 61306.0 45906.0 80837.0]
 ['1999年' 125786.0 64692.0 61094.0 43748.0 82038.0]
 ['1998年' 124761.0 63940.0 60821.0 41608.0 83153.0]
 ['1997年' 123626.0 63131.0 60495.0 39449.0 84177.0]
 ['1996年' 122389.0 62200.0 60189.0 37304.0 85085.0]
 [nan nan nan nan nan nan]
 [nan nan nan nan nan nan]]
['时间' '年末总人口(万人)' '男性人口(万人)' '女性人口(万人)' '城镇人口(万人)' '乡村人口(万人)']

这里可以看到存在两行异常数据,需要对其进行处理

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

(2)创建画布,并添加子图。

散点图部分:

p1 = plt.figure(figsize=(10, 10))  # 确定画布大小
pip1 = p1.add_subplot(211)  # 创建一个两行一列的子图并开始绘制
plt.subplots_adjust(hspace=0, wspace=0)  # 将两个子图中间间隔设置为“0”
pip2 = p1.add_subplot(212)  # 绘制子图2

折线图部分:

p2 = plt.figure(figsize=(10, 10))  # 确定画布大小
p1 = p2.add_subplot(211)  # 创建一个两行一列的子图并开始绘制
plt.subplots_adjust(hspace=0, wspace=0)  # 将两个子图中间间隔设置为“0”
p2 = p2.add_subplot(212)  # 绘制子图2

(3)在两个子图上分别绘制散点图和折线图。

对数据进行预处理

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

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

1、散点图部分:

绘制第一个带有渐变色散点子图

colors = values[:, 1] * 100
sValue = values[:, 1].astype(int)  # 设置散点大小随数值大小变化而变化
plt.scatter(values[:, 0], values[:, 1], c=colors, marker='o', s=sValue * 0.001)

设置第1个散点子图,标签及相关样式

for i in range(len(values)):
    plt.annotate(int(values[i, 1]), xy=(values[i, 0], values[i, 1]),
                 xytext=(int(values[i, 0]), int(values[i, 1])))
plt.ylabel('人口(万人)')
plt.legend(['中国人口数'])
plt.title('1996~2015年末与各类人口散点图')

设置第2个散点子图,标签及相关样式

plt.scatter(values[:, 0], values[:, 2], marker='x', color='deepskyblue', s=80)
plt.scatter(values[:, 0], values[:, 3], marker='o', color='none', edgecolors='orangered', s=100)
plt.scatter(values[:, 0], values[:, 4], marker='d', color='cornflowerblue', s=100)
plt.scatter(values[:, 0], values[:, 5], marker='*', color='darkorange', s=130)
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.xticks(rotation=45)  # 设置倾斜角度
plt.legend(['男性', '女性', '城镇', '乡村'])

2、折线图部分

绘制第一个折线子图

plt.plot(values[:, 0], values[:, 1], color='r', marker='o', linestyle='--')

设置第1个折线子图,标签及相关样式

for i in range(20):
    plt.annotate(int(values[i, 1]), xy=(values[i, 0], values[i, 1]),
                 xytext=(int(values[i, 0]) + 1, int(values[i, 1])))
    # 在图上标注数字
plt.ylabel('人口(万人)')
plt.legend(['中国人口数'])
plt.title('1996~2015年末与各类人口折线图')

设置第2个折线子图,标签及相关样式

plt.plot(values[:, 0], values[:, 2], marker='p', color='deepskyblue', linestyle='--')
plt.plot(values[:, 0], values[:, 3], marker='o', color='orangered', linestyle='--')
plt.plot(values[:, 0], values[:, 4], marker='d', color='cornflowerblue', linestyle='--')
plt.plot(values[:, 0], values[:, 5], marker='*', color='darkorange', linestyle='--')
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.xticks(rotation=45)  # 设置倾斜角度
plt.legend(['男性', '女性', '城镇', '乡村'])

(4)保存,显示图片。

实训1分析1996~2015年人口数据特征间的关系(详细版)_第1张图片
实训1分析1996~2015年人口数据特征间的关系(详细版)_第2张图片

(5)分析未来人口变化趋势。

①在社会等相关环境保持不变的前提下,预计短期的未来中国人口总体会继续增长,但人口增速会有所放缓。鼓励和利好生育的相关政策一定程度上可以使人口增速有小幅度上升。
②在社会等相关环境保持不变的前提下,乡村人口预计在短期的未来会继续减少,乡村人口大量涌入城市,城市人口占据主体;在发展到一定程度后,乡村与城市人口会趋于某种比例的动态平衡。
③在社会等相关环境保持不变的前提下,人口性别比例将长时间保持男多女少的状况。

下面给出完整代码:

(注:代码中有部分注释内容是在绘图时使用调整过的一些方案)

import numpy as np
import matplotlib.pyplot as plt

# 实训1 分析1996~2015年人口数据特征间的关系
# 使用numpy库读取人口数据
data = np.load('..\Code02\populations.npz', allow_pickle=True)
print(data.files)  # 查看文件中的数组
print(data['data'])
print(data['feature_names'])
# data['data'][0:-2, :]  # ['data'][0:-2,:]删除最后两行缺失值
# print(data['data'][0:-2, :])

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

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

p1 = plt.figure(figsize=(10, 10))  # 确定画布大小
pip1 = p1.add_subplot(211)  # 创建一个两行一列的子图并开始绘制
# 在子图上绘制散点图

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

# cValue_1 = ['r', 'c', 'g', 'b', 'r', 'y', 'g', 'b', 'm']
# plt.scatter(values[:, 0], values[:, 1], color=cValue_1, marker='o')
colors = values[:, 1] * 100
sValue = values[:, 1].astype(int)  # 设置散点大小随数值大小变化而变化
plt.scatter(values[:, 0], values[:, 1], c=colors, marker='o', s=sValue * 0.001)
# plt.colorbar()
for i in range(len(values)):
    plt.annotate(int(values[i, 1]), xy=(values[i, 0], values[i, 1]),
                 xytext=(int(values[i, 0]), int(values[i, 1])))
# 这里[s.replace("年", "") for s in values[:, 0]]的意思是将第一列数据中的“年”字剔除
plt.ylabel('人口(万人)')
# plt.xlabel('时间(年)')
plt.legend(['中国人口数'])

# plt.xticks(values[:, 0], ())  # 不显示x轴数值
# plt.xticks([])  # x轴数值影藏
# plt.xticks(rotation=45)  # 设置倾斜角度
plt.title('1996~2015年末与各类人口散点图')
# plt.style.use('seaborn-notebook')

plt.subplots_adjust(hspace=0, wspace=0)  # 将两个子图中间间隔设置为“0”

pip2 = p1.add_subplot(212)  # 绘制子图2
plt.scatter(values[:, 0], values[:, 2], marker='x', color='deepskyblue', s=80)
plt.scatter(values[:, 0], values[:, 3], marker='o', color='none', edgecolors='orangered', s=100)
plt.scatter(values[:, 0], values[:, 4], marker='d', color='cornflowerblue', s=100)
plt.scatter(values[:, 0], values[:, 5], marker='*', color='darkorange', s=130)
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.xticks(rotation=45)  # 设置倾斜角度
plt.legend(['男性', '女性', '城镇', '乡村'])

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

p2 = plt.figure(figsize=(10, 10))  # 确定画布大小
p1 = p2.add_subplot(211)  # 创建一个两行一列的子图并开始绘制
# 在子图上绘制折线图

plt.plot(values[:, 0], values[:, 1], color='r', marker='o', linestyle='--')
# plt.colorbar()
for i in range(20):
    plt.annotate(int(values[i, 1]), xy=(values[i, 0], values[i, 1]),
                 xytext=(int(values[i, 0]) + 1, int(values[i, 1])))
    # 在图上标注数字
plt.ylabel('人口(万人)')
plt.legend(['中国人口数'])

# plt.xticks(values[:, 0], ())  # 不显示x轴数值
# plt.xticks([])  # x轴数值影藏
# plt.xticks(rotation=45)  # 设置倾斜角度
plt.title('1996~2015年末与各类人口折线图')
# plt.style.use('seaborn-notebook')

plt.subplots_adjust(hspace=0, wspace=0)  # 将两个子图中间间隔设置为“0”

p2 = p2.add_subplot(212)  # 绘制子图2
plt.plot(values[:, 0], values[:, 2], marker='p', color='deepskyblue', linestyle='--')
plt.plot(values[:, 0], values[:, 3], marker='o', color='orangered', linestyle='--')
plt.plot(values[:, 0], values[:, 4], marker='d', color='cornflowerblue', linestyle='--')
plt.plot(values[:, 0], values[:, 5], marker='*', color='darkorange', linestyle='--')
plt.xlabel('时间(年)')
plt.ylabel('人口(万人)')
plt.xticks(rotation=45)  # 设置倾斜角度
plt.legend(['男性', '女性', '城镇', '乡村'])

# 显示图片
# plt.style.use('ggplot')
plt.show()

你可能感兴趣的:(Matplotlib,python)