QQ登录

只需要一步,快速开始

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

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化! Z! {" l4 a+ }6 S$ E' \/ M8 z6 Y
    目录1 j' d3 M& r% r0 x( |
    一、数据介绍及预处理9 u, o9 o# t/ F3 Y
    二、新增确诊病例变化趋势
    8 a; q% N: O6 x' e9 }8 o( k  j% v/ |三、新增确诊病例全球地理分布
    ! U: I8 T# X" V! T四、累计确诊病例动态变化图/ n1 i$ n9 {3 P6 q, ~0 }' n4 h
    一、数据介绍及预处理3 g0 w( f: b! ?+ u
    1. 基本字段介绍
    6 Z' d: G  D1 _2 e! e/ P7 I* L8 O+ p/ v! U# M0 m" b
    字段名        含义4 j+ y( [% p$ u4 }7 s- y7 [2 M
    Province/State        省/州
    8 X0 Y3 z' D2 t# GCountry/Region        国家/地区
    : `  s: W$ i6 F4 \Lat        纬度
    # {' `4 o* {; A( B. f9 I( M" aLong        经度: @1 ~. S7 d, Z
    1/22/20-12/7/20        每日累计确诊病例( b) X! T/ V! }9 k* q

    * k$ e7 R+ J6 S* _$ ]! g7 C# u) T
    ! ?! J+ ]8 i+ |" E: `% F% x
    : r/ g! ]( {/ S

    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)]
      3 A3 `6 F$ b8 _5 ]( U$ v7 `# K3 n, W! V
      [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)]
      4 @1 I; E7 n' _; d3 X7 t
      [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)]
      " w  V9 `1 }8 k/ J3 z: F
      [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)]
      5 u5 d1 o1 h# R. d: i
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      , a5 z0 c: q. Q: n3 z& x+ Minspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])& Y) S- t* ?$ B; g0 w0 N' X# k
      increase_data<-inspect_data-inspect_lag_data
        W3 ]9 K: C4 e7 A) Q$ ]" P1 O( J1 \/ r4 [8 a& \2 r# n7 ^
      #合并数据,new_data为新增确诊人数数据
      2 k8 q7 |7 I- V. Q# U/ y. v# Tnew_data<-cbind(information_data,increase_data)
      - d3 w2 P( Z+ W& }
      $ [/ l9 v! a. l. V1. 中国新增确诊病例变化趋势$ s' X* Q0 R) Q8 c# F# ?7 w9 h: `) `( H
      #合并所有省份新增确诊人数
      7 R: Y0 j! R* I- m& ]china<-new_data[new_data$`Country/Region`=='China',]$ N4 a, f4 a" M
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
      , O" m2 K, ^5 t/ l* Jcolnames(china_increase)<-'increase_patient'
      # @7 e0 k* V2 H  D+ echina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      6 ?2 r! w4 i( H* k! v, \$ T. b3 r' z& Y% k$ P9 \( i6 K' T9 C
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      % D. n- d" g5 D. q" g  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)0 x* \/ U8 c' a1 O
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
      5 `3 h3 G! M: d- S9 ^, `8 F  theme_economist()+  #使用经济学人绘图样(式ggthemes包)2 U( n1 i. x) I- c& w, X2 S
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      6 B5 w& f$ p8 @- l' V) N        axis.title.x = element_blank(),( w8 u, R7 |- E5 k: {5 ~8 w
              axis.title.y = element_text(size=15),
      , c2 ~7 e* n: G* h- O0 B  E        axis.text.x = element_text(angle = 90,size=15),
      ! T! ?$ M4 v! \  ]        axis.text.y = element_text(size=15),
      . A$ z* m, p6 W) u        legend.title=element_blank(),; R: c/ G$ |, d) t* J$ P
              legend.text=element_text(size=15)). }/ y7 x" M0 [) |; Z2 H7 b1 i
      ' ~. a! V& p- x. n2 e0 m
                                     I, y! u" d9 p  `
      2. 美国新增病例变化趋势
      1 M2 y& ]/ [5 rus<-new_data[new_data$`Country/Region`=='United States',]8 Q# L, X, A) p+ e& w7 l# s
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      * Q  V$ e4 W7 T" w( Nus_increase$date<-as.Date(us_increase$date), `3 J) n) C% ^
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)++ P* Q2 s) p" W
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天5 \0 @  m1 D2 ~( ]8 \/ B$ N$ I
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      . c) Q) t: L$ H+ P4 ~' ]  theme_economist()+   #使用经济学人绘图样(式ggthemes包)* s# V6 E; H0 w2 Q% @2 C
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      + ]6 h; p, f/ C, D& T3 u3 p        axis.title.x = element_blank(),7 R- \" ?3 j+ T0 l6 W
              axis.title.y = element_text(size=15),4 o- T8 O1 [+ a/ T0 f! A( ~3 B
              axis.text.x = element_text(angle = 90,size=15),
      , I/ ~$ S4 A4 _        axis.text.y = element_text(size=15),7 B  w- `/ e" A1 W
              legend.title=element_blank(),; a# P7 C9 p/ r7 s
              legend.text=element_text(size=15))4 \0 T0 r3 g6 R' C) ]  A% Q4 o3 n* q

      5 B) \( [8 r+ y' q2 A* j5 g8 m8 R9 V: L4 ^. g9 k
      3. 全球新增病例变化趋势
      ' W& ]9 {0 F" g4 b- ~" f  ~+ _% Stotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))5 s2 e1 |" @0 O. d- W
      colnames(total_increase)<-'increase_patient'. c$ D5 R' u! Q) y3 T
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")8 l) \% H' O, a* n  N% t
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+. c( h5 I3 }$ K. T9 x
        scale_x_date(date_breaks = "14 days")+8 l3 ^! V7 a" Z% D( \. K
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+' v/ w8 ]3 w# _" B' M
        theme_economist()+0 s% E) M* q+ |* z/ j- ~
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      * x! V0 ~/ o! @( u5 W8 z' i7 ~                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      $ ~, h" w6 A/ F# s                     labels=c("0","20万","40万","60万","80万"))+% H1 a: Y" L7 m2 n, q
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      ' @8 P, t" i: m# V% Y        axis.title.x = element_blank(),
      - L0 r; |# Z$ F' R/ k4 e        axis.title.y = element_text(size=15),7 X1 z. a" p$ X# K6 C! h: s
              axis.text.x = element_text(angle = 90,size=15),
      ; z  r! H. C, I, l        axis.text.y = element_text(size=15),, x! ?2 }/ v- M3 `2 I% @
              legend.title=element_blank(),
      4 \# N# ?0 g8 a8 Q' H, m        legend.text=element_text(size=15))
      * y* e8 Q5 a* d- R) a6 Z

      % n$ x2 k9 N6 z) N  N& I
      * i' ~* v1 W# M2 q三、新增确诊病例全球地理分布4 t+ _9 n* W$ ~* S: M
      mapworld<-borders("world",colour = "gray50",fill="white")
      , ?0 e1 i& M5 N0 {ggplot()+mapworld+ylim(-60,90)+
      ! m/ e8 q9 V; u  M  E- c$ ?  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+, {. `; d; ]9 i/ [, s* T2 l
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+) ]  l4 Y% X5 I& y5 v
        theme_grey(base_size = 15)+4 Q) q4 Z! a4 b. j( Y4 i: s
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),) E- P$ Z  W0 T
              legend.title=element_blank())
      0 W6 N' k- k) d& G# a$ M$ ?1 x( [  D0 z) j
      ggplot()+mapworld+ylim(-60,90)+) K$ f; p3 {" ^' Q  o
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+" r* A  H; n9 F( p
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+  b# K1 l+ |7 h. Q5 K$ y& r6 y  T
        theme_grey(base_size = 15)+
      % v- q+ O; ?' v; N' B  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),; E- P  m; Q( Z/ Q) J
              legend.title=element_blank())
      7 H4 E4 G* q, }2 r* {2 M" q
      % ~9 R/ `1 m3 c  C$ J+ V6 i. u  u- f/ U# h$ P1 ]" D
      四、累计确诊病例动态变化图

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

      % k& T' @+ M' r: B

      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))


      7 Y: r* E8 O+ y( [/ _, q2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      , \3 {0 E8 O% N' s" _7 y4 c( L$ fcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      4 j! Z7 I  f0 |" Vcolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      " B0 O& v$ V: ~" r, `  Ufive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
      ! q' B6 A1 n) e5 Y% Ifive_country$date<-as.Date(five_country$date)
      & t' ~4 d' b# a% f/ R2 R. V1 M9 E0 e
      ggplot(five_country, 8 M  E2 I) d- \' g7 s6 u5 s
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  & H4 A5 Y6 m+ ]! {
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      " m: l# q: o& Y3 W* f0 g, R! f  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  % M' B5 D5 H4 Y9 X- H; d8 l
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      / @% }( [' J" ?1 X5 X5 R  theme(legend.position="none",# l9 l( Y' P0 A% }+ M* `  V' \$ L
              panel.background=element_rect(fill='transparent'),
      + p4 ]; _  x! b# F; C2 \        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),( O* T  x1 [' b( K/ @2 @9 B
              panel.grid =element_blank(),  #删除网格线+ D; ?. j" L  f( m: h* N' v; q5 {% a$ R
              axis.text = element_blank(),  #删除刻度标签
      1 w% _* f! `( E% h; @# A        axis.ticks = element_blank(),  #删除刻度线5 T9 p) _: n! r; E6 G8 I1 `- U, Z
        )+. @1 X6 V% b1 m' |2 b/ q: E
        coord_flip()+  
      8 I  Z% \1 w- P6 [+ B: Y  transition_manual(frames=date) +  #动态呈现' G' G. r/ r8 g- L  U
        labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      2 e7 |% L; o9 ?% N; y( A$ p* r  theme(axis.title.x = element_text(size=15))+/ T) M2 k" w4 i4 e
        ease_aes('linear')  ) H, P$ |6 ]+ I( R7 a5 I1 `1 o

      6 `  k1 D  U- S4 \- ~7 Janim_save(filename = "五国累计确诊病例增长动态图.gif")
      0 r! j3 N9 y2 }& i: u2 n
      , a6 S0 C) m" a/ y1 ~" f1 J

      ) x5 b4 V. J. [( g$ J3 Y$ E( ~: W3 C/ |
    : z+ ?0 h# Z# A* Y5 }1 j2 y2 Y

    $ g5 _6 D3 b- t
    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, 2024-4-25 16:45 , Processed in 0.252115 second(s), 50 queries .

    回顶部