QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6050|回复: 0
打印 上一主题 下一主题

可视化实例基于R语言的全球疫情可视化

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化
    % B: N/ E- X+ _( G! ~7 V目录
    ' v& t4 Z' x. l7 G一、数据介绍及预处理
    ( `0 C' a9 B4 ]( F$ j5 l, U4 ]二、新增确诊病例变化趋势
    8 ^* A" N4 X+ [4 A3 H三、新增确诊病例全球地理分布) S& G# m( D. t
    四、累计确诊病例动态变化图
    ' z" v2 U0 ~: R7 P6 F$ U9 }一、数据介绍及预处理" s8 I1 r& J+ e  i: Z# K& ]
    1. 基本字段介绍
    8 `. b3 ?7 U( }2 j  V6 L% _" Q# Z) g  i: o) `& u; O7 ^  `( X
    字段名        含义' w- P; D; z5 B% t9 b! Q1 \: \7 b
    Province/State        省/州
    , f0 Z, @, _' n1 x% h) u& BCountry/Region        国家/地区
    ' B! E9 H* P9 F. ^Lat        纬度
    * q8 D$ w0 A( M1 }Long        经度: \' R+ m3 A' f
    1/22/20-12/7/20        每日累计确诊病例
    1 s; C( M+ p: Z* D6 u. U$ `
      i1 K4 b" E$ ]- e3 O+ P
    . {0 c! n5 U/ V2 s/ Z7 {
    6 b9 f4 f: \4 P

    2. 数据预处理

    • 整理某些国家的名称,如Korea, South改为 Korea
    • 将日期列字段修改为相应的日期格式
    • [color=rgba(0, 0, 0, 0.749019607843137)]#加载本次可视化所需包[color=rgba(0, 0, 0, 0.749019607843137)]library(readr)  [color=rgba(0, 0, 0, 0.749019607843137)]library(sp)  #地图可视化[color=rgba(0, 0, 0, 0.749019607843137)]library(maps)   #地图可视化[color=rgba(0, 0, 0, 0.749019607843137)]library(forcats)[color=rgba(0, 0, 0, 0.749019607843137)]library(dplyr)[color=rgba(0, 0, 0, 0.749019607843137)]library(ggplot2)[color=rgba(0, 0, 0, 0.749019607843137)]library(reshape2) [color=rgba(0, 0, 0, 0.749019607843137)]library(ggthemes)  #ggplot绘图样式包[color=rgba(0, 0, 0, 0.749019607843137)]library(tidyr)[color=rgba(0, 0, 0, 0.749019607843137)]library(gganimate) #动态图[color=rgba(0, 0, 0, 0.749019607843137)]
      ) P, K7 j! R9 D* V& T$ u/ o
      [color=rgba(0, 0, 0, 0.749019607843137)]#一、国家名词整理[color=rgba(0, 0, 0, 0.749019607843137)]data<-read_csv('confirmed.csv')[color=rgba(0, 0, 0, 0.749019607843137)]data[data$`Country/Region`=='US',]$`Country/Region`='United States'[color=rgba(0, 0, 0, 0.749019607843137)]data[data$`Country/Region`=='Korea, South',]$`Country/Region`='Korea'[color=rgba(0, 0, 0, 0.749019607843137)]* B- b8 w* \6 D
      [color=rgba(0, 0, 0, 0.749019607843137)]information_data<-data[,1:4] #取出国家信息相关数据[color=rgba(0, 0, 0, 0.749019607843137)]inspect_data<-data[,-c(1:4)] #取出确诊人数相关数据[color=rgba(0, 0, 0, 0.749019607843137)]+ k0 y3 T$ Z5 s. ~# F8 C; K2 w7 P4 b. X  d
      [color=rgba(0, 0, 0, 0.749019607843137)]#二、日期转换[color=rgba(0, 0, 0, 0.749019607843137)]datetime<-colnames(inspect_data)[color=rgba(0, 0, 0, 0.749019607843137)]pastetime<-function(x){[color=rgba(0, 0, 0, 0.749019607843137)]  date<-paste0(x,'20')[color=rgba(0, 0, 0, 0.749019607843137)]  return(date)[color=rgba(0, 0, 0, 0.749019607843137)]}[color=rgba(0, 0, 0, 0.749019607843137)]datetime1<-as.Date(sapply(datetime,pastetime),format='%m/%d/%Y')[color=rgba(0, 0, 0, 0.749019607843137)]colnames(inspect_data)<-datetime1[color=rgba(0, 0, 0, 0.749019607843137)]" t! e: a* h& I% L' |+ ^
      [color=rgba(0, 0, 0, 0.749019607843137)]#合并数据,data为累计确诊人数数据(预处理后)[color=rgba(0, 0, 0, 0.749019607843137)]data<-cbind(information_data,inspect_data)[color=rgba(0, 0, 0, 0.749019607843137)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      . {1 t: {! Q$ A8 G1 j: Winspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      / ]0 ^' v1 f( }+ `3 `! Z" iincrease_data<-inspect_data-inspect_lag_data
      8 X9 m0 Y6 s7 I5 C( n* Z# I2 ^. ]
      ( s5 I9 G; D: ]* a#合并数据,new_data为新增确诊人数数据
      $ J  Y  d& A* i( gnew_data<-cbind(information_data,increase_data)  [. Z$ ?, h& Q/ h0 v

      , S5 G: E( r9 G  Q1. 中国新增确诊病例变化趋势. x+ A# X) Q$ H* U/ T
      #合并所有省份新增确诊人数
      : }! F1 H9 H! `% D! Mchina<-new_data[new_data$`Country/Region`=='China',]4 t7 w8 T) ?8 |; T4 B- O7 r
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))4 \) [6 T" E! d2 G9 K9 R
      colnames(china_increase)<-'increase_patient'
      " ?& U$ c% s6 Z. H0 ~) c7 M3 |china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      & d- r. u6 T4 W" Q) G
      , U/ }; C0 r' u0 ~' Jggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      4 W$ x: H7 p8 F! o6 S  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)0 v$ K. [3 H: `
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
      3 Z, S; h/ B  X3 h* H/ F  theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      & g1 ~% G' ^3 @, ?0 }) g% w  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 c, {4 F& h/ `) @( e7 \  s# f
              axis.title.x = element_blank(),7 y* C7 V: F9 [
              axis.title.y = element_text(size=15),
      ; z, |: I0 }9 c/ i! O        axis.text.x = element_text(angle = 90,size=15),! a8 }0 L; W3 {" f# r- A: H! \
              axis.text.y = element_text(size=15),
      . U9 M( v' x7 d2 P. W0 f        legend.title=element_blank(),* ?2 f: U$ L( g5 P) {! t+ l
              legend.text=element_text(size=15))$ m' W0 R+ ], _, @- G

      1 G$ p( {4 Y) L  s" M- i                             
      , g% Z$ r1 U5 p! ^2. 美国新增病例变化趋势; ~$ }) d9 P7 N
      us<-new_data[new_data$`Country/Region`=='United States',]
      * |. u2 y& v2 W" m9 kus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')4 n# v: D* @' a( Y
      us_increase$date<-as.Date(us_increase$date)2 e: B9 f9 t3 [  b
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
        Y- q" w+ x$ `6 E4 h  scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      # M. {0 i% m. Q5 @  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      9 k7 u$ Z- s, _/ h8 W# d  theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      : D6 {. r! N1 Z1 t$ u  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      2 r' x: K4 B9 ^* ?4 u        axis.title.x = element_blank(),. c/ e7 w6 m. n4 _! L0 K
              axis.title.y = element_text(size=15),( ]7 h4 t" g# J9 H& F6 J- \! z
              axis.text.x = element_text(angle = 90,size=15),
      $ w% ]7 u: e1 c+ P. |" Z1 @5 i$ a        axis.text.y = element_text(size=15),
      9 n- B2 |& H+ A% w' n        legend.title=element_blank(),+ p& n, j$ l$ x$ W
              legend.text=element_text(size=15))# e0 D% L9 c* k! U

      3 X& U  ], \5 |1 w
      8 O  ]0 [/ F7 U# ^5 ^* c6 `7 E$ K3. 全球新增病例变化趋势- @# }5 X5 J, o$ o& \; F
      total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))4 i. j2 r+ [, c( }' ]- _2 y
      colnames(total_increase)<-'increase_patient'1 a2 m0 o4 Z  ?& L# B2 h5 M
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")- L6 M7 u8 M' J2 V
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      6 i/ {+ _( t5 z" ~; |  scale_x_date(date_breaks = "14 days")+( n* z6 ?2 A3 Z7 i0 Q6 a
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
      * \. G6 R" l; @1 m) x5 |3 q3 {  theme_economist()+
      2 [* g3 w- O3 f; R, k. O( k  {  scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      $ M4 X  ]% d4 u                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),* d& l) _; I9 ]; k/ A
                           labels=c("0","20万","40万","60万","80万"))+' H- ?7 H+ K' ?' h
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 f! `( }1 s! G( N/ q
              axis.title.x = element_blank(),
      ( m1 m+ r3 P! k        axis.title.y = element_text(size=15),* r# V' ~6 X2 C  R
              axis.text.x = element_text(angle = 90,size=15),6 k3 a" c6 N4 j9 o0 ~  E0 b
              axis.text.y = element_text(size=15),
      0 C9 Y# \6 |6 @9 Z/ d/ n        legend.title=element_blank(),2 T2 ~$ ?. h0 d' R5 M
              legend.text=element_text(size=15))& J" ]; K) j0 r' }* J

      6 c" r+ l* {: ~9 J, m+ r  s1 ~" H  _* ?" I! @
      三、新增确诊病例全球地理分布1 J: G6 s. f3 `! [1 q0 h5 b
      mapworld<-borders("world",colour = "gray50",fill="white")
      ( V" }, f; |6 i% {4 ~  aggplot()+mapworld+ylim(-60,90)+
      , O/ F4 O# S" w0 q; c8 v# ^  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      $ @# t# [0 I, b+ n  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+6 a; k3 |: J# N3 l
        theme_grey(base_size = 15)+
      . ?8 t1 T% {& ?, l! J. b/ Q' h  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),, k. {% H6 Z, ]/ b1 d3 t, z% W
              legend.title=element_blank())
      2 R. ]4 u# J  t7 |  T; K) ^9 F- ^
      ) ?' F! F! y; o( S# L  zggplot()+mapworld+ylim(-60,90)+) m+ E/ F9 a6 Y1 W3 \
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
      3 }: @" G& x0 a: X6 B8 K% ^  scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
      8 z# M2 R1 ~' G6 }; [3 Q# d9 `4 t  t. W  theme_grey(base_size = 15)++ k" g% s* }& Q. S4 Y5 |/ G
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),& R4 i- u/ u5 G
              legend.title=element_blank())
      , J0 a: l& G. Z" s/ [- g' m9 g

      . [9 p9 S! m2 O! b四、累计确诊病例动态变化图

      1. 至12月7日全球累计病例确诊人数前十国家


      , n2 d! k  k/ @& O

      cum_patient<-data[c("Country/Region","2020-12-07")]

      cum_patient<-cum_patient[order(cum_patient$`2020-12-07`,decreasing = TRUE),][1:10,]

      colnames(cum_patient)<-c("country","count")

      cum_patient<-mutate(cum_patient,country = fct_reorder(country, count))

      cum_patient$labels<-paste0(as.character(round(cum_patient$count/10^4,0)),"万")

      ggplot(cum_patient,aes(x=country,y=count))+

      geom_bar(stat = "identity", width = 0.75,fill="#f68060")+

        coord_flip()+  #横向

        xlab("")+

        geom_text(aes(label = labels, vjust = 0.5, hjust = -0.15))+

        labs(title='至2020年12月7日累计确诊病例前十的国家')+

        theme(plot.title = element_text(face="plain",size=15,hjust=0.5))+

        scale_y_continuous(limits=c(0, 1.8*10^7))

      % D* O4 p& ^0 s; \- i1 R
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      5 P) X. Y, t5 {cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')4 r8 l- x; h4 ?. R7 u& w$ M1 t
      colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      * Z% h' d+ y7 u! U1 E( Ifive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))) K  u! q4 t$ A: s# |5 f0 m. [! c
      five_country$date<-as.Date(five_country$date)- n' v" \7 D# g# Q

      3 b/ p# D; `' Z0 ]ggplot(five_country, 5 t% e, ]+ j) a. d; ^+ R
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  
      " H/ ^) g9 G4 r) u  geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      * b: }9 U- a. @0 C  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  
      ' j- t2 {+ j5 {4 V  scale_fill_brewer(palette='Set3')+  #使用Set3色系模板) i7 m: j4 H/ }4 u& o
        theme(legend.position="none",+ |2 k' {5 D+ p) H+ v, B
              panel.background=element_rect(fill='transparent'),
      # o6 F9 E5 l/ h; B& H/ ?        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
      1 p( t( V/ K2 R5 [        panel.grid =element_blank(),  #删除网格线
      : d4 v3 c" N5 _2 B        axis.text = element_blank(),  #删除刻度标签
      ; J9 K0 ~- G) ]+ N) P) `% ^        axis.ticks = element_blank(),  #删除刻度线
      0 T4 J5 [. Z3 `; d2 U4 X8 f  )+
      ; a4 \/ e' E; f2 Y1 ^/ g# X  coord_flip()+  & i; ^/ ^7 D1 f4 R' G- H8 o) H$ q
        transition_manual(frames=date) +  #动态呈现# s" t: K! d2 I
        labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  : l. _: D7 L$ u9 [
        theme(axis.title.x = element_text(size=15))+' R! b) K( L' l3 j9 Q
        ease_aes('linear')  0 p1 z+ x+ }* \) Q

      4 Z$ i& C& J: |: P. @* fanim_save(filename = "五国累计确诊病例增长动态图.gif")4 b* n8 C8 \: r: l/ \7 I9 [+ j4 e

      ; C" [' o* S) b  x! e( C
      # |! ?; _1 j& q0 f5 \7 B7 O4 G/ ]7 ]3 Z1 }' a7 F5 F8 a6 T% W  I

    8 j- P4 B, X5 m0 d, w- k
    6 m' x1 }9 Q  _
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 07:20 , Processed in 0.458884 second(s), 51 queries .

    回顶部