关于新冠的作图(R语言)

新冠统计

对新冠数据进行爬取,处理数据,并对其作出相应的图。具体代码如下:

#加载各个包
library(sf)
library(ggplot2)
library(dplyr)
library(magrittr)
library(gganimate)
library(lubridate)
library(magick)
library(nCov2019)
library(RColorBrewer)
library(remotes)
#安装疫情数据包
remotes::install_github("GuangchuangYu/nCov2019")
library(nCov2019)
#获取数据包的数据
x=get_nCov2019()
x=load_nCov2019()
#获取描述性统计量,进行数据汇总
data_province=summary(x)
#数据框使用 data.frame() 函数来创建time,NAME,cum_confirm
data_province=data.frame(time=data_province$time,NAME=data_province$province,cum_confirm=data_province$cum_confirm)
#年月日时分秒函数,三个函数是字母y(年)m(月)d(日)的组合
data_province$time=ymd(data_province$time)
#读取省面
province=read_sf("D:/R/rstudy/省面.shp")

#cut(x, break= , right= , label=c(" ")),x为向量vector
#break可以为自定义的分组也可以为大于等于2的数字,如果是数字,则软件会自动均分数值间的距离,如果不想均分,可以自定义分类距离
#right代表区间的左右端开和闭 默认为true,代表左开又闭,当设置成False的时候,为左闭右开
#label为标签向量,代表给每段间距设置一个标签,相当于每个间距给一个名字
#include_lowest是否包含左端点
data_province$cum_confirm=cut(data_province$cum_confirm,breaks = c(0,1,10,50,100,500,1000,5000,100000),labels = c("0","1-9","10-49","50-99","100-499","500-999","1000-4999",">=5000"),order=TRUE,include.lowest = TRUE,right = TRUE)

#创建时间序列,用于后续循环绘图
#ymd函数的作用就是标准化,用以取代strptime函数,ymd(字符串)
#只要字符串中的日期顺序遵循年月日(也就是ymd),不管这些字符串日期有多“脏”,比如说“2015//12,03”,那么最终都会输出一个年月日的标准化时间“2015-12-03”,输出的格式是date
startTime <- ymd("2020-02-01")
nowTime <- ymd("2020-02-11")
endTime <- date(nowTime) - ddays(2)
#有一些快速创建持续时间的对象以便于进行日期时间操作,例如:dyears(x) 、dweeks(x) 、ddays(x) 、dhours(x) 、dminutes(x) 和dseconds(x),其中的x表示长度。且这样函数都有统一的特点就是'd+时间日期单词+(x)',也非常容易理解,比如需要创建表示10分钟的对象,那么dminutes(10)就完成了,另外需要特别注意的系没有dmonths(x),因为其以秒为单位来创建,而月度常在30天和31天之间变化。
#interval最简单的时段对象,它由两个时点数据构成
#计算该对象中的时间间隔,我们可以使用time_length(),默认以秒为单位,也可以自己设置间隔的单位
#%>%把左边的值发送给右边的表达式,并作为右边表达式函数的第一个参数,就是管道函数
#%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存,符号%>%,这是管道操作,其意思是将%>%左边的对象传递给右边的函数,作为第一个选项的设置(或剩下唯一一个选项的设置)
timeLength <- interval(startTime, endTime) %>% time_length("day")
mytime <- startTime + ddays(0:timeLength)

#使用theme函数设置绘图主题
#hjust控制水平间距。将其设置为0.5即标题居中。
#face设置字体(“plain”,“italic”,“bold”,“bold.italic”)
mytheme= theme(
  plot.title = element_text(face = "bold", hjust = 0.5, color = "black"),#图表的标题,使用element_text()函数设置基于文本的组件,如title,subtitle 和caption等
  plot.subtitle = element_text(face = "bold", hjust = 0.5, size = 20, color = "red"),
  plot.caption = element_text(face = "bold", hjust = 1, color = "black"),
  legend.title = element_text(face = "bold", color = "black"),#图例标题
  legend.text = element_text(face = "bold",color = "black"),#图例文字标签
  legend.background = element_rect(colour = "black"),#图例背景,使用element_rect()修改基于矩形的组件,如绘图区域和面板区域的背景
  legend.key = element_rect(fill = NA),#图例符号
  legend.position = c(0.85, 0.2),#图例的位置,legend.position参数用来将图例设置在图表区域,其中x和y轴的位置(0,0)是在图表的左下和(1,1)是右上角
  axis.ticks = element_blank(),#坐标轴刻度线,使用element_blank()关闭显示的主题内容
  axis.text = element_blank(),#坐标轴刻度标签属性
  panel.background = element_blank(),#绘图区背景
  panel.border = element_rect(color = "black", linetype = "solid", size = 1, fill = NA)#绘图区边框
)

#按照时间序列循环绘制静态图片
for (i in 1:length(mytime)) {
  data_time=subset(data_province,time==mytime[i])#按时间序列选取数据
  #subset(dataset,subset,select),dataset是要进行操作的数据集,subset是对数据的某些字段进行操作,select 选取要显示的字段
  province_data=province%>%left_join(data_time,by='NAME')#将疫情数据与地理数据合并,left_join(x)左连接,保留 x 中的所有观测。
  p=ggplot(province_data)+
    geom_sf(aes(fill=cum_confirm))+  #geom_sf(),它的最大优势是我们直接导入的数据模型不需要做清洗转换了(因为geom_sf函数可以自动识别),不需要声明经纬度和group了,仅需指定我们想要自定义美学映射即可
    coord_sf()+  #做平面视角的世界地图,直接使用默认的coord_map()内默认参数即可(默认的投影参数是mercator【墨卡托投影】)
    scale_fill_brewer(palette = "OrRd",direction = 1)+  #使用scale函数族中的其中一种选择scale_fill_brewer(),参数 palette 控制着颜色选择
    guides(fill=guide_legend(title = "确诊人数",reverse = 1))+   #guides() 将_colorbar和_legend嵌套进去,方便映射,如guides(fill = guide_colorbar()),可以在scale_xxx()标度中指定guide类型,guide = "colorbar"或guide = “legend”
  #labs函数主要有以下三个用途:设置图片的标题(title), 子标题(subtitle), 引用(caption)
    labs(title = "2019-ncov疫情数据可视化",
         subtitle=mytime[i],
         caption="数据来源:package nCov2019")+   
    mytheme
  #用法ggsave(filename = default_name(plot), plot = last_plot(),device = default_device(filename), path = NULL,scale = 1, width = par("din")[1],height = par("din")[2], units = c("in", "cm", "mm"),dpi = 300, ...)
  ggsave(filename = paste0(date(mytime[i]),".png"),  #ggsave默认为保存最后的图,显示的默认大小使用当前图形设备的大小
         plot = p, path = "D:/R/pic",
         width = 20, height = 20, units = "cm")   #参数:filename图的文件名/文件名;plot绘制保存,默认为最后的图显示;参数:units当其中一个显式指定的宽度和高度的单位(厘米或毫米)
  
}

#将静态图片渲染成动态疫情地图
#image_read()函数读取图像
#anim_save()保存动画以备后用
#image_animate()动画函数
animate_p=image_animate(image=image_read(path=paste0("D:/R/pic","/",date(mytime),".png")))
anim_save(filename = "疫情地图可视化动态图.gif",animation = animate_p,path="D:/R/gif")



关于新冠的作图(R语言)
关于新冠的作图(R语言)

上一篇:linux命令及桌面“舒适”化


下一篇:leetcode309.最佳买卖股票时机含冷冻期(mid)