一、人口总量进入负增长时代

  • 首次负增长: 2022 年是中国人口发展的转折点,全国人口比 2021 年减少了 85 万人,这是近 61 年来的首次负增长。
  • 规模与预测: 根据预测,2025 年末中国人口约为 14.0489 亿人,自然增长率为-2.41‰。中性情景下,总人口在 2035 年仍可能在 14 亿以上,2050 年在 13 亿以上,但到 2100 年可能大幅下降至约 8 亿甚至更低。
  • 第一大国地位转移: 2023 年至 2024 年间,印度预计超越中国成为全球第一人口大国,中国自此失去长期维持的人口总量优势。

数据折线图:2010-2025

eadec1c54a65ec41b2da54bb158a96d6.png

人口出生人数:1949-2025

image (1)_1778344770771.png

二、年龄结构步入深度老龄化

  • 老龄化速度: 中国于 1999-2000 年左右进入老龄型社会。2025 年,65 岁以上人口占比预计达 15.9%,60 岁以上占比 23.0%。
  • 高龄化趋势: 80 岁及以上的高龄老人规模增速极快,预计到 2050 年将达到约 1.27 亿人,占总人口比例接近 10%。
  • 未富先老: 中国老龄化程度已高于世界平均水平,且老龄化演变大大超前于经济发展水平,社会养老保障压力巨大。

中国老龄化进程与节点预测表

中国于 1999-2000 年前后正式步入老龄化社会,其演进速度远超发达国家。

阶段 统计年份 60 岁及以上人口 占比 65 岁及以上人口 占比 备注/老龄化程度
起始点 2000 1.3 亿 10.03% 0.88 亿 7.0% 进入老龄型社会
中度转折 2021 2.67 亿 18.9% 2.0 亿 14.2% 进入中度老龄化阶段
近期数据 2023 2.2 亿 15.4% 老龄化程度持续加深
最新统计 2025 3.23 亿 23.0% 2.23 亿 15.9% 正式跨入中度老龄化门槛
重度预测 2035 4.00 亿 30.3% >21% 进入****重度老龄化阶段
峰值预测 2050 5.10 亿 38.8% 3.86 亿 29.2% 进入超级老龄化社会

高龄化(80 岁及以上)趋势统计表

高龄老人的增长速度显著快于低龄老人,高龄化将成为未来 30 年最突出的结构性特征。

年份 80 岁及以上高龄老人规模 占总人口比例 占老年人口(60+)比重
2020 3,580 万 2.5% 12.66%
2022 约 4,000 万 2.7% 13.36%
2035 7,084 万 5.0% 16.70%
2050 1.27 亿 9.59% (约 10%) 26.56%

注:到 2050 年,每 4 个老年人中就将有 1 个是 80 岁以上的高龄老人。

数据核心洞察:

  1. 抚养负担剧增: 到 2035 年,中国总抚养比将回升至 50% 以上;到 2050 年,预计平均**每两个劳动年龄人口就需要抚养一位老人。**
  2. 疾病结构转型: 随着高龄化凸显,慢性共病成为主要负担。2021 年中国失能失智老人已达 4500 万,预计 2050 年仅 60 岁以上失能老人就将达到 5472 万人
  3. 财政压力攀升: 由于“未富先老”,社保基金收支失衡风险积聚。研究预测,如不采取措施,城镇职工养老金累计结余可能在**2035 年耗尽。**

三、中国高校应届毕业生人数的统计及学历分布

2020-2026 年中国高校应届毕业生总规模及增长趋势

从 2022 年起,中国高校毕业生规模正式进入“千万级”时代,并持续创下历史新高。

94ae56829442f680c3d5f3bc92425a78.png

毕业年份 毕业生总数(万人) 规模同比变化 备注/规模特征
2020 年 874 +40 万 大众化教育稳步扩张期
2021 年 909 +35 万 规模持续增长
2022 年 1076 +167 万 首次突破千万大关
2023 年 1158 +82 万 连续两年超千万
2024 年 1179 +21 万 增速放缓,进入结构调整期
2025 年 1222 +43 万 规模再攀新高
2026 年(预) 1270 +48 万 历史最高峰值

全国应届毕业生学历层次占比分布(硕士、本科、大专)

2024 届详尽统计数据及2025-2026 年预测为例,全国毕业生学历结构呈金字塔特征,但高职(专科)占比已略超普通本科。

学历层次 2024 届人数(万人) 2024 届占比 2025-2026 届趋势
研究生(硕博合计) 108.36 9.19% 2025 年预计增至 116.7 万,占比提升至 9.55%
—— 硕士研究生 98.64 8.37% 研究生学历占比持续上升
—— 博士研究生 9.72 0.82% 博士规模较二十年前增加数倍
本科(普通 + 职业) 518.96 44.02% 职业本科虽目前仅 7 万,但在校生规模快速扩大
—— 普通本科 511.96 43.42% 传统就业市场的中坚力量
—— 职业本科 7.00 0.59% 职业教育高端化的尝试
高职(专科) 540.43 45.84% 目前产出规模最大的群体,但占比正逐年下降
合计 1179 100% ——

b40f692188cd2b53e18984e3fa583ef7.png

787e88bbd91bfc88ddf58672586179e1.png

b30f49ccfd2a286eafc6eb56b72395da.png

00096230c65b9ea05d2cff7ba0b9cdae.png

b9f66d0e3e474907f5d366efd113043e.png

985/211 院校毕业生的学历结构与全国占比(以 2024 届为例)

“985/211”院校毕业生的占比在全国总盘子中保持在极低且稳定的水平,且内部学历结构呈显著的“重心上移”。

985/211 院校学历层次 毕业生规模(万人) 群体内部比例 占全国应届生总比例
本科生 约 58 53.39% 约 4.92%
硕士研究生 约 42 39.17% 约 3.56%
博士研究生 约 8 7.44% 约 0.68%
精英院校合计 约 108 100% 约 9.16%

关键数据洞察与趋势说明

  1. 精英院校的“本研倒挂”: 在顶尖研究型大学中,研究生占比远高于全国平均水平,部分学校研究生人数已超过本科生。例如复旦大学 2025 年研究生招生规模是本科生的近 3 倍,上海交通大学 2025 届研究生规模也接近本科生的 2.6 倍。
  2. 985/211 高深造率: 顶尖院校本科生实际进入就业市场的比例很低。清华、北大等校的本科深造率常年保持在 70% 以上,这意味着每 10 名精英院校本科毕业生中,只有不到 3 人直接工作。
  3. 学历溢价与薪酬: 学历层级与初始月薪呈明显的线性增长关系。调研显示,博士平均起薪比硕士高出约 6918 元,硕士比本科高出约 1887 元
  4. 学科分布特征: 985/211 毕业生高度向工学(占比 45.92%)及 STEM 领域倾斜,有效支撑了国家的人工智能、半导体等硬科技领域的发展。
  5. 研究生招生降温信号: 尽管毕业人数在增长,但 2025 年硕士报名人数已跌破 400 万(388 万人),反映出应届生对学历投资回报率的计算趋于理性。

