文章目录
- 利用Python中的Matplotlib,绘制2000年以来中国人口出生率、死亡率及增长率趋势图
- 项目任务
- 一、步骤分析
- 1.下载并导入库
- 2.解决中文乱码问题
- 3.获取基础数据
- 4.绘制交错柱状图
- 5.绘制折线图
- 6.最终结果
- 二、全部代码
项目任务
项目任务:基于数据,请利用Python中的Matplotlib模块,绘制2000年以来中国人口出生率、死亡率及增长率趋势图,效果入下图所示。(此图仅提供示范。颜色、字体、文字、数据范围等细节不要求和此图完全一样):
一、步骤分析 1.下载并导入库
下载库的方法不再赘述,直接导入
import numpy as np import matplotlib.pyplot as plt import seaborn as sns import pandas as pd2.解决中文乱码问题
代码如下:
# 处理中文乱码为 微软雅黑 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 解决Seaborn中文显示问题,字体为黑体,使用seaborn默认主题 sns.set(font='SimHei')
有五种seaborn的风格,它们分别是:darkgrid, whitegrid, dark, white, ticks。它们各自适合不同的应用和个人喜好。默认的主题是darkgrid。
3.获取基础数据数据并不庞大,直接手动输入:
# 出生率
natality = (14.03, 13.38, 12.86, 12.41, 12.29, 12.40, 12.09, 12.10, 12.14, 11.95,
11.90, 13.27, 14.57, 13.03, 13.83, 11.99, 13.57, 12.64, 10.86, 10.41, 8.52)
# 死亡率
mortality = (6.45, 6.43, 6.41, 6.40, 6.42, 6.51, 6.81, 6.93, 7.06, 7.08,
7.11, 7.14, 7.13, 7.13, 7.12, 7.07, 7.04, 7.06, 7.08, 7.09, 7.07)
# 自然增长率
natural_growth = [7.58, 6.95, 6.15, 6.01, 5.87, 5.89, 5.28, 5.17, 5.08, 4.87,
4.79, 6.13, 7.43, 5.90, 6.71, 4.93, 6.53, 5.58, 3.78, 3.32, 1.45]
4.绘制交错柱状图
首先将出生率 natality 的长度存储到变量 ind 中,用于调整图像的大小及位置;
设置柱状图宽度为0.4 ;
定义标题、标签、字体以及图例;
绘制交错柱状图
ind = np.arange(len(natality)) # 获取数组长度
width = 0.4 # 设置柱状图宽度为 0.4
fig, ax1 = plt.subplots()
# 绘制交错的柱状图(通过ind +- width/2)
rects1 = ax1.bar(ind - width/2, natality, width,
color='SkyBlue', label='出生率')
rects2 = ax1.bar(ind + width/2, mortality, width,
color='IndianRed', label='死亡率')
# 定义标题和标签
ax1.set_title('2000年以来中国人口出生率、死亡率及增长率变化', fontsize=15)
ax1.set_xticks(ind)
ax1.set_xticklabels(range(2000, 2021, 1), rotation=45) # 修改年份显示问题(倾斜字体)
plt.legend()
需要注意的,上述代码中通过ind - width/2 和 ind + width/2 调整两个柱状图的距离和位置;定义x轴时由于数据密集导致显示杂乱,将x轴字体倾斜45°
5.绘制折线图
组合图必须加入 ax2 = ax1.twinx() 才能保证在一幅图上
# twinx共享x轴(类似的语法,如共享y轴twiny) ax2 = ax1.twinx() # 绘制折线图 s = pd.Series(natural_growth, name='自然增长率——') sns.lineplot(data=s) # 显示图像 plt.show()6.最终结果 二、全部代码
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 处理中文乱码为 微软雅黑
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决Seaborn中文显示问题,字体为黑体,使用seaborn默认主题
sns.set(font='SimHei')
# 出生率
natality = (14.03, 13.38, 12.86, 12.41, 12.29, 12.40, 12.09, 12.10, 12.14, 11.95,
11.90, 13.27, 14.57, 13.03, 13.83, 11.99, 13.57, 12.64, 10.86, 10.41, 8.52)
# 死亡率
mortality = (6.45, 6.43, 6.41, 6.40, 6.42, 6.51, 6.81, 6.93, 7.06, 7.08,
7.11, 7.14, 7.13, 7.13, 7.12, 7.07, 7.04, 7.06, 7.08, 7.09, 7.07)
# 自然增长率
natural_growth = [7.58, 6.95, 6.15, 6.01, 5.87, 5.89, 5.28, 5.17, 5.08, 4.87,
4.79, 6.13, 7.43, 5.90, 6.71, 4.93, 6.53, 5.58, 3.78, 3.32, 1.45]
ind = np.arange(len(natality)) # 获取数组长度
width = 0.4 # 设置柱状图宽度为 0.4
fig, ax1 = plt.subplots()
# 绘制交错的柱状图(通过ind +- width/2)
rects1 = ax1.bar(ind - width/2, natality, width,
color='SkyBlue', label='出生率')
rects2 = ax1.bar(ind + width/2, mortality, width,
color='IndianRed', label='死亡率')
# 定义标题和标签
ax1.set_title('2000年以来中国人口出生率、死亡率及增长率变化', fontsize=15)
ax1.set_xticks(ind)
ax1.set_xticklabels(range(2000, 2021, 1), rotation=45) # 修改年份显示问题(倾斜字体)
plt.legend()
# twinx共享x轴(类似的语法,如共享y轴twiny)
ax2 = ax1.twinx()
# 绘制折线图
s = pd.Series(natural_growth, name='自然增长率——')
sns.lineplot(data=s)
# 显示图像
plt.show()



