利用丁香园数据生成疫情分布地图(R语言)| 博文精选


来源 | CSDN 博客

作者 | 万里写入胸怀间

责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

疫情牵动大家,除了做好分内工作,管好自己不给社会添乱,也就是只能持续关注疫情了。现在各大门户平台都上线了疫情实时地图,但基本上数据都只展示到省这个级别。

当然现在各地存在感染病例的小区也都及时披露了,相信疫后应该会有高精度的传染路径、传染扩散分布的分析。就目前而言,丁香园上的数据应该是目前聚合数据里面精度最高的了,可以获取到设区市级别的数据。但丁香园的数据存在地名不规范的问题,以及省、市、县三级行政区划并存的问题,不进行清洗不便做图。

底图制备

一张合适的底图是制作地图的基础。与行政区划相关的底图,最权威的数据源当然是从自然资源部的数据中心下载相关矢量数据再进行加工,最近微信公众号数读城市就在做这个浩大的工程。

我的方法是用高德API获取行政区划边界数据然后自行制图。高德数据的优点在于可以获取从全国、省、市、区(直辖市可以到镇)各级别行政区划边界的数据,对于不同级别行政区数据并存的情况,可以按需灵活组合,快速生成需要的底图。

丁香园公布的数据以设区市为主,台湾、香港、澳门公布总体数字,县(市)的数据较少。根据数据特点,我决定省级行政区划就保留港、澳、台三地,其余31个省、市、自治区保留设区市、自治州、省代管县级市以及直辖市的区、县。也就是高德API中,各省、自治区、直辖市子一级的行政单元。我是用sf包进行处理的,底图对象叫china_city数据框结构如下。

adcode即城市编码,下一步里从丁香园上下载的数据里有个locationId,和它是同一个意思。高德的adcode基于民政部的行政区划代码,并在民政部代码的基础上加了市辖区一级的代码,会干扰后续的处理,需要把它清理掉。

Amap_adcode=readxl::read_xlsx('AMap_adcode_citycode.xlsx') %>% select(name=中文名,adcode=adcode) %>% mutate_at('adcode',as.numeric) %>% filter(!grepl('辖区',name))

此外,坐标我也转换成wgs84。


疫情数据读取

方法来自于《R语言获取丁香园疫情数据动态网站》这篇帖子。这里就简单展示一下代码。

library(pacman)
p_load(sf,tidyverse,rvest,jsonlite)
setwd() #这里要自行设定工作路径
#read web
system('~/2019_nConv/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe my_js_dxy.js')
url='dxy_web.html'
withjs=read_html(url) %>% html_nodes('script#getAreaStat') %>% html_text()
mydata=str_remove_all(withjs,'try \\{ window.getAreaStat = ') %>% str_remove_all('\\}catch\\(e\\)\\{\\}')%>% fromJSON()

《R语言获取丁香园疫情数据动态网站》:

https://blog.csdn.net/yuanzhoulvpi/article/details/104099382

以上和链接帖子里完全一样,但我要获取的是城市的数据,所以还要再加一行:

city_data=mydata$cities %>% rlist::list.rbind()

清洗数据

清洗数据目的只有一个,那就是把citydata的locationId转换成底图数据adcode中包含的。这样就可以链接两张表并进行作图了。主要有两个方面。

1.手动纠正locationId值为(0,-1)地区的locationId值。

这部分数据的产生有几个类别。

  • 新疆生产建设兵团的数据。新疆生产建设兵团数据是以师团为单位上报的。由于师团往往分布在好几个省下一级行政区中,我就以师部所在地所属的行政区为准。比如第八师师部所在地石河子市,属于阿勒泰地区,则将这一行的locationId改为阿勒泰地区的行政区划代码654300。

  • 无行政区划代码的开发区、高新区等。如重庆的两江新区、南昌的赣江新区等。部分高新区涉及到不同的行政区,这里就不详加考证,划入组成排序第一的城区。

  • 因地名不规范而没有提供区划代码的地区。如云南大理州、楚雄州等,也需要进行手动纠正。

要注意的是,这部分数据随着每天新增感染病例在空间上的分散而不断变化,以下代码仅针对2月13日中午丁香园公布的数据。此外,还剩下一些数据因为地区有待明确,或被列为“外地来京”“外地来沪”等类型的病例,无法明确空间上的归属,出于严谨的考虑,这部分数据在制作分布图的时候就不采用了。用city_data=city_data %>% filter(locationId>100)剔除掉。