四、持续城镇化与区域分化

  • 城镇化提升: 2020 年城镇化率接近 60%,人口持续向沿海、铁路沿线及核心城市群聚集。
  • 流动人口规模: 2020 年流动人口规模近 3.8 亿人,跨区域迁移频繁,但同时也导致了东北等地区人口的明显减少和“城市收缩”现象。

image (1).png

中国城镇化率提升趋势表 (2010-2025)

中国的城镇化进程在过去十余年间保持了跨越式增长,2020 年第七次人口普查时已远超 60% 的预期,2025 年更接近 70% 的关口。

统计节点 城镇常住人口(万人) 城镇化率(%) 较上年/上届普查变动
2010 年 (六普) 66,558 49.68%
2020 年 (七普) 90,199 63.89% +14.21 个百分点
2021 年 64.72% +0.83 个百分点
2023 年 93,267 66.16% +0.94 个百分点
2025 年 95,380 67.89% +0.89 个百分点

注:尽管常住人口城镇化率已接近 68%,但户籍人口城镇化率(2021 年为 46.7%)仍滞后,反映了“人地分离”的现状。

流动人口与人户分离规模变化表

中国拥有全球规模最大的流动人口,跨区域迁移频繁是导致区域分化的直接动力。

指标(万人) 2010 年规模 2020 年规模 10 年增长率 2021 年规模
流动人口 22,000 37,582 (近 3.8 亿) +69.7% 38,467
人户分离人口 26,139 49,276 +88.5% 50,429
市辖区内人户分离 4,057 11,694 +192.7% 11,962

区域人口占比分化表 (2010 vs 2020)

人口持续向****东部发达地区南方地区集聚,东北地区人口占比显著下滑。

地区 2010 年人口占比 2020 年人口占比 占比变动(百分点) 趋势特征
东部地区 37.78% 39.93% +2.15 持续集聚
中部地区 26.62% 25.83% -0.79 人口流出
西部地区 26.90% 27.12% +0.22 基本稳定
东北地区 8.18% 6.98% -1.20 明显减少

人口显著萎缩省份及“城市收缩”数据表

2010-2020 年间,北方共有 6 个省份出现常住人口萎缩,其中东北三省最为严峻,全国约有 80 个城市被识别为“收缩型城市”。

省份/地区 10 年间人口减少规模(万人) 主要原因 备注
黑龙江 -646.4 人口自然下降与外迁 萎缩最严重
吉林 -337.9 产业衰退与老龄化 持续减少
辽宁 -115.5 经济结构危机 步入重度老龄化
山西 -79.6 能源产业转型 北方流出省份
内蒙古 -65.7 跨区域迁移 北方流出省份
甘肃 -55.5 生态与经济因素 北方流出省份

空间分布核心洞察:

  1. “人往高处走”: 人口、人才持续向京津冀、长三角、粤港澳大湾区等核心城市群集聚。2024 年深圳和广州常住人口分别增长了 20 万和 15 万。
  2. 区域极端化: 在人口集聚的同时,收缩型城市(如东莞、鞍山及边境偏远城市)面临税收减少、基础设施空置及深度老龄化的困境。
  3. 城镇化重心转移: 未来新型城镇化战略将从“土地城镇化”转向**“以人为本的市民化”**,重点解决流动人口在流入地的教育、医疗等基本公共服务均等化问题。

五、性别结构失衡与婚姻挤压

  • 长期失衡: 出生人口性别比长期偏高(2020 年为 111.3:100),虽有改善趋势,但已造成严重的“婚姻挤压”社会问题,适婚男性规模远超女性
  • 改善目标: 预计到 2030 年,出生人口性别比有望降至 107 的正常范围。

中国出生人口性别比(SRB)演变及目标表

出生人口性别比的正常范围通常在 103-107 之间。中国自 20 世纪 80 年代起该指标持续攀升,近年来开始波动回落。

年份 出生人口性别比(女=100) 备注
2014 年 115.88 处于极高位失衡状态
2015 年 113.51 开始缓慢下降
2016 年 112.88 实施“全面二孩”政策年份
2017 年 111.90 持续改善
2020 年 (七普) 111.30 较 2010 年下降了 6.8
2025 年 (预测) 107.00 (假设) 研究预测或假设可恢复至正常水平
2030 年 (目标) 107.00 国家人口发展规划目标/联合国预测 assumptions

总人口性别构成与“男盈女缺”规模表

尽管出生性别比在改善,但总人口中男性规模远超女性的现状依然严峻。

指标 2020 年数据 (七普) 2023 年数据 趋势特征
总人口性别比 105.07 104.49 处于历史低位水平,持续改善
男性比女性多出人数 3,490 万人 3,097 万人 差额虽在缩小,但绝对规模庞大
男性占比 51.24% 51.10%
女性占比 48.76% 48.90%

“婚姻挤压”:代际与适婚年龄段失衡数据表

性别失衡在年轻一代中尤为突出,直接导致了婚姻市场的匹配困难。

统计维度 男性比女性多出人数 性别比估算 社会影响
“00 后”群体 超过 1,100 万人 约 115 严重的婚姻挤压隐患
“90 后”群体 近 900 万人 约 110 适婚压力凸显
20-40 岁适婚年龄段 1,752 万人 婚姻挤压最核心的受影响群体
30 岁及以上未婚男性 60% 以上分布在村镇,多为低学历
30 岁及以上未婚女性 60% 以上分布在城市,多为高学历

核心洞察与说明:

  1. “男多女少”的结构性矛盾: 适婚年龄男性的规模远超女性,导致了严重的“婚姻挤压”现象。这种失衡亦是中国大陆部分地区结婚彩礼畸高的重要推手之一。
  2. 区域性分化: 东北地区(辽宁、吉林、黑龙江)基本不存在男女比例失衡问题,甚至呈现“女多男少”特征;而广东、海南等外来人口比例较高的省份,男性比例甚至超过 53%
  3. 社会匹配困境: 未婚群体的空间分布呈现城乡错位——农村充斥着大量低学历“剩男”,而城市则存在大量高学历“大龄剩女”,这种结构性矛盾加剧了婚姻市场的匹配难度。
  4. 政策干预成效: 随着三孩政策放开和重男轻女观念的改善,预计到 2030 年前后,出生人口性别比将回归到 107 左右的正常区间。

六、补充资料

