分析特征关系

具体题目1:分析1996~2015年人口数据特征间的关系
需求说明:人口数据总共拥有 6 个特征,分别为年末总人口、男性人口、女性人口、城镇人口、乡村人口和年份。查看各个特征随着时间推移发生的变化情况可以分析出未来男女人口比例、城乡人口变化的方向。

步骤:
(1)使用NumPy库读取人口数据。
(2)创建画布figsize=(12,12),并添加子图。
(3)在两个子图上分别绘制散点图其中(marker=’8’,color=’red’)和折线图。
(4)将绘制的散点图和折线图保存在当前文件夹下,分别为“image1.png”和“image2.png”。
(5)显示图片并分析未来人口变化趋势。

import numpy as np
import matplotlib.pyplot as plt

data = np.load('./data/populations.npz', allow_pickle=True)
print(data.files)
print(data['data'])
print(data['feature_names'])

plt.rcParams['font.sans-serif'] = 'SimHei'
name = data['feature_names']
values = data['data']

p1 = plt.figure(figsize=(12, 12))

picture1 = p1.add_subplot(2, 1, 1)
plt.scatter(values[0:20, 0], values[0:20, 1], marker='8', color='red')
plt.ylabel('总人口(万人)')
plt.legend('年末')
plt.title('1996~2015年末与各类人口散点图')

picture2 = p1.add_subplot(2, 1, 2)
plt.scatter(values[0:20, 0], values[0:20, 2], marker='o', color='yellow')
plt.scatter(values[0:20, 0], values[0:20, 3], marker='D', color='green')
plt.scatter(values[0:20, 0], values[0:20, 4], marker='p', color='blue')
plt.scatter(values[0:20, 0], values[0:20, 5], marker='s', color='purple')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20, 0])
plt.legend(['男性', '女性', '城镇', '乡村'])
plt.savefig('image1.png')


p2 = plt.figure(figsize=(12, 12))
p1 = p2.add_subplot(2, 1, 1)
plt.plot(values[0:20, 0], values[0:20, 1], color='r', linestyle='--', marker='8')
plt.ylabel('总人口(万人)')
plt.xticks(range(0, 20, 1), values[range(0, 20, 1), 0], rotation=45)  # rotation设置倾斜度
plt.legend('年末')
plt.title('1996~2015年末总与各类人口折线图')

p2 = p2.add_subplot(2, 1, 2)
plt.plot(values[0:20, 0], values[0:20, 2], 'y-')
plt.plot(values[0:20, 0], values[0:20, 3], 'g-.')
plt.plot(values[0:20, 0], values[0:20, 4], 'b-')
plt.plot(values[0:20, 0], values[0:20, 5], 'p-')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20, 0])
plt.legend(['男性', '女性', '城镇', '乡村'])
plt.savefig('image2.png')

plt.show()

效果图:
在这里插入图片描述

在这里插入图片描述

对于这个题目的理解:
对于本任务是将人口的数据先要读出来。为了后续的做出图的工作,那么先要将这个人口数据的表的内容打印出来,通过打印出来的内容和题目告知的可以知道,第一列是年份,也就是题目要求的1996-2015这些年份的信息,然后后面分别是总人口,男性人口,女性人口,城镇人口和乡村人口。那么就用一个value用来提取data数组,得到上述讲的信息。然后开始绘制第一个散点图,那么就要使用plt.scatter函数用来画散点图,那么x的坐标是1996-2015这19年,然后打印出年代。y轴则是第一列的消息,也就是要总人口,因为题目要求的就是总人口的数目,然后注意根据题目要求把标签,题目等都要写好。绘制第二个散点图的道理也是一样的,那么要注意的就是要用不同的颜色,以及对应的x,y坐标不能弄错了。然后是绘制折线图,与绘制散点图类似,要注意的就是要注意每一项对应的内容不能弄错了

题目2:分析1996~2015年人口数据各个特征的分布与分散状况 需求说明:通过绘制各年份男女人口数目及城乡人口数目的直方图,男女人口比例及城乡人口比例的饼图可以发现人口结构的变化。而绘制每个特征的箱线图则可以发现不同特征增长或者减少的速率是否变得缓慢。

