Python数据分析第三章作业 Matplotlib

题目来源: <<Python数据分析与应用>> 人民邮电出版社 张良均等编著
最后一次编辑时间: 2019-8-8

子图未画全, 需要绘制子图中的子图, 把饼图都画全了
箱线图未画, 等学习完箱线图再补上

题目

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

2.实现步骤:
(1)使用Numpy库读取人口数据;
(2)创建画布,并添加子图;
(3)在两个子图上分别绘制散点图和折线图
(4)保存,显示图片;
(5)分析未来人口变化趋势。

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

2.实现步骤
(1)创建3幅画布并添加对应数目的子图;
(2)在每一幅子图上绘制对应的图形;
(3)保存和显示图形;
(4)根据图形,分析我国人口结构变化情况以及变化速率的增减状况。






解答

任务1

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
population_data = np.load('./data/populations.npz')
population_data
<numpy.lib.npyio.NpzFile at 0x1b914df06d8>

查看键

for i in population_data.keys():
    print(i)
data
feature_names
p_data = population_data['data']
p_feature = population_data['feature_names']
p_data
array([['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]], dtype=object)
p_data.shape
(22, 6)
p_feature
array(['时间', '年末总人口(万人)', '男性人口(万人)', '女性人口(万人)', '城镇人口(万人)', '乡村人口(万人)'],
      dtype=object)

去除空值

p_data = p_data[:-2]
p_data 
array([['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]],
      dtype=object)
p = plt.figure(figsize=(14,12))
ax1 = p.add_subplot(2, 1, 1)
plt.scatter(p_data[::-1,0], p_data[::-1, 1], marker='v', c='r')
plt.scatter(p_data[::-1,0], p_data[::-1, 2], marker='*', c='b')
plt.scatter(p_data[::-1,0], p_data[::-1, 3], marker='h', c='g')
plt.scatter(p_data[::-1,0], p_data[::-1, 4], marker='d', c='y')
plt.scatter(p_data[::-1,0], p_data[::-1, 5], marker=',', c='c')
plt.legend(p_feature)
plt.xticks(range(0,20), p_data[::-1,0], rotation=30)

ax2 = p.add_subplot(2, 1, 2)
plt.plot(p_data[::-1,0], p_data[::-1, 1], marker='v', c='r')
plt.plot(p_data[::-1,0], p_data[::-1, 2], marker='*', c='b')
plt.plot(p_data[::-1,0], p_data[::-1, 3], marker='h', c='g')
plt.plot(p_data[::-1,0], p_data[::-1, 4], marker='d', c='y')
plt.plot(p_data[::-1,0], p_data[::-1, 5], marker=',', c='c')
plt.legend(p_feature)
plt.xticks(range(0,20), p_data[::-1,0], rotation=30)
plt.savefig('1996-2015年人口数据特征之间的关系')
plt.show()

图片说明

任务2

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
population_data = np.load('./data/populations.npz')
population_data
<numpy.lib.npyio.NpzFile at 0x2b7f62035f8>

查看键

for i in population_data.keys():
    print(i)
data
feature_names
p_data = population_data['data']
p_feature = population_data['feature_names']
p_data
array([['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]], dtype=object)
p_data.shape
(22, 6)
p_feature
array(['时间', '年末总人口(万人)', '男性人口(万人)', '女性人口(万人)', '城镇人口(万人)', '乡村人口(万人)'],
      dtype=object)

去除空值

p_data = p_data[:-2]
p_data 
array([['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]],
      dtype=object)
p = plt.figure(figsize=(16,15), dpi=300)

# 子图1 男女人口数目直方图
ax1 = p.add_subplot(4,1,1)
# 绘制男性
plt.bar(np.arange(11), p_data[::-1 ,2][0:11], width=0.2, color='g')
# 绘制女性
plt.bar(np.arange(11) + 0.2, p_data[::-1 ,3][0:11], width=0.2, color='c')
plt.title('2005年-2015年共11年男女人口数据对比直方图')
plt.xticks(np.arange(11) + 0.1, p_data[::-1, 0], rotation=45)
plt.xlabel('年份')
plt.ylabel('人口数目')
plt.legend(['男生人口', '女生人口'], loc='upper left')
plt.ylim([0, 80000])

# 子图2, 城乡人口数目直方图
ax2 = p.add_subplot(4,1,2)
# 绘制男性
plt.bar(np.arange(11), p_data[::-1 ,4][0:11], width=0.2, color='g')
# 绘制女性
plt.bar(np.arange(11) + 0.2, p_data[::-1 ,5][0:11], width=0.2, color='c')
plt.title('2005年-2015年共11年城乡人口数据对比直方图')
plt.xticks(np.arange(11) + 0.1, p_data[::-1, 0], rotation=45)
plt.xlabel('年份')
plt.ylabel('人口数目')
plt.legend(['城镇人口', '乡村人口'], loc='upper left')
plt.ylim([0, 110000])

# 子图3 男女人口饼图
labels = ['男性人口', '女性人口']
ax3 = p.add_subplot(4,1,3)
plt.pie([p_data[::-1 ,2][0], p_data[::-1 ,3][0]], explode=[0, 0.1],startangle=45, labels=labels, autopct='%1.1f%%')
plt.title('2015年男女人口数据对比饼图')
plt.legend()
# 让饼图保持圆形
plt.axis('equal')

# 子图4 箱线图
# TODO

# 调整子图之间的间隙
plt.subplots_adjust(wspace =0, hspace =0.5)
plt.show()

图片说明