出生、死亡折线图对比可视化 html 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>中国人口出生与死亡数据对比(2010-2025)</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.1.0/dist/chartjs-plugin-annotation.min.js">
</script>
<style>
:root {
--bg: #f5f6f8;
--card-bg: #ffffff;
--text: #2c3e50;
--text-secondary: #5a6c7d;
--border: #e8ecf1;
--shadow: 0 2px 16px rgba(0, 0, 0, 0.07);
--shadow-hover: 0 6px 28px rgba(0, 0, 0, 0.11);
--blue: #4A90D9;
--blue-dark: #3572B0;
--blue-light: #e8f2fb;
--coral: #E8746B;
--coral-dark: #D1554F;
--coral-light: #fef0ef;
--green: #4CAF84;
--red: #E05555;
--gold: #D4A843;
--accent-line: #e74c3c;
--radius: 14px;
--transition: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
'Microsoft YaHei', 'Helvetica Neue', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
min-height: 100vh;
padding: 24px 16px 48px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

.container {
max-width: 1200px;
margin: 0 auto;
display: flex;
flex-direction: column;
gap: 28px;
}

/* ========== 页头 ========== */
.header {
text-align: center;
padding: 10px 0 6px;
}
.header .badge {
display: inline-block;
background: var(--coral-light);
color: var(--coral-dark);
font-size: 0.82rem;
font-weight: 600;
padding: 5px 14px;
border-radius: 20px;
letter-spacing: 0.6px;
margin-bottom: 10px;
}
.header h1 {
font-size: 1.85rem;
font-weight: 700;
color: #1a1a2e;
letter-spacing: 0.3px;
}
.header .subtitle {
font-size: 0.95rem;
color: var(--text-secondary);
margin-top: 4px;
}

/* ========== 关键指标卡片 ========== */
.kpi-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}
.kpi-card {
background: var(--card-bg);
border-radius: var(--radius);
padding: 20px 22px;
box-shadow: var(--shadow);
border: 1px solid var(--border);
transition: var(--transition);
display: flex;
flex-direction: column;
gap: 6px;
cursor: default;
}
.kpi-card:hover {
box-shadow: var(--shadow-hover);
transform: translateY(-2px);
}
.kpi-card .kpi-label {
font-size: 0.82rem;
color: var(--text-secondary);
font-weight: 500;
letter-spacing: 0.3px;
text-transform: uppercase;
}
.kpi-card .kpi-value {
font-size: 2.2rem;
font-weight: 800;
letter-spacing: -0.5px;
line-height: 1;
}
.kpi-card .kpi-sub {
font-size: 0.8rem;
color: #888;
}
.kpi-card.accent-red .kpi-value {
color: var(--coral-dark);
}
.kpi-card.accent-blue .kpi-value {
color: var(--blue-dark);
}
.kpi-card.accent-green .kpi-value {
color: #3a8a5c;
}
.kpi-card.accent-gold .kpi-value {
color: #b8922e;
}

/* ========== 图表卡片 ========== */
.chart-card {
background: var(--card-bg);
border-radius: var(--radius);
padding: 24px 20px 18px;
box-shadow: var(--shadow);
border: 1px solid var(--border);
transition: var(--transition);
}
.chart-card:hover {
box-shadow: var(--shadow-hover);
}
.chart-card .chart-title {
font-size: 1.12rem;
font-weight: 700;
color: #1a1a2e;
margin-bottom: 6px;
display: flex;
align-items: center;
gap: 8px;
}
.chart-card .chart-title .dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.chart-card .chart-desc {
font-size: 0.83rem;
color: var(--text-secondary);
margin-bottom: 16px;
}
.chart-wrapper {
position: relative;
width: 100%;
height: 420px;
}
@media (max-width: 768px) {
.chart-wrapper {
height: 320px;
}
}

/* ========== 图例辅助行 ========== */
.legend-helper {
display: flex;
flex-wrap: wrap;
gap: 18px;
margin-bottom: 10px;
font-size: 0.82rem;
color: #666;
}
.legend-helper span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.legend-helper .swatch {
display: inline-block;
width: 14px;
height: 14px;
border-radius: 3px;
flex-shrink: 0;
}
.legend-helper .swatch-dash {
display: inline-block;
width: 18px;
height: 0;
border-top: 2.5px dashed #e74c3c;
flex-shrink: 0;
}

/* ========== 数据来源 ========== */
.footer-note {
text-align: center;
font-size: 0.78rem;
color: #999;
padding-top: 8px;
letter-spacing: 0.2px;
}
.footer-note a {
color: #888;
text-decoration: underline;
text-underline-offset: 3px;
}
</style>
</head>
<body>

<div class="container">
<!-- ==================== 页头 ==================== -->
<div class="header">
<span class="badge">📊 人口数据可视化</span>
<h1>中国人口出生与死亡数据对比</h1>
<p class="subtitle">2010年 — 2025年 | 数据来源:国家统计局</p>
</div>

<!-- ==================== 关键指标卡片 ==================== -->
<div class="kpi-row">
<div class="kpi-card accent-red">
<span class="kpi-label">📉 2025年出生人数</span>
<span class="kpi-value">792<span style="font-size:0.45em;font-weight:500;"> 万人</span></span>
<span class="kpi-sub">创1949年以来新低</span>
</div>
<div class="kpi-card accent-blue">
<span class="kpi-label">📈 2025年死亡人数</span>
<span class="kpi-value">1,131<span style="font-size:0.45em;font-weight:500;"> 万人</span></span>
<span class="kpi-sub">老龄化持续推高</span>
</div>
<div class="kpi-card accent-red">
<span class="kpi-label">⚠️ 2025年自然增长</span>
<span class="kpi-value">-339<span style="font-size:0.45em;font-weight:500;"> 万人</span></span>
<span class="kpi-sub">连续四年负增长</span>
</div>
<div class="kpi-card accent-gold">
<span class="kpi-label">🔴 历史拐点</span>
<span class="kpi-value" style="font-size:1.3rem;">2022年</span>
<span class="kpi-sub">近61年来首次人口负增长</span>
</div>
</div>

<!-- ==================== 图表一:柱状图 ==================== -->
<div class="chart-card">
<div class="chart-title">
<span class="dot" style="background:#4A90D9;"></span> 柱状图:出生人数 vs 死亡人数
</div>
<div class="chart-desc">
分组柱状图直观对比每年出生(蓝色)与死亡(灰色)人数。2022年起死亡人数持续超过出生人数,中国进入<strong style="color:#e74c3c;">人口负增长时代</strong>。
</div>
<div class="legend-helper">
<span><span class="swatch" style="background:#5B9BD5;"></span> 出生人数(2010-2021)</span>
<span><span class="swatch" style="background:#3B7CC3;"></span> 出生人数(2022-2025·负增长期)</span>
<span><span class="swatch" style="background:#B0B0B0;"></span> 死亡人数(2010-2021)</span>
<span><span class="swatch" style="background:#D08070;"></span> 死亡人数(2022-2025·负增长期)</span>
<span><span class="swatch-dash"></span> 2022年拐点线</span>
</div>
<div class="chart-wrapper">
<canvas id="barChart" aria-label="2010-2025年中国出生与死亡人数柱状图"></canvas>
</div>
</div>