任务二步骤:
(1)创建 3 幅画布并添加对应数目的子图
(2)在每一幅子图上绘制对应的图形
(3)保存和显示图形。将直方图、饼图、箱线图分别保存为image1.png、image2.png、image3.png
(4)根据图形,分析我国人口结构变化情况以及变化速率的增减情况

import numpy as np
import matplotlib.pyplot as plt

data = np.load('./data/populations.npz', allow_pickle=True)  # 读入数据
print(data['data'])  # 输出数据文件中的data数组
#name = data['feature_names']  # 提取其中的feature_names数组,视为数据的标签
values = data['data']  # 提取其中的data数组,视为数据的存在位置
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
label1 = ['男性', '女性']  # 标签
label2 = ['城镇', '乡村']
ex = [0.01, 0.01]  # 饼图:设定各项距离圆心n个半径

# 1.直方图
p1 = plt.figure(figsize=(12, 12))  # 设置画布大小
# 子图1
a1 = p1.add_subplot(2, 2, 1)
plt.bar(range(2), values[19, 2:4], width=0.5, color='orange')
plt.ylabel('人口(万人)')
plt.ylim(0, 80000)  # 设置当前图形y轴的范围
plt.xticks(range(2), label1)  # 指定x轴刻度的数目与取值
plt.title('1996年男、女人口数直方图')

# 子图2
b1 = p1.add_subplot(2, 2, 2)
plt.bar(range(2), values[0, 2:4], width=0.5, color='red')
plt.ylabel('人口(万人)')
plt.ylim(0, 80000)
plt.xticks(range(2), label1)
plt.title('2015年男、女人口数直方图')

# 子图3
c1 = p1.add_subplot(2, 2, 3)
plt.bar(range(2), values[19, 4:6], width=0.5, color='orange')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0, 90000)
plt.xticks(range(2), label2)
plt.title('1996年城、乡人口数直方图')

# 子图4
d1 = p1.add_subplot(2, 2, 4)
plt.bar(range(2), values[0, 4:6], width=0.5, color='red')
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.ylim(0, 90000)
plt.xticks(range(2), label2)
plt.title('2015年城、乡人口数直方图')
#plt.savefig('F:/data/tmp/1996、2015年各类人口直方图.png')  # 保存图片

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

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

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

# 子图4
d2 = p2.add_subplot(2, 2, 4)
plt.pie(values[0, 4:6], explode=ex, labels=label2, colors=['PeachPuff', 'skyblue'], autopct='%1.1f%%')
plt.title('2015年城、乡人口数饼图')
#plt.savefig('F:/data/tmp/1996、2015年各类人口饼图.png')

# 3.箱线图
p3 = plt.figure(figsize=(10, 10))
plt.boxplot(values[0:20, 1:6], notch=True, labels=['年末', '男性', '女性', '城镇', '乡村'], meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')
#plt.savefig('F:/data/tmp/1996`2015年各特征人口箱线图.png')

# 显示
plt.show()

对于本题的理解:
对于本任务则是根据数据然后分别画出直方图,饼图和箱线图。首先是直方图,用到的函数plt.bar(),要注意的是x,y数组的值,不同子图因为要描述的内容不一样,所以y数组对应的数组是不同的。这些就是根据打印出来的data数组里面的内容可以知道,所以在进行画图之前要把这些内容先打印出来。然后是饼图,那么饼图就要注意设定每一项距离圆心多少个半径的问题。然后还要注意每一个饼图的颜色,都需要进行根据题目去定每一个不同的颜色,汇出饼图用的函数是plt.pie(),而具体的颜色我是通过查阅网上的资料可以知道在bar函数当中,color这一项需要怎么定义。到了箱线图,则是根据题目的要求汇出来,那么用到的函数是plt.boxplot(),然后根据题目的要求是年末,男性,女性,城镇,乡村的人数,那么x数组就定义为values[0:20,1:6]即可。

效果图:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结一下:
1.plt.scatter()用来画散点图 注意它的参数 ,在我做这个题的时候主要是和那个npz文件有关,通过print知道里面数组的情况
2.plt.plot()就是用来画线
3.直方图plt.bar()
饼图plt.pie()
箱线图plt.boxplot()

猜你喜欢

转载自blog.csdn.net/mmmm0303/article/details/106224371