#
#change adcode manually
{ city_data$locationId[grepl('第四师',city_data$cityName)]=654300city_data$locationId[grepl('第六师',city_data$cityName)]=654300city_data$locationId[grepl('第七师',city_data$cityName)]=654000city_data$locationId[grepl('第八师',city_data$cityName)]=654300city_data$locationId[grepl('第九师',city_data$cityName)]=654200city_data$locationId[grepl('第十二师',city_data$cityName)]=650100  city_data$locationId[grepl('宁东',city_data$cityName)]=640100city_data$locationId[grepl('杨凌',city_data$cityName)]=610400city_data$locationId[grepl('两江新区',city_data$cityName)]=500105city_data$locationId[grepl('高新区',city_data$cityName)]=500106city_data$locationId[grepl('保亭',city_data$cityName)]=469029city_data$locationId[grepl('昌吉',city_data$cityName)]=652300city_data$locationId[grepl('酉阳',city_data$cityName)]=500242city_data$locationId[grepl('楚雄',city_data$cityName)]=532300city_data$locationId[grepl('文山',city_data$cityName)]=532600city_data$locationId[grepl('赣江',city_data$cityName)]=360100city_data$locationId[grepl('万盛',city_data$cityName)]=500110city_data$locationId[grepl('德宏',city_data$cityName)]=533100city_data$locationId[grepl('大理',city_data$cityName)]=532900city_data$locationId[grepl('红河',city_data$cityName)]=532500city_data=city_data %>% filter(locationId>100)
}

2.把县(市)locationId转换为上级行政区的locationId

这里的县(市)指的是受设区市或自治区管辖的县(市),省直管县级市不在此列。经过转换之后,就可以在下一步的分类汇总中,将县(市)数据汇总到上级行政区中。他们的转换需要两个步骤。

  • 怎么识别县(市)?经过上一步骤,所有的地区都有了合法的行政区划代码。那么,代码不在底图中的地区,就是我们需要转换的县(市)了。于是,代码就是row.no=which(!city_data$locationId %in% china_city$adcode)

  • 其次,怎么转换。比如我们得到的数据是石家庄市桥西区,其行政区划代码是130104,我们希望把它换成上级行政区也就是石家庄市的代码130100。那我们就要在Amap_adcode这张表里,以桥西区所在行为基准,往上查找距其最近的可以被100整除的(如果用字符型的话,那就是距其最近的代码最后两位是’00’)的代码。查找和替换的核心语句如下:

posi=grep(city_df$cityName[i],Amap_adcode$name)
while(Amap_adcode$adcode[posi]%%100!=0)  posi=posi-1 
city_df$locationId[i]=Amap_adcode$adcode[posi]

该部分完整的代码如下:

#R语言中行和列的待遇大不一样,好像还没有像select和mutate对列操作那样,对行在选择的同时进行操作的函数。所以这里就专门写了一个函数对行进行操作。
row_change=function(dataframe,row.no,fun){df_unfilter=dataframe[-row.no,]df_filter=dataframe[row.no,] %>%fun() %>%rbind(df_unfilter)return(df_filter)
}
#定义一个对县locationId进行向上替换的函数
upper_class_adcode=function(city_df)
{ for (i in 1:nrow(city_df)){if(city_df$locationId[i]>100){posi=grep(city_df$cityName[i],Amap_adcode$name)while(Amap_adcode$adcode[posi]%%100!=0)  posi=posi-1 city_df$locationId[i]=Amap_adcode$adcode[posi]}}return(city_df)
}
#得到县(市)数据所在行
row.no=which(!city_data$locationId %in% china_city$adcode)
#利用以上两个自定义函数进行替换
city_data_new=city_data %>% row_change(row.no,upper_class_adcode) 
#从原始数据中单独提取港澳台数据
GAT=mydata[lapply(mydata$cities,is_empty) %>% unlist,] %>% select(cityName=provinceName,currentConfirmedCount,confirmedCount,suspectedCount,curedCount,deadCount,locationId)
#合并形成完整的城市疫情数据
city_data_new =city_data_new  %>% rbind(GAT)


分类汇总、生成包含数据的sf对象

得到完整的城市疫情数据之后,以locationId为分类变量进行汇总,就可以把同一设区市的县级数据相加,形成设区市的汇总数据。鉴于丁香园上的地名并不规范,我们通过与Amap_code表格进行联结,用规范的地名替换原地名。

city_data_sum=city_data_new %>%select(-cityName)%>%  group_by(locationId) %>% summarise_all(sum)  %>% left_join(Amap_adcode,by=c('locationId'='adcode'))

再下一步,将底图的sf对象与汇总后的城市疫情数据链接,就可以生成包含数据的sf对象。

city_data_sf=china_city %>%left_join(,city_data_sum,by=c('adcode'='locationId'))%>%st_as_sf()
city_data_sf$confirmedCount[is.na(city_data_sf$confirmedCount)]=0              #将未报告患病人数的城市确诊数设为0


作图

