![4d24198c3d017cbda7e8ee6ee5d0c6e3.png](https://img-blog.csdnimg.cn/img_convert/4d24198c3d017cbda7e8ee6ee5d0c6e3.png)
窝在家里看代码,偶然间看到Y叔公众号推送的 用R画疫情地图第一波 ,想重复一下,结果其中一个Y叔自己写的包装不上(chinamap),尝试一下用别的方法实现R语言绘制疫情地图。
采用的方法基于R笔记1:ggplot绘制商务图表--中国分省热力地图_刘万祥ExcelPro_新浪博客
数据来源:
- 中国各省份、地区的地理信息:可以从 https://pan.baidu.com/share/link?shareid=54856&uk=352462598 链接下载,其中bou2_4p.dbf,bou2_4p.shx和bou2_4p.shp三个文件是我们所需要的,将它们解压在同一个目录下。
- 各行政区新冠病毒确诊患者数,用的是Y叔的办法:
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=1580373566110'
x = readLines(url, encoding="UTF-8")
x = sub("^d+", "", x)
x = sub("^(", "", x)
x = sub(")$", "", x)
y = fromJSON(x)
d = fromJSON(y$data)
write.csv(file='Heatmap_data.csv',d$areaTree[1,2][[1]][,c(1,3)])
产生的csv文件里包含了所需要的各行政区的确诊患者数,疑似患者数,死亡数和治愈的患者数:
![39ae878ea3a345d4945d624f60cb237f.png](https://img-blog.csdnimg.cn/img_convert/39ae878ea3a345d4945d624f60cb237f.png)
但是导入的地理信息和疫情信息里面所用的省份名称不一致(NAME一栏):
![c8cb5944f0787bab7ae823ee932ee14b.png](https://img-blog.csdnimg.cn/img_convert/c8cb5944f0787bab7ae823ee932ee14b.png)
为了方面后面合并地理信息和疫情信息表格,构建了对应关系表,并且根据患者数进行分类(Heatmap_data):
![aa4dd80bda7692e6b62cc0315e1b91dd.png](https://img-blog.csdnimg.cn/img_convert/aa4dd80bda7692e6b62cc0315e1b91dd.png)
根据NAME,合并地理信息和疫情信息:
china_map = readShapePoly("bou2_4p.shp")
x <- china_map@data
xs <- data.frame(x,id=seq(0:924)-1)
china_map1 <- fortify(china_map)
china_map_data <- join(china_map1, xs, type = "full")
china_data <- join(china_map_data, Heatmap_data, type="full")
合并后的结果:
![aca20bfdeb9de682d08e935ad302de55.png](https://img-blog.csdnimg.cn/img_convert/aca20bfdeb9de682d08e935ad302de55.png)
绘图:
p = ggplot(china_data, aes(x = long, y = lat, group = group,fill = Group)) + #按Group上色
geom_polygon(colour="Black") + coord_map("polyconic") #polyconic投影方式,防止地理图像的变形
![4ceb0103604e6923e1c9002fa20f6e1a.png](https://img-blog.csdnimg.cn/img_convert/4ceb0103604e6923e1c9002fa20f6e1a.png)
删除不必要的元素(灰色背景和横纵坐标等):
p = p + theme(
panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank()
)
![8adea2dea0104d9b752075f634863c78.png](https://img-blog.csdnimg.cn/img_convert/8adea2dea0104d9b752075f634863c78.png)
修改颜色,感觉Y叔的颜色方案挺好看,我就拿来用了:
p = p + scale_fill_manual(values=c("#FEE5D9","#A50F15","#FB6A4A","#FCAE91","#DE2D26"))
p
![7043856c18a6815a8e8a5078a2726c87.png](https://img-blog.csdnimg.cn/img_convert/7043856c18a6815a8e8a5078a2726c87.png)