2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
“你曾亲眼目睹过日本的老龄化吗?”——我虽然知晓相关数据,但从未亲眼看着该国人口金字塔的形态在我面前逐渐变形。因此,我构建了一个仅 250 行代码的页面来实现这一效果:包含年份滑块和自动播放功能,时间跨度从 1950 年到 2070 年,你可以清晰地看到第一波婴儿潮一代从图表底部一路攀升至顶部。
🌐 演示:https://sen.ltd/portfolio/jp-population-pyramid/
📦 GitHub:https://github.com/sen-ltd/jp-population-pyramid
点击 ▶ 按钮,观察图表以每年 120 毫秒的速度演变。第一波婴儿潮一代(出生于 1947-1949 年)在 1950 年作为真正三角形人口的宽阔基底出现,随后成为一个巨大的凸起,随着几十年时光流逝在图表中逐步上移,在 2030 年代达到预测图的顶端,并在 2050 年前从顶部消失。2020 年的双凸起形态转变为 2070 年的倒置不对称形态。中位年龄从 20 岁增至 56 岁,65 岁及以上人口占比从 7% 升至 38%。
为何这比看起来更难
使用 Plotly 或 D3 绘制单个静态人口金字塔只需 30 行代码。真正有趣的问题在于上游环节:
- 数据来源何处,以及如何在一个一致的数据集中同时涵盖 70 年的历史数据和 50 年的预测数据?
- 当源数据本质上是 5 年或 10 年的快照时,如何在用户拖动滑块时保持形态平滑演变?
这两个问题都有非显而易见的答案,而且我在初次尝试时搞错了一个。
数据:通过函数生成,然后校准总数
data.json 文件中附带的数据集由 generate-data.py 生成——这是一个小型 Python 脚本,它将人口统计模型暴露为四个函数:
-
annual_births(year)—— 单年出生人数(单位:千人),时间范围从 1850 年到 2070 年。包含代表第一波和第二波婴儿潮的两个高斯分布峰值,以及一个在 20 世纪后期呈下降趋势的分段线性趋势。 -
survival(age, sex, birth_year)—— 给定确切年龄时,某一代际中仍存活的比例。下文将详述。 -
cohort_size(birth_year, age, sex)—— 将上述两者相乘,并乘以出生时的性别比例因子。 -
bin_population(year, bin_idx, sex)—— 汇总五个单岁年龄组,形成一个 5 岁的年龄组区间。
一旦这些函数就位,构建任何日历年的快照只需对每种性别调用 bin_population 函数 21 次即可。
该脚本最后执行的操作是校准:
def snapshot(year):
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。
