从零生成一张中国GDP趋势图:数据、代码与思考

一张图胜过千言万语,但生成这张图的过程本身也值得记录。


一、为什么做这张图?

最近在想一个问题:如果用一张图来概括中国经济的72年,它应该长什么样?

不是那种花里胡哨的PPT动画,也不是只会堆数据的Excel截图。我想要一张既能展示总量增长,又能体现增速变化的双轴图——柱状图看规模,折线图看节奏。

于是决定自己动手,用 Python + matplotlib 来生成。


二、数据从哪里来?

GDP数据来自国家统计局的公开数据,我手动整理了一份 1952-2024 年的名义GDP(单位:万亿元人民币):

时期 关键节点 GDP(万亿元)
建国初期 1952 0.068
改革开放起点 1978 0.36
突破10万亿 2000 10.03
超越日本 2010 41.30
突破100万亿 2020 101.36
最新数据 2024 134.91

从 0.068 到 134.91,72 年增长了约 1987 倍


三、代码实现过程

第一步:准备数据

data = {
    1952: 0.0679, 1960: 0.453, 1970: 0.948, 1980: 0.455,
    1985: 0.909, 1990: 1.870, 1995: 6.080, 2000: 10.03,
    2001: 11.09, 2002: 12.17, 2003: 13.74, 2004: 16.18,
    2005: 18.73, 2006: 21.64, 2007: 26.68, 2008: 31.41,
    2009: 34.85, 2010: 41.30, 2011: 48.93, 2012: 54.04,
    2013: 59.30, 2014: 64.36, 2015: 68.91, 2016: 74.36,
    2017: 82.71, 2018: 91.93, 2019: 98.65, 2020: 101.36,
    2021: 114.37, 2022: 121.02, 2023: 126.06, 2024: 134.91,
}

第二步:计算增长率

growth_rates = []
for i in range(1, len(gdp)):
    rate = (gdp[i] / gdp[i-1] - 1) * 100
    growth_rates.append(rate)

第三步:绘制双轴图

fig, ax1 = plt.subplots(figsize=(16, 8))

# 柱状图
colors = plt.cm.Blues(np.linspace(0.3, 0.9, len(years)))
ax1.bar(years, gdp, color=colors, alpha=0.8, width=0.7)

# 趋势线(三次多项式拟合)
z = np.polyfit(years, gdp, 3)
p = np.poly1d(z)
ax1.plot(x_smooth, p(x_smooth), '--', color='#e74c3c', linewidth=2)

# 增长率折线(右轴)
ax2 = ax1.twinx()
ax2.plot(years, growth_rates, 'o-', color='#e74c3c', linewidth=2)
ax2.set_ylabel('GDP增长率(%)')

第四步:标注关键节点

key_events = [
    (1978, 0.36, '改革开放'),
    (2001, 11.09, '加入WTO'),
    (2010, 41.30, '超日本成世界第二'),
    (2020, 101.36, '突破100万亿'),
]

四、踩过的坑

坑1:中文显示成方块

第一次生成时,所有中文都变成了 □□□。原因是代码里写的是 SimHei(微软雅黑),但 Linux 服务器上根本没有这个字体。

解决:用 matplotlib.font_manager 查找系统可用字体,改用 Noto Sans CJK JP

import matplotlib.font_manager as fm
font_path = fm.findfont('Noto Sans CJK JP')
zh_font = fm.FontProperties(fname=font_path)

坑2:增长率数据失真

改革开放前的增长率波动极大(1960年代有负增长),直接画出来会压缩后期数据的可视空间。最终选择从 1978 年开始显示增长率折线,更有参考价值。


五、图表解读

中国历年GDP增长趋势(1952-2024)

几个值得注意的趋势:

  1. 1978年前:GDP几乎是一条平线,年均增长缓慢
  2. 1978-2010:指数级增长,尤其是2001年加入WTO后加速明显
  3. 2010年后:增速逐渐放缓,从两位数降至5-6%区间
  4. 2020年:疫情冲击下仍突破100万亿,韧性十足

六、延伸思考

这张图展示的是名义GDP,没有剔除价格因素。如果想看真实增长,应该用实际GDP(以某一年为基期)。

另外,人均GDP可能比总量更有意义——中国人口基数大,总量高不代表人均高。2024年人均GDP约9.5万元,折合美元约1.3万,刚跨过高收入国家门槛。

总量是面子,人均是里子。


七、代码与数据

完整代码和数据已开源,欢迎取用:

  • 数据:国家统计局公开数据
  • 代码:Python + matplotlib
  • 字体:Noto Sans CJK JP

数据不会说谎,但选择如何呈现数据是一种艺术。这张图只是众多可能的视角之一,欢迎提出不同的解读。