Who runs our country?

Who runs our country?

又是一年两会时,前几天看到了一个非常酷炫的可视化项目:Who runs China?。里面可视化了今年的人大代表相关的数据。我也想用 R 模仿一些。

全国人民代表大会是我国最高的权力机关,每年三月份,各地的人大代表们汇聚在北京共同探讨国家大事。

总人数

今年的全国人代会一共有来自 35 个代表团的 2975 名名代表:

数据集整理自data.js,整理好的数据集下载:NPC.csv

还需要下载下面代码中的delegation2.csv

R
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
library(readr)
library(tidyverse)
library(magrittr)
df <- read_csv("NPC.csv")
# 全国人民代表大会是我国最高的权力机关,每年三月份,各地的人大代表们汇聚在北京共同探讨国家大事。
# 图1: 全国人大代表的人数
library(waffle)
# 首先计算每个代表团的人数
df %>%
count(Delegation) -> delegation
delegation %>% write_csv("delegation.csv") # 手动添加中文翻译
delegation <- read_csv("delegation2.csv") %>%
transmute(
delegation = `代表团`,
count = n
) %>%
mutate(
delegation = gsub(x = delegation, pattern = "中国人民解放军武装警察部队", replacement = "中国人民解放军\n武装警察部队")
)
colors <- c(rep(RColorBrewer::brewer.pal(8, "Set2"), 4), RColorBrewer::brewer.pal(3, "Set2"))
waffle(delegation, rows = 50, size = 0.5, colors = colors) +
labs(title = "全国人大代表人数:2975", subtitle = "一共35个代表团") +
hrbrthemes::theme_ipsum(base_family = 'STYuanti-SC-Regular') +
theme(axis.text = element_blank()) +
theme(panel.grid.major = element_blank())

性别分布

首先来看性别分布:

在所有的 2975 名人大代表中,男性人大代表的数量为 2233,女性人数为 742,从历史数据趋势来看,女性人大代表的数量正在逐年递增:

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tribble(
~year, ~percent,
10, 0.202,
11, 0.213,
12, 0.234,
13, 0.249
) %>%
ggplot() +
geom_line(aes(x = year, y = percent, size = percent), color = "#fb9a99") +
scale_x_continuous(breaks = 10:13,
labels = paste0(10:13, "th")) +
scale_y_continuous(breaks = c(0.2, 0.21, 0.22, 0.23, 0.24, 0.25),
labels = paste0(c(20, 21, 22, 23, 24, 25), "%")) +
labs(x = "全国人大", y = "女性比例", title = "历届全国人代女性比例") +
theme(legend.position = "none")

年龄分布

可以看出,60 后是 NPC 的核心,90 后中女性的数量多于男性。人大代表们的平均年龄是 53.77 岁。其中,1672 名代表出生于 20 世纪 60 年代,占总数的一半以上。另外我们还可以看到,代表们越年轻,性别比例越均衡。

R
1
2
3
4
5
6
df %>% count(`年代`, `性别`) %>%
ggplot() +
geom_col(aes(x = `年代`, y = n, fill = `性别`)) +
scale_fill_manual("性别", breaks = c("男", "女"), values = c("#1f78b4", "#fb9a99")) +
labs(x = "年代", y = "数量", title = "全国人大代表的年龄分布",
subtitle = paste("平均年龄为", df %$% mean(.$Age, na.rm = T) %>% round(2), "岁"))

民族分布

其中汉族人 2538 人,占总数的 85%。

R
1
2
3
4
5
6
7
8
9
10
11
12
library(treemapify)
df %>%
count(民族) %>%
mutate(
ishan = (民族 == "汉族") * 1
) %>%
ggplot(aes(area = n, fill = factor(ishan))) +
geom_treemap() +
geom_treemap_text(aes(label = 民族), family = 'STYuanti-SC-Regular', size = 12, color = "#ffffff") +
scale_fill_manual(values = c("#DF5656", "#E78A8B")) +
theme(legend.position = "none") +
labs(title = "全国人大代表的民族分布", subtitle = "我国是一个多民族国家")

学历分布

每 10 名人大代表中就有 9 名持有学士及以上的学位。88.5%的代表拥有学士学位或以上学历。拥有硕士学位的人占最大比例(836 人),博士学位排名第二(584 人)。