<!-- ==================== 图表二:折线图 ==================== -->
<div class="chart-card">
<div class="chart-title">
<span class="dot" style="background:#4CAF84;"></span> 折线图:出生、死亡 & 自然增长趋势
</div>
<div class="chart-desc">
三线趋势图展示人口变动全貌。自然增长数(绿/红线)于<strong style="color:#e74c3c;">2022年首次跌破零轴</strong>,此后持续为负,且降幅扩大。
</div>
<div class="legend-helper">
<span><span class="swatch" style="background:#5B9BD5;"></span> 出生人数</span>
<span><span class="swatch" style="background:#A8A8A8;"></span> 死亡人数</span>
<span><span class="swatch" style="background:#4CAF84;"></span> 自然增长(正)</span>
<span><span class="swatch" style="background:#E05555;"></span> 自然增长(负)</span>
<span><span class="swatch-dash"></span> 2022年拐点线</span>
</div>
<div class="chart-wrapper">
<canvas id="lineChart" aria-label="2010-2025年中国人口出生、死亡与自然增长折线图"></canvas>
</div>
</div>

<!-- ==================== 数据来源 ==================== -->
<div class="footer-note">
数据来源:国家统计局  |  2025年数据为2026年1月公布  | 
<a href="https://www.stats.gov.cn/" target="_blank" rel="noopener">国家统计局官网</a>
</div>
</div>