这个方面,大神太多,我也是用的其他帖子《2019-nCoV疫情地图动态可视化》。基本上原封不动的抄过来。在我的电脑上,显示中文字体时R语言会崩溃,需要使用showtext包中的showtext_auto这个函数。

mybreaks <- c(0, 1, 10, 50, 100, 500, 1000, 5000, 100000)
mylabels <- c("0", "1-9", "10-49", "50-99", "100-499","500-999", "1000-4999", ">=5000")
city_data_sf=mutate(city_data_sf,conf_level=cut(confirmedCount,breaks=mybreaks,labels=mylabels,include.lowest = T,right=F,ordered_result = T))
ggplot(city_data_sf) + geom_sf(aes(fill = conf_level)) + coord_sf() + scale_fill_brewer(palette = "YlOrRd",) + guides(fill = guide_legend(title = "确诊病例", reverse = T)) + labs(title = "2019-ncov确诊患者空间分布",subtitle = Sys.Date(),caption = "数据来自丁香园") + theme(# 标题plot.title = element_text(face = "bold", hjust = 0.5,color = "black"),plot.subtitle = element_text(face = "bold", hjust = 0.5, size = 20,color = "red"),plot.caption = element_text(face = "bold", hjust = 1,color = "blue"),# 图例legend.title = element_text(face = "bold",color = "black"),legend.text = element_text(face = "bold",color = "black"),legend.background = element_rect(colour = "black"),legend.key = element_rect(fill = NA), # 图???????薇???legend.position = c(0.85, 0.2),axis.ticks = element_blank(),axis.text = element_blank(),# 绘图面板panel.background = element_blank(),panel.border = element_rect(color = "black", linetype = "solid", size = 1, fill = NA))



推荐阅读:Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了!| 博文精选
如何使用5个Python库管理大数据?
金三银四网络面经之 DNS 详解!
愿得一心人:硅谷亿万富豪们的婚姻怎样?有人白首相守七十年
一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码
2019年度区块链安全复盘总结
真香,朕在看了!猛戳“阅读原文”,填写中国远程办公-调查问卷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php连接数据库性能测试,无需安装配置,多操作系统支持数据库及性能测试

iBoxDB是一个NoSQL数据库, 有SQLite的特性,但拥有更强大的Replication功能,支持更多的数据类型,自动完成ORMSQLite是全球知名度Top 10的数据库之一, 在文章 中对 SQLite 与 MySQL进行了一个事务中1万次插入测试, 测试的结果是"sqlite3用时仅0.4s,mysql用时2.2s"iBoxD…

ORACLE 添加和查看注释

文章目录一、表二、字段一、表 #1.给表加注释 COMMENT ON TABLE SYS_JOB IS 任务调度表;#2.查看表的COMMENT SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAMETABLENAME; 例如&#xff1a; SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAMESYS_JOB;二、字段 # 1.给字段加…

一次开发、多端分发,阿里巴巴发布AliOS车载小程序

4月16日上海国际车展首日&#xff0c;阿里巴巴小程序有了新动态&#xff1a;正在研发基于AliOS的车载小程序。 AliOS展出车载小程序、AI HUD、AI驾驶舱等最新技术 作为阿里巴巴小程序在车载场景的重要延伸&#xff0c;AliOS车载小程序和支付宝、高德等小程序一样&#xff0c;将…

基于TableStore的海量气象格点数据解决方案实战

前言 气象数据是一类典型的大数据&#xff0c;具有数据量大、时效性高、数据种类丰富等特点。气象数据中大量的数据是时空数据&#xff0c;记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量&#xff0c;每天产生的数据量常在几十TB到上百TB的规模&#xff0c;且在…

腾讯会议扩容背后:100万核计算资源全由自研服务器星星海支撑

疫情期间&#xff0c;远程会议及协同办公需求暴增。从1月29日开始到2月6日&#xff0c;腾讯会议每天都在进行资源扩容&#xff0c;日均扩容云主机接近1.5万台&#xff0c;8天总共扩容超过10万台云主机&#xff0c;共涉及超百万核的计算资源投入。 值得一提的是&#xff0c;腾讯…

实时计算无线数据分析

本文为您介绍实时计算在无线数据分析中的应用。阿里云实时计算可以为无线App的数据分析场景实时化助力&#xff0c;帮助您做到实时化分析手机AP的各项指标&#xff0c;包括App版本分布情况、Crash检测和等。 阿里云移动数据分析 (Mobile Analytics&#xff0c;下面简称MAN) 是…

对话阿里云Alex Chen:下一代存储应如何面对云转型?

数字经济"乘云而上"。 十年前&#xff0c;阿里云开始自主研发云计算操作系统飞天之路&#xff0c;开启了中国云时代&#xff1b; 十年后&#xff0c;阿里云在中国市场份额超过2-8名总和&#xff0c;培育了整个中国云计算市场&#xff0c;数字经济在云上蓬勃发展。 …

写给大数据从业者:数据科学的5个陷阱与缺陷

来源 | AI 前线作者 | 陈炬&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;导读&#xff1a; 这篇分享主要总结了数据从业人员在实践中可能遇到的陷阱与缺陷。跟其他新起的行业一样&#xff0c;数据科学从业人员需要不停的去考虑现…

阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准

4月9日&#xff0c;澳门当地时间下午4:00-5:30&#xff0c;阿里云在ICDE 2019举办了主题为“云时代的数据库”的专场分享研讨会。 本次专场研讨会由阿里巴巴集团副总裁、高级研究员&#xff0c;阿里云智能数据库产品事业部负责人李飞飞&#xff08;花名&#xff1a;飞刀&#…

大神如何一招完美解决Hadoop集群无法正常关闭的问题!| 博文精选

来源 | CSDN 博客作者 | Alice菌&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;相信对于大部分的大数据初学者来说&#xff0c;一定遇见过Hadoop集群无法正常关闭的情况。有时候当我们更改了Hadoop内组件的配置文件后&#xff0c;…

现代IM系统中的消息系统架构 - 架构篇

前言 IM全称是『Instant Messaging』&#xff0c;中文名是即时通讯。在这个高度信息化的移动互联网时代&#xff0c;生活中IM类产品已经成为必备品&#xff0c;比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品&#xff0c;但其核心功…

华南地区最大数据中心上线 阿里云河源数据中心正式开服

2月18日&#xff0c;阿里云在官网宣布&#xff0c;河源数据中心正式对外提供服务。这是华南地区规模最大的绿色数据中心&#xff0c;可容纳超过30万台服务器&#xff0c;作为深圳地域的新可用区为华南地区上百万企业客户提供领先的云计算、人工智能、物联网等服务。 据悉&#…

在阿里做了五年技术主管,我有话想说

阿里妹导读&#xff1a;在历史文章《如何成为优秀的技术主管&#xff1f;》中&#xff0c;阿里巴巴高级技术专家云狄从开发规范、开发流程、技术规划与管理三个角度&#xff0c;分享对技术 TL 的理解与思考。 今天的文章&#xff0c;他将继续深入探讨这一话题&#xff0c;从管理…

Fish Redux中的Dispatch是怎么实现的?

零.前言 我们在使用fish-redux构建应用的时候&#xff0c;界面代码&#xff08;view&#xff09;和事件的处理逻辑&#xff08;reducer&#xff0c;effect&#xff09;是完全解耦的&#xff0c;界面需要处理事件的时候将action分发给对应的事件处理逻辑去进行处理&#xff0c;…

码上用它开始Flutter混合开发——FlutterBoost

开源地址: https://github.com/alibaba/flutter_boost为什么需要混合方案 具有一定规模的App通常有一套成熟通用的基础库&#xff0c;尤其是阿里系App&#xff0c;一般需要依赖很多体系内的基础库。那么使用Flutter重新从头开发App的成本和风险都较高。所以在Native App进行渐…

Linux系统常用指令总结

来源 | CSDN 博客作者 | 不撸代码闲得慌&#xff0c;责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;系统的运行级别0&#xff1a;关机1&#xff1a;单用户模式&#xff08;可以找回丢失的密码&#xff09;2&#xff1a;多用户状态没有网络服务…

像数据科学家一样思考:12步指南(下)

第三阶段-完成 一旦产品构建完成&#xff0c;你仍然需要做一些事情来使项目更加成功并使你的未来生活更轻松。那么我们如何完成数据科学项目呢&#xff1f; 10-交付产品 完成阶段的第一步是产品交付。为了创建可以交付给客户的有效产品&#xff0c;首先必须了解客户的观点。其…

基于Tablestore管理海量快递轨迹数据架构实现

快递轨迹管理 对于一个快递公司&#xff0c;在全国范围内有着大量的快递点、快递员、运输车辆以及仓储中心。而快递自产生后&#xff0c;就会在这些地点、人物之间流转。因而&#xff0c;一套完善的快递管理追踪系统是快递公司的重要管理工具&#xff1b; 用户通过平台客户端…

完了!Python黄了! 80%的程序员:痛快!你怎么看?

Python真的万能语言&#xff1f;在我的一个朋友看来&#xff0c;他坚信 Python 可以做任何事情。其实我是不服的&#xff0c;因为我在某网站看到有条评论&#xff1a;Python将要黄了&#xff01;事实究竟如何&#xff1f;这篇文章会揭开这个黑幕&#xff0c;让程序员看清现实&a…