台湾2012年选举结束,国民党胜出,在 维基百科上看到了投票的结果,很好奇蓝绿投票的地理分布,于是用维基百科上给的投票数据,又从网上找来了免费的台湾 GIS 数据,在 R 里自己画了一下。这个 GIS 数据比较古老,和现在台湾的行政区划略有不同,譬如嘉义县和嘉义市、新竹县和新竹市还没有分开,而高雄市和高雄县、台南市和台南县、台东市和台东县却是分开的,还有没有新北市,只有台北县(所以上图的 Taipei 图例其实是新北市,忘记改了,呵呵)。好在边界的坐标没有大变,所以手动的作了调整,毕竟是免费的 GIS。arcGIS要更精确些(包括边界的 polygon ),但是那个要钱的:)
每个投票区域的“蓝”度由 蓝票/(绿票+蓝票) 的比例来决定,按照这个简单的算法,台湾版图上最蓝的是花莲,其次是台东和苗栗。最不“蓝”的是云林,嘉义和台南。图例的括号里的数字就是这个地区的“蓝”度。
从这个得票的地理分布和最终国民党和民进党最终 51.6% 比 45.6% 的得票率来看,民进党的竞选纲领有问题,明显的没有获得中间选民的支持,而是过于政策导向 (policy-oriented) 了。蔡英文的竞选过于侧重 base 选民,忽略了 swing 选民,失败也是在情理之中。不过有时候这确实也是一个很艰难的问题,如果不能得到 base 选民的支持,就无法从党内初选中胜出,参加最终的角逐。党内的 median voter 的 preference 如果和全部选民中的 median voter 的 preference 相差太远,不是一件好事。 同样的,就即将到来的美国大选而言,如果 Romney 能赢得初选,他对于 Obama 的威胁时最大的,但是正是因为他能和 Obama 争夺中间选民,反而使共和党内铁杆选民对他的支持减弱了,因为他会被认为不是真正的 conservative 。
下面是生成这副地图的 R codes:
1: library(maptools)
2: library(RColorBrewer)
3: tw.map <- readShapePoly('taiwan/TWN_adm2.shp')
4: mcol=brewer.pal(9, 'Blues')
5:
6: votes = read.table('votes.csv',sep=",")
7: votes = votes[ ,2:5]
8: votes=votes[votes[,1]!="",]
9: votes
10: names(votes)<-c("loc","total","green","blue")
11: votes$bratio <- votes$blue/(votes$green+votes$blue)
12: votes$col <-floor(((votes$bratio-min(votes$bratio))/(max(votes$bratio)-min(votes$bratio)))*8)
13:
14: provname=votes[,1]
15: f=function(x,y) ifelse(x %in% y,votes[votes$loc==x,6],-1);
16: colIndex=sapply(as.character(tw.map$NAME_2),f,as.character(provname));
17: colIndex[c(1,15,17)] = colIndex[c(8,14,16)]
18: fg=mcol[colIndex+1]
19:
20: votes = votes[order(votes$bratio,decreasing = T),]
21: bkp=paste(as.character(votes$loc)," (",as.character(round(votes$bratio,2)),")",sep="")
22: plot(tw.map,col=fg)
23: legend("topleft", bkp,fill=mcol[votes$col+1], bty="o", cex= 0.75, pt.lwd=3)