<script>
(function() {
// ============ 注册 annotation 插件 ============
if (typeof ChartAnnotation !== 'undefined') {
Chart.register(ChartAnnotation);
} else {
console.warn('chartjs-plugin-annotation 未加载,标注线将不会显示。');
}

// ============ 原始数据 ============
const years = [
'2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017',
'2018', '2019', '2020', '2021', '2022', '2023', '2024', '2025'
];
const births = [
1592, 1604, 1635, 1640, 1687, 1655, 1786, 1723,
1523, 1465, 1202, 1062, 956, 902, 954, 792
];
const deaths = [
951, 960, 966, 972, 977, 975, 977, 986,
993, 998, 997, 1014, 1041, 1110, 1093, 1131
];
const naturalGrowth = [
641, 644, 669, 668, 710, 680, 809, 737,
530, 467, 205, 48, -85, -208, -139, -339
];

// 拐点索引:2022年对应索引12
const TURNING_POINT_INDEX = 12;
const TURNING_POINT_YEAR = '2022';

// ============ 通用配置 ============
const commonFontFamily =
'-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Helvetica Neue",sans-serif';

// ============ 柱状图 ============
const barCtx = document.getElementById('barChart').getContext('2d');

// 为柱状图设置分段颜色:前12年(2010-2021)正常色,后4年(2022-2025)为"负增长期"色调
const birthBarColors = births.map((_, i) =>
i < TURNING_POINT_INDEX ? '#5B9BD5' : '#3B7CC3'
);
const deathBarColors = deaths.map((_, i) =>
i < TURNING_POINT_INDEX ? '#B0B0B0' : '#D08070'
);
const birthBarBorders = births.map((_, i) =>
i < TURNING_POINT_INDEX ? '#4A8CC8' : '#2F68A8'
);
const deathBarBorders = deaths.map((_, i) =>
i < TURNING_POINT_INDEX ? '#999999' : '#B86050'
);

const barChart = new Chart(barCtx, {
type: 'bar',
data: {
labels: years,
datasets: [{
label: '出生人数(万人)',
data: births,
backgroundColor: birthBarColors,
borderColor: birthBarBorders,
borderWidth: 1.2,
borderRadius: 5,
borderSkipped: false,
order: 1,
}, {
label: '死亡人数(万人)',
data: deaths,
backgroundColor: deathBarColors,
borderColor: deathBarBorders,
borderWidth: 1.2,
borderRadius: 5,
borderSkipped: false,
order: 1,
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
interaction: {
mode: 'index',
intersect: false,
},
plugins: {
tooltip: {
backgroundColor: 'rgba(30,30,40,0.92)',
titleFont: { family: commonFontFamily, size: 13, weight: 'bold' },
bodyFont: { family: commonFontFamily, size: 12 },
padding: 14,
cornerRadius: 8,
callbacks: {
label: function(ctx) {
let extra = '';
if (ctx.dataIndex === 12 && ctx.dataset.label.includes('死亡'))
extra = ' ⚠️ 首次超过出生人数';
if (ctx.dataIndex === 12 && ctx.dataset.label.includes('出生'))
extra = ' ⚠️ 首次低于死亡人数';
if (ctx.dataIndex === 15 && ctx.dataset.label.includes('出生'))
extra = ' 📉 创1949年以来新低';
return ctx.dataset.label + ': ' + ctx.raw + ' 万人' + extra;
}
}
},
legend: {
position: 'bottom',
labels: {
font: { family: commonFontFamily, size: 12 },
padding: 24,
usePointStyle: true,
pointStyleWidth: 10,
}
},
annotation: {
annotations: {
turningLine: {
type: 'line',
xMin: TURNING_POINT_YEAR,
xMax: TURNING_POINT_YEAR,
borderColor: '#e74c3c',
borderWidth: 2.5,
borderDash: [8, 5],
label: {
display: true,
content: '2022年\n首次负增长',
position: 'start',
backgroundColor: 'rgba(231,76,60,0.9)',
color: '#fff',
font: { family: commonFontFamily, size: 11, weight: 'bold' },
padding: 8,
cornerRadius: 5,
yAdjust: -20,
},
z: 10,
},
},
},
},
scales: {
x: {
title: {
display: true,
text: '年份',
font: { family: commonFontFamily, size: 13, weight: 'bold' },
color: '#555',
},
ticks: {
font: { family: commonFontFamily, size: 11 },
maxRotation: 45,
minRotation: 0,
},
grid: {
display: false,
},
},
y: {
title: {
display: true,
text: '人数(万人)',
font: { family: commonFontFamily, size: 13, weight: 'bold' },
color: '#555',
},
ticks: {
font: { family: commonFontFamily, size: 11 },
callback: function(v) { return v + ' 万'; },
},
beginAtZero: false,
min: 600,
max: 1900,
grid: {
color: '#eef1f5',
},
},
},
},
});

// ============ 折线图 ============
const lineCtx = document.getElementById('lineChart').getContext('2d');

const lineChart = new Chart(lineCtx, {
type: 'line',
data: {
labels: years,
datasets: [{
label: '出生人数(万人)',
data: births,
borderColor: '#5B9BD5',
backgroundColor: 'rgba(91,155,213,0.08)',
borderWidth: 2.8,
pointRadius: 3.5,
pointBackgroundColor: '#5B9BD5',
pointBorderColor: '#fff',
pointBorderWidth: 1.5,
pointHoverRadius: 7,
tension: 0.3,
fill: false,
yAxisID: 'y',
order: 1,
}, {
label: '死亡人数(万人)',
data: deaths,
borderColor: '#A8A8A8',
backgroundColor: 'rgba(168,168,168,0.05)',
borderWidth: 2.8,
pointRadius: 3.5,
pointBackgroundColor: '#A8A8A8',
pointBorderColor: '#fff',
pointBorderWidth: 1.5,
pointHoverRadius: 7,
tension: 0.3,
fill: false,
yAxisID: 'y',
order: 1,
}, {
label: '自然增长数(万人)',
data: naturalGrowth,
borderColor: '#4CAF84',
backgroundColor: 'rgba(76,175,132,0.06)',
borderWidth: 3,
pointRadius: 4.5,
pointBackgroundColor: naturalGrowth.map(v => v >= 0 ? '#4CAF84' : '#E05555'),
pointBorderColor: '#fff',
pointBorderWidth: 1.8,
pointHoverRadius: 8,
tension: 0.35,
fill: false,
yAxisID: 'y1',
order: 0,
// 使用 segment 实现正负分段颜色
segment: {
borderColor: (ctx) => {
const prevRaw = ctx.p0.raw;
const nextRaw = ctx.p1.raw;
// 两个端点都 >=0 → 绿色
if (prevRaw >= 0 && nextRaw >= 0) return '#4CAF84';
// 两个端点都 <0 → 红色虚线
if (prevRaw < 0 && nextRaw < 0) return '#E05555';
// 跨越零点 → 橙色过渡
return '#F0A040';
},
borderDash: (ctx) => {
const prevRaw = ctx.p0.raw;
const nextRaw = ctx.p1.raw;
// 负值段使用虚线
if (prevRaw < 0 && nextRaw < 0) return [6, 3.5];
// 跨越零点的段也使用虚线提示
if ((prevRaw >= 0 && nextRaw < 0) || (prevRaw < 0 && nextRaw >= 0))
return [4, 3];
return undefined; // 正值段实线
},
},
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
interaction: {
mode: 'index',
intersect: false,
},
plugins: {
tooltip: {
backgroundColor: 'rgba(30,30,40,0.92)',
titleFont: { family: commonFontFamily, size: 13, weight: 'bold' },
bodyFont: { family: commonFontFamily, size: 12 },
padding: 14,
cornerRadius: 8,
callbacks: {
label: function(ctx) {
let extra = '';
const val = ctx.raw;
if (ctx.dataset.label.includes('自然增长')) {
if (ctx.dataIndex === 12) extra = ' ⚠️ 首次转负!';
if (ctx.dataIndex === 15) extra = ' 📉 负增长最大值';
const sign = val >= 0 ? '+' : '';
return ctx.dataset.label + ': ' + sign + val + ' 万人' + extra;
}
if (ctx.dataIndex === 12 && ctx.dataset.label.includes('死亡'))
extra = ' ⚠️ 首次超过出生';
if (ctx.dataIndex === 15 && ctx.dataset.label.includes('出生'))
extra = ' 📉 创1949年以来新低';
return ctx.dataset.label + ': ' + val + ' 万人' + extra;
}
}
},
legend: {
position: 'bottom',
labels: {
font: { family: commonFontFamily, size: 12 },
padding: 24,
usePointStyle: true,
pointStyleWidth: 10,
}
},
annotation: {
annotations: {
// 零轴参考线
zeroLine: {
type: 'line',
yMin: 0,
yMax: 0,
borderColor: 'rgba(0,0,0,0.25)',
borderWidth: 1.5,
borderDash: [4, 6],
label: {
display: true,
content: '零轴(盈亏平衡)',
position: 'end',
backgroundColor: 'rgba(0,0,0,0.55)',
color: '#fff',
font: { family: commonFontFamily, size: 10 },
padding: 5,
cornerRadius: 4,
xAdjust: 30,
},
z: 5,
},
// 2022年拐点竖线
turningLine: {
type: 'line',
xMin: TURNING_POINT_YEAR,
xMax: TURNING_POINT_YEAR,
borderColor: '#e74c3c',
borderWidth: 2.5,
borderDash: [8, 5],
label: {
display: true,
content: '2022年\n首次负增长',
position: 'start',
backgroundColor: 'rgba(231,76,60,0.9)',
color: '#fff',
font: { family: commonFontFamily, size: 11, weight: 'bold' },
padding: 8,
cornerRadius: 5,
yAdjust: -18,
},
z: 10,
},
// 负增长区域浅红背景(2022-2025)
negativeZone: {
type: 'box',
xMin: TURNING_POINT_YEAR,
xMax: '2025',
backgroundColor: 'rgba(231,76,60,0.06)',
borderWidth: 0,
drawTime: 'beforeDatasetsDraw',
z: 1,
},
},
},
},
scales: {
x: {
title: {
display: true,
text: '年份',
font: { family: commonFontFamily, size: 13, weight: 'bold' },
color: '#555',
},
ticks: {
font: { family: commonFontFamily, size: 11 },
maxRotation: 45,
minRotation: 0,
},
grid: {
display: false,
},
},
y: {
type: 'linear',
position: 'left',
title: {
display: true,
text: '出生/死亡人数(万人)',
font: { family: commonFontFamily, size: 12, weight: 'bold' },
color: '#5B9BD5',
},
ticks: {
font: { family: commonFontFamily, size: 11 },
callback: function(v) { return v + ' 万'; },
},
beginAtZero: false,
min: 550,
max: 1950,
grid: {
color: '#eef1f5',
},
},
y1: {
type: 'linear',
position: 'right',
title: {
display: true,
text: '自然增长数(万人)',
font: { family: commonFontFamily, size: 12, weight: 'bold' },
color: '#4CAF84',
},
ticks: {
font: { family: commonFontFamily, size: 11 },
callback: function(v) {
const sign = v >= 0 ? '+' : '';
return sign + v + ' 万';
},
},
beginAtZero: false,
min: -500,
max: 1000,
grid: {
display: false,
},
},
},
},
});

// ============ 响应式调整 ============
function handleResize() {
const width = window.innerWidth;
const barOptions = barChart.options;
const lineOptions = lineChart.options;

if (width < 600) {
// 移动端:缩短标签
barOptions.scales.x.ticks.maxRotation = 60;
barOptions.scales.x.ticks.minRotation = 30;
lineOptions.scales.x.ticks.maxRotation = 60;
lineOptions.scales.x.ticks.minRotation = 30;
barOptions.plugins.legend.labels.font.size = 10;
lineOptions.plugins.legend.labels.font.size = 10;
} else {
barOptions.scales.x.ticks.maxRotation = 45;
barOptions.scales.x.ticks.minRotation = 0;
lineOptions.scales.x.ticks.maxRotation = 45;
lineOptions.scales.x.ticks.minRotation = 0;
barOptions.plugins.legend.labels.font.size = 12;
lineOptions.plugins.legend.labels.font.size = 12;
}

barChart.update('none');
lineChart.update('none');
}

// 使用防抖避免频繁更新
let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(handleResize, 200);
});

// 初始检查
handleResize();

console.log('✅ 中国人口数据可视化图表已就绪');
console.log(' 📊 柱状图:出生 vs 死亡(2010-2025)');
console.log(' 📈 折线图:出生、死亡 & 自然增长趋势');
console.log(' 🔴 关键拐点:2022年首次人口负增长');
console.log(' 📉 最新数据:2025年自然增长 -339万人');
})();
</script>
</body>
</html>

中国高校毕业生 · 数据全景 (2020–2026)可视化 html 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>中国高校毕业生 · 数据全景 (2020-2026)</title>
<!-- Chart.js 3.x -->
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js">
</script>
<!-- Font Awesome 6 免费库 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" />
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

body {
background: #f5f9fe;
font-family: 'Inter', 'Segoe UI', Roboto, sans-serif;
padding: 28px 18px 20px;
color: #1a2634;
}

.container {
max-width: 1380px;
margin: 0 auto;
}

/* ===== 头部 ===== */
.dashboard-header {
text-align: center;
margin-bottom: 28px;
}
.dashboard-header h1 {
font-size: 2.3rem;
font-weight: 700;
background: linear-gradient(145deg, #0a2a44, #1b6e9e);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
display: inline-block;
letter-spacing: -0.3px;
}
.dashboard-header .sub {
font-size: 0.95rem;
color: #3d5a78;
background: rgba(27, 110, 158, 0.07);
padding: 4px 22px;
border-radius: 40px;
display: inline-block;
margin-top: 4px;
border: 1px solid rgba(27, 110, 158, 0.08);
}
.dashboard-header .sub i {
color: #1b6e9e;
margin-right: 6px;
}

/* ===== KPI 卡片 ===== */
.kpi-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 16px;
margin-bottom: 30px;
}
.kpi-card {
background: #fff;
border-radius: 18px;
padding: 18px 14px 14px;
box-shadow: 0 4px 18px rgba(0, 20, 40, 0.04);
text-align: center;
border: 1px solid rgba(255, 255, 255, 0.6);
transition: transform 0.12s ease;
}
.kpi-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 26px rgba(0, 30, 60, 0.08);
}
.kpi-icon {
font-size: 1.3rem;
color: #1b6e9e;
margin-bottom: 2px;
}
.kpi-number {
font-size: 1.7rem;
font-weight: 700;
color: #0a2a44;
line-height: 1.3;
}
.kpi-number small {
font-size: 0.85rem;
font-weight: 400;
color: #556a7e;
}
.kpi-label {
font-size: 0.78rem;
color: #5d7186;
margin-top: 0px;
font-weight: 500;
}
.kpi-tag {
font-size: 0.65rem;
background: #e9f0f8;
padding: 2px 10px;
border-radius: 30px;
color: #1b6e9e;
display: inline-block;
margin-top: 4px;
font-weight: 500;
}
.kpi-card.gold .kpi-number {
color: #c27a1a;
}
.kpi-card.gold .kpi-icon {
color: #c27a1a;
}
.kpi-card.gold .kpi-tag {
background: #fef3e0;
color: #b06d1a;
}
.kpi-card.purple .kpi-number {
color: #7d3c98;
}
.kpi-card.purple .kpi-icon {
color: #7d3c98;
}
.kpi-card.purple .kpi-tag {
background: #f3e8fa;
color: #7d3c98;
}
.kpi-card.teal .kpi-number {
color: #117a65;
}
.kpi-card.teal .kpi-icon {
color: #117a65;
}
.kpi-card.teal .kpi-tag {
background: #e2f3ef;
color: #117a65;
}
.kpi-card.orange .kpi-number {
color: #d06b1e;
}
.kpi-card.orange .kpi-icon {
color: #d06b1e;
}
.kpi-card.orange .kpi-tag {
background: #fef0e0;
color: #b85f18;
}

/* ===== 图表卡片 ===== */
.chart-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
margin-bottom: 24px;
}
.chart-card {
background: #ffffff;
border-radius: 22px;
padding: 18px 18px 14px;
box-shadow: 0 4px 20px rgba(0, 20, 40, 0.04);
border: 1px solid rgba(255, 255, 255, 0.5);
transition: box-shadow 0.2s;
}
.chart-card:hover {
box-shadow: 0 8px 30px rgba(0, 30, 60, 0.06);
}
.chart-card.full-width {
grid-column: 1 / -1;
}
.chart-card.half-width {
grid-column: span 1;
}
.chart-title {
font-size: 1.05rem;
font-weight: 600;
color: #1a2c42;
margin-bottom: 10px;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.chart-title i {
color: #1b6e9e;
font-size: 1.1rem;
width: 22px;
text-align: center;
}
.chart-title .badge {
font-size: 0.7rem;
background: #e9f0f8;
color: #1b6e9e;
padding: 1px 12px;
border-radius: 30px;
font-weight: 500;
margin-left: 4px;
}
.chart-title .badge.orange {
background: #fef0e0;
color: #b85f18;
}
.chart-wrapper {
position: relative;
height: 250px;
}
.chart-wrapper.tall {
height: 290px;
}
.chart-wrapper canvas {
width: 100% !important;
height: 100% !important;
}
.chart-footnote {
font-size: 0.72rem;
color: #6a7e92;
margin-top: 4px;
text-align: right;
border-top: 1px solid #f0f4fa;
padding-top: 6px;
}
.chart-footnote i {
color: #1b6e9e;
margin-right: 4px;
}

/* ===== 底部 ===== */
.footer-note {
margin-top: 26px;
background: #fff;
border-radius: 18px;
padding: 14px 24px;
font-size: 0.8rem;
color: #4a6178;
border: 1px solid #eef4fa;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.footer-note i {
color: #1b6e9e;
margin-right: 6px;
}
.footer-note .tags span {
background: #eef4fa;
padding: 2px 12px;
border-radius: 30px;
margin-left: 8px;
font-size: 0.7rem;
color: #1a3e5a;
}

/* ===== 响应式 ===== */
@media (max-width: 940px) {
.chart-grid {
grid-template-columns: 1fr;
gap: 20px;
}
.chart-card.full-width {
grid-column: 1;
}
.chart-card.half-width {
grid-column: 1;
}
.dashboard-header h1 {
font-size: 1.7rem;
}
.kpi-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 550px) {
.kpi-grid {
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.kpi-number {
font-size: 1.3rem;
}
.chart-wrapper {
height: 200px;
}
.chart-wrapper.tall {
height: 220px;
}
body {
padding: 14px 8px;
}
.dashboard-header h1 {
font-size: 1.3rem;
}
}
</style>
</head>
<body>

<div class="container">

<!-- ===== 标题 ===== -->
<div class="dashboard-header">
<h1>📊 中国高校毕业生 · 数据全景 (2020–2026)</h1>
<div class="sub">
<i class="fas fa-calendar-alt"></i> 2024届基准 · 2025–2026预测 · 精英院校深度解析
</div>
</div>

<!-- ===== KPI 卡片 ===== -->
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-icon"><i class="fas fa-users"></i></div>
<div class="kpi-number">1270 <small>万</small></div>
<div class="kpi-label">2026届预测总规模</div>
<span class="kpi-tag">📈 历史峰值</span>
</div>
<div class="kpi-card">
<div class="kpi-icon"><i class="fas fa-layer-group"></i></div>
<div class="kpi-number">45.84<small>%</small></div>
<div class="kpi-label">高职(专科)占比</div>
<span class="kpi-tag">🎓 最大群体</span>
</div>
<div class="kpi-card gold">
<div class="kpi-icon"><i class="fas fa-gem"></i></div>
<div class="kpi-number">9.16<small>%</small></div>
<div class="kpi-label">985/211 占全国</div>
<span class="kpi-tag">🏆 精英层</span>
</div>
<div class="kpi-card purple">
<div class="kpi-icon"><i class="fas fa-arrow-up"></i></div>
<div class="kpi-number">6918 <small>元</small></div>
<div class="kpi-label">博士 vs 硕士 溢价</div>
<span class="kpi-tag">💰 学历红利</span>
</div>
<div class="kpi-card teal">
<div class="kpi-icon"><i class="fas fa-university"></i></div>
<div class="kpi-number">3:1</div>
<div class="kpi-label">复旦 研究生:本科生</div>
<span class="kpi-tag">📚 本研倒挂</span>
</div>
<div class="kpi-card orange">
<div class="kpi-icon"><i class="fas fa-regular fa-building-columns"></i></div>
<div class="kpi-number">2.6:1</div>
<div class="kpi-label">上交 研究生:本科生</div>
<span class="kpi-tag">📚 本研倒挂</span>
</div>
</div>

<!-- ===== 图表区 ===== -->
<div class="chart-grid">

<!-- 1. 总规模趋势(全宽) -->
<div class="chart-card full-width">
<div class="chart-title">
<i class="fas fa-chart-bar"></i> 2020–2026 年高校毕业生总规模
<span class="badge">柱状图</span>
<span style="font-size:0.72rem; color:#5d7186; margin-left:auto;"><i class="far fa-circle"></i> 2022年首次突破千万</span>
</div>
<div class="chart-wrapper tall">
<canvas id="chartTotal"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-database"></i> 2025–2026为预测数据 · 2026年达1270万峰值
</div>
</div>

<!-- 2. 2024届学历分布 → 饼图 -->
<div class="chart-card half-width">
<div class="chart-title">
<i class="fas fa-chart-pie"></i> 2024届 · 学历层次分布
<span class="badge">饼图</span>
</div>
<div class="chart-wrapper">
<canvas id="chartDegreePie"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-info-circle"></i> 高职45.84% · 本科44.02% · 研究生9.19%
<span style="margin-left:12px;">🔹 硕博合计108.36万</span>
</div>
</div>

<!-- 3. 985/211 占全国 → 饼图 -->
<div class="chart-card half-width">
<div class="chart-title">
<i class="fas fa-university"></i> 985/211 占全国应届生
<span class="badge">饼图</span>
</div>
<div class="chart-wrapper">
<canvas id="chart985Pie"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-info-circle"></i> 精英院校合计108万人 · 占比9.16%
</div>
</div>

<!-- 4. 985/211 内部结构 → 饼图 -->
<div class="chart-card half-width">
<div class="chart-title">
<i class="fas fa-sitemap"></i> 985/211 · 内部学历结构
<span class="badge">饼图</span>
</div>
<div class="chart-wrapper">
<canvas id="chart985InnerPie"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-info-circle"></i> 研究生占比46.6% · 本科生53.4%
<span style="margin-left:12px;">🎓 本研倒挂显著</span>
</div>
</div>

<!-- 5. 学历溢价 → 柱状图 -->
<div class="chart-card half-width">
<div class="chart-title">
<i class="fas fa-money-bill-trend-up"></i> 学历溢价对比 (月起薪差值)
<span class="badge">柱状图</span>
</div>
<div class="chart-wrapper">
<canvas id="chartPremium"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-arrow-up"></i> 博士 vs 硕士 +6918元 · 硕士 vs 本科 +1887元
</div>
</div>

<!-- 6. 研究生报名人数趋势(全宽) -->
<div class="chart-card full-width">
<div class="chart-title">
<i class="fas fa-regular fa-pen-to-square"></i> 全国硕士研究生报名人数趋势 (2020–2025)
<span class="badge orange">📉 降温信号</span>
<span style="font-size:0.72rem; color:#5d7186; margin-left:auto;">2025年跌破400万</span>
</div>
<div class="chart-wrapper tall">
<canvas id="chartApply"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-info-circle"></i> 2025年报名388万人,较峰值下降18.1% · 应届生对学历投资回报趋于理性
</div>
</div>

<!-- 7. 本研倒挂 对比(全宽) -->
<div class="chart-card full-width">
<div class="chart-title">
<i class="fas fa-regular fa-scale-balanced"></i> 顶尖高校 “本研倒挂” 对比 (研究生:本科生)
<span class="badge">柱状图</span>
<span style="font-size:0.72rem; color:#5d7186; margin-left:auto;">复旦 & 上交 研究生规模已超本科生</span>
</div>
<div class="chart-wrapper tall">
<canvas id="chartInversion"></canvas>
</div>
<div class="chart-footnote">
<i class="fas fa-info-circle"></i> 复旦大学研究生招生规模为本科生近3倍 · 上海交通大学约2.6倍
</div>
</div>

</div>

<!-- ===== 底部 ===== -->
<div class="footer-note">
<div>
<i class="fas fa-table"></i> 数据来源:教育部公开数据 · 统计预测 · 各校招生公报
</div>
<div class="tags">
<span><i class="far fa-clock"></i> 2024届基准</span>
<span><i class="fas fa-chart-line"></i> 2025–2026预测</span>
<span><i class="fas fa-calculator"></i> 单位:万人 / 元</span>
<span><i class="fas fa-gem"></i> 985/211 合计108万人</span>
</div>
</div>

</div>

<!-- ============================================================ -->
<!-- JavaScript:Chart.js 所有图表 -->
<!-- ============================================================ -->
<script>
(function() {

// -------- 通用配色 --------
const primary = '#1b6e9e';
const secondary = '#4d9bc6';
const accent = '#e67e22';
const purple = '#7d3c98';
const green = '#27ae60';
const teal = '#117a65';
const grey = '#95a5a6';
const dark = '#0a2a44';

// -------- 1. 总规模柱状图 --------
const ctx1 = document.getElementById('chartTotal').getContext('2d');
const totalData = [874, 909, 1076, 1158, 1179, 1222, 1270];
const totalLabels = ['2020', '2021', '2022', '2023', '2024', '2025', '2026'];
new Chart(ctx1, {
type: 'bar',
data: {
labels: totalLabels,
datasets: [{
label: '毕业生总数(万人)',
data: totalData,
backgroundColor: totalData.map((v, i) =>
i === totalData.length - 1 ? '#e67e22' :
i >= totalData.length - 2 ? '#4d9bc6' : '#1b6e9e'
),
borderRadius: 4,
barPercentage: 0.6,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false },
tooltip: { callbacks: { label: (ctx) => ctx.parsed.y + ' 万人' } }
},
scales: {
y: {
beginAtZero: true,
grid: { color: 'rgba(0,0,0,0.04)' },
ticks: { callback: (val) => val + '万', font: { size: 10 } }
},
x: {
grid: { display: false },
ticks: { font: { size: 11, weight: '500' } }
}
}
}
});

// -------- 2. 2024届学历分布 饼图 --------
const ctx2 = document.getElementById('chartDegreePie').getContext('2d');
new Chart(ctx2, {
type: 'doughnut',
data: {
labels: ['高职(专科)45.84%', '本科 44.02%', '研究生 9.19%'],
datasets: [{
data: [540.43, 518.96, 108.36],
backgroundColor: ['#27ae60', '#1b6e9e', '#7d3c98'],
borderWidth: 2,
borderColor: '#ffffff',
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
cutout: '52%',
plugins: {
legend: {
position: 'bottom',
labels: { boxWidth: 12, padding: 10, font: { size: 10 } }
},
tooltip: {
callbacks: {
label: function(ctx) {
const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
const pct = ((ctx.parsed / total) * 100).toFixed(2);
return ctx.label.split(' ')[0] + ': ' + ctx.parsed + ' 万 (' + pct + '%)';
}
}
}
}
}
});

// -------- 3. 985/211 占全国 饼图 --------
const ctx3 = document.getElementById('chart985Pie').getContext('2d');
new Chart(ctx3, {
type: 'doughnut',
data: {
labels: ['985/211 院校 9.16%', '其他院校 90.84%'],
datasets: [{
data: [108, 1179 - 108],
backgroundColor: ['#e67e22', '#e9f0f8'],
borderWidth: 2,
borderColor: '#ffffff',
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
cutout: '55%',
plugins: {
legend: {
position: 'bottom',
labels: { boxWidth: 12, padding: 10, font: { size: 10 } }
},
tooltip: {
callbacks: {
label: function(ctx) {
const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
const pct = ((ctx.parsed / total) * 100).toFixed(2);
return ctx.label.split(' ')[0] + ': ' + ctx.parsed + ' 万 (' + pct + '%)';
}
}
}
}
}
});

// -------- 4. 985/211 内部结构 饼图 --------
const ctx4 = document.getElementById('chart985InnerPie').getContext('2d');
new Chart(ctx4, {
type: 'doughnut',
data: {
labels: ['本科生 53.39%', '硕士生 39.17%', '博士生 7.44%'],
datasets: [{
data: [58, 42, 8],
backgroundColor: ['#1b6e9e', '#4d9bc6', '#7d3c98'],
borderWidth: 2,
borderColor: '#ffffff',
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
cutout: '50%',
plugins: {
legend: {
position: 'bottom',
labels: { boxWidth: 12, padding: 10, font: { size: 10 } }
},
tooltip: {
callbacks: {
label: function(ctx) {
const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
const pct = ((ctx.parsed / total) * 100).toFixed(2);
return ctx.label.split(' ')[0] + ': ' + ctx.parsed + ' 万 (' + pct + '%)';
}
}
}
}
}
});

// -------- 5. 学历溢价 柱状图 --------
const ctx5 = document.getElementById('chartPremium').getContext('2d');
new Chart(ctx5, {
type: 'bar',
data: {
labels: ['博士 vs 硕士', '硕士 vs 本科', '本科 vs 2023届'],
datasets: [{
label: '月起薪差值(元)',
data: [6918, 1887, 158],
backgroundColor: ['#e67e22', '#1b6e9e', '#95a5a6'],
borderRadius: 4,
barPercentage: 0.55,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: (ctx) => ' + ' + ctx.parsed.y + ' 元'
}
}
},
scales: {
y: {
beginAtZero: true,
grid: { color: 'rgba(0,0,0,0.04)' },
ticks: {
callback: (val) => val >= 1000 ? (val / 1000).toFixed(0) + 'k' : val + '元',
font: { size: 10 }
}
},
x: {
grid: { display: false },
ticks: { font: { size: 10, weight: '500' } }
}
}
}
});

// -------- 6. 研究生报名人数趋势 柱状图 --------
const ctx6 = document.getElementById('chartApply').getContext('2d');
const applyData = [341, 377, 457, 474, 438, 388];
const applyLabels = ['2020', '2021', '2022', '2023', '2024', '2025'];
new Chart(ctx6, {
type: 'bar',
data: {
labels: applyLabels,
datasets: [{
label: '报名人数(万人)',
data: applyData,
backgroundColor: applyData.map((v, i) =>
i === applyData.length - 1 ? '#c0392b' :
v === Math.max(...applyData) ? '#e67e22' : '#4d9bc6'
),
borderRadius: 4,
barPercentage: 0.6,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: (ctx) => ctx.parsed.y + ' 万人'
}
}
},
scales: {
y: {
beginAtZero: true,
grid: { color: 'rgba(0,0,0,0.04)' },
ticks: {
callback: (val) => val + '万',
font: { size: 10 }
}
},
x: {
grid: { display: false },
ticks: { font: { size: 10, weight: '500' } }
}
}
}
});

// -------- 7. 本研倒挂对比 柱状图 --------
const ctx7 = document.getElementById('chartInversion').getContext('2d');
new Chart(ctx7, {
type: 'bar',
data: {
labels: ['复旦大学', '上海交通大学'],
datasets: [{
label: '研究生 : 本科生 (比例)',
data: [3.0, 2.6],
backgroundColor: ['#7d3c98', '#1b6e9e'],
borderRadius: 4,
barPercentage: 0.45,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: (ctx) => '研究生 : 本科生 = ' + ctx.parsed.y.toFixed(1) + ' : 1'
}
}
},
scales: {
y: {
beginAtZero: true,
max: 3.5,
grid: { color: 'rgba(0,0,0,0.04)' },
ticks: {
callback: (val) => val.toFixed(1) + ':1',
font: { size: 10 }
}
},
x: {
grid: { display: false },
ticks: { font: { size: 11, weight: '500' } }
}
}
}
});

})();
</script>
</body>
</html>
1