前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >国内疫情图绘制(静态)

国内疫情图绘制(静态)

作者头像
庄闪闪
发布2021-04-09 10:47:22
7430
发布2021-04-09 10:47:22
举报
文章被收录于专栏:庄闪闪的R语言手册

该点子来源于一个小作业,作业要求是使用R平台相关绘图工具绘制中国疫情热力图(10分),参考效果如下图:

第一次使用R绘制地图的我,一脸懵逼。于是我开始翻书(《R语言数据可视化之美》,《ggplot2》),《R数据科学》),以及百度搜索。找到了几篇很实在的blog(见文末)。最后我的作业如下:

所需的包

代码语言:javascript
复制
library(mapdata)
library(maptools)
library(ggplot2)
library(plyr)

利用maptools包,可以导入shp格式的中国地图(相当于一个模板),该文件可通过网上获取,为了大家方便实战,我i已经将该文件放在我的github里,尽情下载。

代码语言:javascript
复制
china_map = readShapePoly("bou2_4p.shp")#导入shp格式的中国地图
x<-china_map@data

得到的中国地图数据如下

地图中共计有925个地域信息,并将其转化为数据库,并基于id进行连接。

代码语言:javascript
复制
xs<-data.frame(x,id=seq(0:924)-1)
china_map1<-fortify(china_map)  #转化为数据框
china_map_data<-join(china_map1,xs,type="full")#基于id进行连接
a = data.frame(unique(china_map@data$NAME))#省份名称

接下来准备我们的数据,数据主要来自丁香园,是某一天的中国各省数据(ratio表示累计确认人数,people表示当天确认人数,province表示省份)一共31的省份,包括(香港,台湾)。基于两个表格相同属性(NAME)进行合并,这样就可以把模板中的地理信息一起合在一起了,这是关键步骤。

代码语言:javascript
复制
mydata<-read.csv("data_dt.csv",header=T,as.is=T)
china_data <- join(china_map_data, mydata, type="full")#基于NAME字段进行连接,NAME字段来自于地图文件中

绘制地图:

版本一(无省份名称的当日各省确认人数)

代码语言:javascript
复制
ggplot(china_data, aes(x = long, y = lat, group = group, fill = people)) +    
    geom_polygon(colour="grey40") +
    scale_fill_gradient(low="white",high="steelblue") +#指定渐变填充色,可使用RGB
    theme( #清除不需要的元素
        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.3)
      )

版本二(有省份名称的当日各省确认人数)

代码语言:javascript
复制
midpos <- function(x) mean(range(x,na.rm=TRUE)) #取形状内的平均坐标
centres <- ddply(china_data,.(NAME),colwise(midpos,.(long,lat)))

ggplot(china_data,aes(long,lat))+      
    geom_polygon(aes(group=group,fill=people),colour="black")+
    scale_fill_gradient(low="white",high="steelblue") +
    geom_text(aes(label=NAME),data=centres) +
    theme(
         panel.grid = element_blank(),
        panel.background = element_blank(),
         axis.text = element_blank(),
         axis.ticks = element_blank(),
         axis.title = element_blank()
        )

当然如需绘制当日累计各省确诊人数,只需将fill=people换成fill=ratio即可,大家可以自己尝试。代码,数据相关资料与shp格式的中国地图都已放在我的github上了。https://github.com/liangliangzhuang/R_example

参考文献:

https://my.oschina.net/u/2306127/blog/473842

https://site.douban.com/182577/widget/notes/10568279/note/257898418/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档