偶然记起去年一位朋友微信发我一份美国大选数据,请教我如何画动态统计图。我抄起键盘改了改他的代码跑通了。这份数据包含了1960-2012年美国历次大选的投票人数(精确到县级)。我们使用map()
函数就能很容易地为地图着色。
唯一创新的点在于我使用了viridis
包里的调色盘数据,转化成rgb颜色进行填充。这里本来准备按照惯例使用红蓝配色,但由于着色区域太多,颜色显得很暗。故改为从黄色到蓝色的色谱。
为了给每一幅图片配上相应的图例,我收集了每一任总统姓名、当选年份与对应党派的信息。这些信息被存在president.csv文件里,然后绘制每幅图的时候配上相应年份的信息就行了。
library(maps)
library(animation)
library(viridis)
library(data.table)
election = fread(\'./elections.csv\')
presidenten = fread(\'./president.csv\')
election[, `:=`(sharedem = dem / (rep + dem + other),
sharerep = rep / (rep + dem + other))]
data(viridis.map) # a viridis palette
setDT(viridis.map)
viridis.map = viridis.map[opt == \'C\', ]
coldt = viridis.map[election[, sharerep * 250], ][, opt := NULL]
election[, county.col := rgb(coldt[, R], coldt[, G], coldt[, B])]
one = viridis.map[0.125 * 250, ]
two = viridis.map[0.375 * 250, ]
thre = viridis.map[0.625 * 250, ]
fo = viridis.map[0.875 * 250, ]
fi = rgb(one[, 1], one[, 2], one[, 3])
se = rgb(two[, 1], two[, 2], two[, 3])
thr = rgb(thre[, 1], thre[, 2], thre[, 3])
fr = rgb(fo[, 1], fo[, 2], fo[, 3])
colors = c(fr, thr, se, fi)
saveGIF({
for (i in seq(1960, 2012, 4)) {
# 1960-2012 loop every 4 year
thisyear = subset(election, year == i)
map(database = "county",
# plot by year
col = thisyear[,county.col],
fill = T)
tit = paste(\'United States Presidential Election:\', i) # get every year title
title(tit, cex.main = 1.3) # Add title
sub = subset(presidenten, year == i)
ps = paste(\'Winner:\', sub[, 2], \'-\', sub[, 3]) # get every year winner
mtext(ps, side = 1, cex = 1.1)
leg.txt = c("75-100%", "50-75%", "25-50%", "0-25%")
legend(
"bottomright",
leg.txt,
fill = colors,
title = ("Republican %"),
cex = 0.83
)
}
} , movie.name = "election_en.gif",
interval = 2) # set every plot stay time
如果将图例和president.csv文件改为中文,也可以画出个中文版的:
注意,最后使用animation
输出gif图片需要安装ImageMagick。具体方法上网搜肯定能解决,时间太久远记不得怎么弄了。
最近工作中很少用到R,但是R的一些可视化功能仍然强大,这篇就算做个归档吧。
文中使用的数据,点击下载。
请发表评论