从零生成一张中国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 年开始显示增长率折线,更有参考价值。
五、图表解读

几个值得注意的趋势:
- 1978年前:GDP几乎是一条平线,年均增长缓慢
- 1978-2010:指数级增长,尤其是2001年加入WTO后加速明显
- 2010年后:增速逐渐放缓,从两位数降至5-6%区间
- 2020年:疫情冲击下仍突破100万亿,韧性十足
六、延伸思考
这张图展示的是名义GDP,没有剔除价格因素。如果想看真实增长,应该用实际GDP(以某一年为基期)。
另外,人均GDP可能比总量更有意义——中国人口基数大,总量高不代表人均高。2024年人均GDP约9.5万元,折合美元约1.3万,刚跨过高收入国家门槛。
总量是面子,人均是里子。
七、代码与数据
完整代码和数据已开源,欢迎取用:
- 数据:国家统计局公开数据
- 代码:Python + matplotlib
- 字体:Noto Sans CJK JP
数据不会说谎,但选择如何呈现数据是一种艺术。这张图只是众多可能的视角之一,欢迎提出不同的解读。
评论
加载中...
发表评论