学科分布

全国人大代表的专业背景怎么样?根据中国教育部的专业分类,管理科学,哲学,文学,历史,教育,艺术,经济,法律和军事科学属于人文社会科学 ; 而科学,工程,农业和医学是自然科学。

R
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
library(ggpol)
df %>% count(人文社科拆后专业) %>%
mutate(
人文社科拆后专业 = factor(
人文社科拆后专业,
levels = c("法学", "工学", "管理学", "教育学", "经济学",
"军事", "理学", "历史学", "农学", "未知",
"文学", "医学", "艺术", "哲学"),
labels = c("法学", "工学", "管理学", "教育学", "经济学",
"军事", "理学", "历史学", "农学", "未知",
"文学", "医学", "艺术", "哲学"))
) %>%
ggplot() +
geom_parliament(aes(seats = n, fill = 人文社科拆后专业,
color = 人文社科拆后专业)) +
coord_fixed() +
scale_fill_manual("学科",
values = c(brewer.pal(9, 'Paired'), brewer.pal(5, "Set2")),
breaks = 1:14,
labels = c("法学", "工学", "管理学", "教育学", "经济学",
"军事", "理学", "历史学", "农学", "未知",
"文学", "医学", "艺术", "哲学")) +
scale_color_manual("学科", values = c(brewer.pal(9, 'Paired'), brewer.pal(5, "Set2"))) +
guides(color = "none") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank())

R
1
2
3
4
5
6
7
8
9
10
11
12
13
library(ggparl)
df %>% count(人文社科拆后专业) %$%
ggplot_parliament(.$人文社科拆后专业, .$n) +
theme_ipsum(base_family = 'STYuanti-SC-Regular') +
theme(axis.text = element_blank()) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title = element_blank(),
panel.background = element_blank()) +
scale_fill_manual(name = "学科", values = c(brewer.pal(9, 'Paired'), brewer.pal(5, "Set2"))) -> majors

majors$guides$fill$title <- "学科"
majors

党派分布

R
1
df %>% count(党派)
党派 数量
中共 2172
423
九三学社 64
民主同盟 58
民主建国会 57
农工党 54
中国民主促进会 54
民革 44
致公党 38
台盟 11

R
1
2
3
4
5
6
7
8
9
10
11
12
13
library(ggalluvial)
df %>%
left_join(read_csv("delegation2.csv"), by = "Delegation") %>%
count(代表团, 党派) %>%
ggplot(aes(axis1 = 代表团, axis2 = 党派, y = n)) +
scale_x_discrete(limits = c("代表团", "党派"), expand = c(0.1, 0.05)) +
geom_stratum() +
geom_alluvium(aes(fill = 党派)) +
geom_text(stat = "stratum", label.strata = TRUE, family = "STYuanti-SC-Regular", size = 3) +
scale_fill_brewer(type = "qua", palette = 3) +
guides(fill = "none") +
theme(axis.text.y = element_blank(),
axis.title.y = element_blank())

区域与党派

R
1
2
3
4
5
6
7
8
9
10
11
12
df %>%
left_join(read_csv("delegation2.csv"), by = "Delegation") %>%
count(区域, 党派) %>%
ggplot(aes(axis1 = 区域, axis2 = 党派, y = n)) +
scale_x_discrete(limits = c("区域", "党派"), expand = c(0.1, 0.05)) +
geom_stratum() +
geom_alluvium(aes(fill = 党派)) +
geom_text(stat = "stratum", label.strata = TRUE, family = "STYuanti-SC-Regular", size = 3) +
scale_fill_brewer(type = "qua", palette = 3) +
guides(fill = "none") +
theme(axis.text.y = element_blank(),
axis.title.y = element_blank())

参考文献

Who runs China?
ColorBrewer: Color Advice for Maps
ggalluvial: 绘制桑基图
ggparl: Parliament Diagrams with ggplot2
ggpol: Parliament diagrams and more for ggplot2

代表们籍贯的地理分布图

R
1
2
3
4
5
6
7
library(hchinamap)
df %>%
count(籍贯) %$%
hchinamap(name = .$籍贯, .$n,
minColor = "#fee0d2",
maxColor = "#de2d26",
title = "人大代表的籍贯分布")
# R

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×