前言
之前就有读者反映,为什么我们EasyCharts公众号除了撰写Excel图表类的文章,怎么还写R语言、Python等数据分析与可视化的文章。
这次,我跟大家解释一下。天下大道,万法归一。数据可视化重点是数据正确、合理、美观的可视化,而不在于工具的选用,使用Excel、R、Python、Tableau的绘图理念、配色技巧等都大同小异;
集百家之所长,补本身之所短,学习或欣赏不同软件绘制的图表,然后借鉴使用到自己的图表绘制中。我之前的文章和书籍章节,就是把R、Python、Tableau、Matlab、D3.js等绘图理念和配色技巧引入Excel绘图中(学术图表的基本配色方法);
不同软件都有自己生存之道、都有自己的优势。Excel对空间数据和多维数据的可视化能力很差,但是R、tableau、Python就可以弥补这些缺陷,但是tableau属于商业软件,价格极其昂贵,R、Python属于开源软件,本身可以用于数据分析,免费使用,但是需要编程才能实现。我想说,天下没有免费的午餐,你不想需欸小编程,就需要花钱买商业化软件。
我们EasyCharts团队的小魔方、世荣等都是R语言高手,最近整理学习R语言空间数据的可视化(地图),敬请期待,下面的文章只是一个开始!
顺祝大家周末愉快!
---张杰
今天跟大家分享如何以百分比形式填充离散分段数据地图。
案例用环渤海三省二市的地理数据。
library(ggplot2)
library(maptools)
library(plyr)
数据导入、转换、抽取
CHN_adm2 <- readShapePoly("c:/rstudy/CHN_adm/CHN_adm2.shp")
CHN_adm2_1 <- fortify(CHN_adm2)
data1 <- CHN_adm2@data
data2 <- data.frame(id=row.names(data1),data1)
china_map_data <- join(CHN_adm2_1, data2, type = "full")
huanbohai <-subset(china_map_data,NAME_1==c("Beijing","Tianjin","Nei Mongol","Hebei","Shandong"))
建立业务数据:
huanbohai_perm<-data.frame(NAME_2=unique(huanbohai$NAME_2),zhibiao=rnorm(42,100,50))
huanbohai_perm$zhibiao<-round(huanbohai_perm$zhibiao,0)
write.table (huanbohai_perm, file ="C:/rstudy/huanbohai.csv", sep =",", row.names =FALSE)
业务数据导入及合并:
mydata<-read.csv("C:/rstudy/huanbohai.csv",header=T)
huanbohai_map_data <- join(huanbohai,mydata, type="full")
###将转换的分段因子变量重新命名为我们需要的分段阀值:
huanbohai_map_data$fau <- cut(huanbohai_map_data$zhibiao, breaks = c(0,40,80,120,160,200))
huanbohai_map_data$fam<-factor(huanbohai_map_data$fau,levels=c('(0,40]','(40,80]','(80,120]','(120,160]','(160,200]'),labels=c('0~40','40~80','80~120','120~160','160~200'),order=TRUE)
离散颜色标度填充(实际值分段)
windowsFonts(myFont = windowsFont("微软雅黑"))
ggplot(huanbohai_map_data, aes(x = long, y = lat, group = group,fill =fam)) +
geom_polygon(colour="white")+
scale_fill_brewer(palette="Greens") + ###Blues&Greens
coord_map("polyconic") +
ggtitle("某公司2015~2016年度营业状况分布图")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
theme(
title=element_text(family="myFont"),
legend.text.align=1, ###图例标签右对齐
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
legend.position = c(0.08,0.6)
)
以上是昨天在东三省填充地图中所使用过的方法,接下来我解释一种新的填充方案,通过将数量段转换为百分比进行离散颜色标度填充:
离散颜色标度分割(百分比数量段):
qa <- quantile(na.omit(huanbohai_map_data$zhibiao), c(0,0.2,0.4,0.6,0.8,1.0))
huanbohai_map_data$zhibiao_q<-cut(huanbohai_map_data$zhibiao,qa,labels = c("0-20%", "20-40%","40-60%","60-80%", "80-100%"),include.lowest = TRUE)
levels(huanbohai_map_data$zhibiao_q)
[1] "0-20%" "20-40%" "40-60%" "60-80%" "80-100%"
通过将指标变量以分段百分比的方式进行分割,新建立一个百分比分段因子变量:
离散渐变(百分比)
windowsFonts(myFont = windowsFont("微软雅黑"))
ggplot(huanbohai_map_data,aes(long,lat))+
geom_polygon(aes(group=group,fill=zhibiao_q),colour="white")+
scale_fill_brewer(palette="Greens")+
coord_map("polyconic") +
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
ggtitle("某公司2015~2016年度营业状况分布图")+
theme(
title=element_text(family="myFont"),
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
legend.position =c(0.2,0.7),
legend.text.align=1
)
###带标签
接下来处理标签问题:
创建各城市中心地理坐标:
midpos <- function(data1) mean(range(data1,na.rm=TRUE))
centres <- ddply(huanbohai_map_data,.(city),colwise(midpos,.(long,lat)))
填充并添加标签:
ggplot(huanbohai_map_data,aes(long,lat))+
geom_polygon(aes(group=group,fill=zhibiao_q),colour="white")+
scale_fill_brewer(palette="Greens")+
coord_map("polyconic") +
geom_text(aes(label=city),size =3,family="myFont",fontface="plain",data=centres) +
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
ggtitle("某公司2015~2016年度营业状况分布图")+
theme(
title=element_text(family="myFont"),
title=element_text(family="myFont"),
panel.grid = element_blank(),
panel.background = element_blank(),
legend.text.align=1,
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
legend.position = c(0.2,0.7)
)