即中国疫情图之后,又来了一个小作业,作业要求是使用R平台相关绘图工具绘制全国疫情热力图(10分)。
代码语言:javascript复制library(maps)
library(ggplot2)
library(RColorBrewer)
library(plyr)
按照做中国疫情图的思路,先把全球数据模板进行导入(来源:张杰《R语言数据可视化之美 》)然后在和自己的数据进行匹配,用plyr包中的join函数。整理好的数据如下所示:
代码语言:javascript复制colormap<-c(rev(brewer.pal(9,"Greens")[c(4,6)]), brewer.pal(9,"YlOrRd")[c(3,4,5,6,7,8,9)])
mydata1<-read.csv("Country_Data.csv",stringsAsFactors=FALSE)#这个是全球数据
names(mydata1)=c("Country","Scale") #重新命名
mydata2 = read.csv("world_data.csv",header=TRUE) #我们的数据(疫情)
#将两个表格匹配
mydata <- join(mydata1, mydata2, type="full")
该数据包含某一日(具体哪天忘记了)全球各个国家的累计确认人数的数据,数据集包含地理位置(经度:long,纬度:lat),累计确诊人数ratio。该数据已放到github中,如果想尝试实现以,可通过文末阅读原文获取资料。注意的是:我们的数据(mydata2)和模板数据(mydata1)是用country合并的。接下来把ratio参数设置成分类型,以便于好绘制。
代码语言:javascript复制mydata$fan<-cut(mydata$ratio,
breaks=c(min(mydata$million,na.rm=TRUE),
0,1000,5000,10000,50000,200000,500000,2000000,
max(mydata$ratio,na.rm=TRUE)),
labels=c(" <=0","0~1000","1000~5000","5000~10000","10000~50000","50000~200000",
"200000~500000","500000~2000000"," >=2000000"),
order=TRUE)
#定义地图用全球的
world_map <- map_data("world")
#绘图
ggplot()
geom_map(data=mydata,aes(map_id=Country,fill=fan),map=world_map)
geom_path(data=world_map,aes(x=long,y=lat,group=group),colour="black",size=.2)
scale_y_continuous(breaks=(-3:3)*30)
scale_x_continuous(breaks=(-6:6)*30)
scale_fill_manual(name="Ratio",values= colormap,na.value="grey75")
guides(fill=guide_legend(reverse=TRUE))
theme_minimal()
绘制结果如下:
参考文献:
R语言数据可视化之美——李杰(强力推荐!好书!)
代码,数据与相关资料已放在我的github上了,见文末阅读原文。