QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化! d' {* j3 x+ z
    目录
    2 L( S' W) B% b6 [0 N) Y) Q( P( J一、数据介绍及预处理
    2 Q7 }9 ?/ w- C6 b3 e( T. t, {二、新增确诊病例变化趋势
    ! V+ p5 z/ |/ s9 K$ i三、新增确诊病例全球地理分布, n2 [5 m8 F# y6 y; X" ~
    四、累计确诊病例动态变化图4 d" ]9 d& O7 g' [' k
    一、数据介绍及预处理4 S( e# a: e! S5 y7 U
    1. 基本字段介绍
    8 K6 v4 v2 \) w  ^% S" h) l
    7 p, v0 i& o& r9 g字段名        含义
    # i; F7 r5 f9 ], WProvince/State        省/州
    2 @0 ?3 I, S! ~: d$ dCountry/Region        国家/地区- B- L  r; H" t6 V; y0 C
    Lat        纬度8 [2 T3 B8 ?& T' W" W
    Long        经度) Z3 O, S& w( d8 _8 {
    1/22/20-12/7/20        每日累计确诊病例3 @/ `0 l+ M; o5 q( \! Q9 d

      D# g5 p" U' s, X! \( J: h; k
    ) O9 P( p- p; H# Z3 I6 }
    ! e5 H0 D  [. |( F/ f8 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)]
      . m  U3 v; K# K; ^  G; i) F
      [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)]% H6 K( K7 F( C  [  G+ u0 O
      [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)]
      9 e  z+ G& B7 a$ I
      [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)]6 b5 `# _0 m% {! K9 y
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例- }- {7 L  V" V: v* b# T" a( r
      inspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])& r: Y. `: n5 G. V, p' d
      increase_data<-inspect_data-inspect_lag_data5 H8 K: K# o: O# J( c
      8 I0 \6 c( H8 @3 L! K0 ^; H! Q4 @
      #合并数据,new_data为新增确诊人数数据
      3 @+ d9 w# |% l, |1 z* _( @# O. lnew_data<-cbind(information_data,increase_data)
      5 a% z! a3 I1 b, A, n! `6 w) s  Q
      # s& c! B+ ~1 T/ Q7 L1. 中国新增确诊病例变化趋势! D! [. f( e4 {0 k6 S
      #合并所有省份新增确诊人数
      0 Y" n: X. S/ h# Cchina<-new_data[new_data$`Country/Region`=='China',]
      $ Z' r% h: @0 P& N. F  w0 ~china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))0 s$ {; |+ V0 a  y4 P/ e4 o. B
      colnames(china_increase)<-'increase_patient'
      $ l7 A" V+ w9 Q2 Jchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")/ Q" \3 O, U" y" k0 _7 g
      ) h$ F! {, h& M. W
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      ( i. i; G- M/ Q: R  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
      / f4 X' L7 A8 b5 m  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+" O$ v* ~& z" |2 M
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      . I; p1 `7 g/ v- ^* Y, m  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      7 ^6 S, O% f" ~% A2 S" S        axis.title.x = element_blank(),
      0 o2 `0 L9 A7 o& Q3 Q( y        axis.title.y = element_text(size=15),
      8 m1 L7 P4 E! D. J6 U+ P        axis.text.x = element_text(angle = 90,size=15),
      7 c8 ?  I: C, `- O$ \( {        axis.text.y = element_text(size=15),
      2 ~: f) Z  _5 c: a3 j3 W* F& h# Q        legend.title=element_blank(),
      : ~4 K$ k( `0 W  G        legend.text=element_text(size=15))
      $ L+ h' ~! f" M, k4 C0 \1 Q1 p- j
      " K7 Y) k2 M; L  Q: U
                                   ) b3 q" Z4 O  Y% W0 c# r
      2. 美国新增病例变化趋势6 w4 n% {/ ?, K+ {( `8 ]( Q& _
      us<-new_data[new_data$`Country/Region`=='United States',]- w6 A3 W! f* K+ D' Z) ~5 [
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')4 g. D) n; c7 [; ^1 q& Y% m3 i1 X+ I
      us_increase$date<-as.Date(us_increase$date)3 J6 |& h! G! Q/ y& U9 }# \
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+6 D6 A. _& s% L# g
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      : [% C: E4 e8 y  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      2 y( u4 e" {0 U, `6 N9 E7 E9 X  theme_economist()+   #使用经济学人绘图样(式ggthemes包). A/ d( o- w2 Q) ^! s
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) |, K/ L6 y* B
              axis.title.x = element_blank(),  S3 k* R$ v9 N) u/ ~
              axis.title.y = element_text(size=15),
      / c' s1 e# t2 E# }3 \9 e        axis.text.x = element_text(angle = 90,size=15),
      ) K% o  t. B! l, q8 U% m0 M. ~( U3 n( W        axis.text.y = element_text(size=15),
      4 a3 }1 O0 T& E3 X3 c        legend.title=element_blank(),- F5 z! V3 S/ S3 f" F9 z& ]9 o
              legend.text=element_text(size=15))
      ; Q$ t1 I1 l' C: D! d5 H' t8 c

        r) p' a8 e* ]7 u& r+ v) m+ M( ^% j& y/ y1 Z$ T3 l( \
      3. 全球新增病例变化趋势' {+ n7 S# X7 z+ J5 @
      total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      $ m- _+ P' T7 S" Y7 F0 U' O0 fcolnames(total_increase)<-'increase_patient') q. Q/ _8 `% P. w0 X6 G: p4 i* Q8 R
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
      % f4 Y: y9 {+ ?9 j; Hggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+0 j6 w3 T1 s) Z) s' u) _" `- Q+ L
        scale_x_date(date_breaks = "14 days")+" V" r& f9 w9 z
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+8 D# ~& }5 y, d0 @
        theme_economist()+
      ' I- R+ [$ {! M7 R0 ^  scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签! W# n. u# S+ T
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),1 x' R( K6 S. h0 }
                           labels=c("0","20万","40万","60万","80万"))+$ v  }! D/ c3 `$ m) I
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),  X% g: M# [' ]& s0 ~
              axis.title.x = element_blank(),$ z* s! O+ c: T6 W/ j0 z7 V& Z
              axis.title.y = element_text(size=15),( u$ o6 ^; H9 O( s( @' r9 x
              axis.text.x = element_text(angle = 90,size=15),3 r% t0 ?4 Z) y2 Y
              axis.text.y = element_text(size=15),
      " G* C1 C& X5 q- n- S        legend.title=element_blank(),
      " u$ F: j  J# a2 W4 _        legend.text=element_text(size=15))# t1 r$ \7 Y8 }2 @. A) J
      ! ]/ ?7 Y3 r9 F2 R  h+ k# k2 b
      # [9 {! j0 W) s* V4 |3 B
      三、新增确诊病例全球地理分布0 l! D2 n2 D8 }5 c
      mapworld<-borders("world",colour = "gray50",fill="white")
      9 H. n" ~: y- J% q  \ggplot()+mapworld+ylim(-60,90)+; w9 K: u' _; b4 k
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      ' f- d0 ]2 a) ^1 g5 V  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      & x1 n  b  Q+ f% |0 V  theme_grey(base_size = 15)+
        \' t3 z# C. d; ?4 K3 R& u  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),5 |7 S, Q5 n! g( j3 d
              legend.title=element_blank())
      ; K1 g4 H! M" Q! |1 a
      9 E5 v( U1 S: V+ o! T1 t) ?  a3 n" y# @ggplot()+mapworld+ylim(-60,90)+
      8 M( A/ D2 h1 |9 h) F  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
      7 D: q' e% C) p1 _  scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
      * ?8 z: |# g- t8 K4 a3 ^1 G8 H  theme_grey(base_size = 15)+6 H- ^8 o" E2 v. z
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      ( g3 N% I7 Q; _+ ?. p! r6 s        legend.title=element_blank())
      1 o! J" H$ f. V' K. a0 w! }* F8 F9 B- {. p' S7 N
      6 H: s3 b3 r6 z$ ~4 N$ C) ?
      四、累计确诊病例动态变化图

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

      3 y7 o( N2 g3 V

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

      , K3 y6 M3 @: a2 m% X3 e7 H4 ^
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      ! H+ \2 H( {, C/ S& n; bcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')5 y- i! y0 Y' b
      colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      2 s. U: X7 O2 O+ k: v3 h4 cfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))$ k7 Q0 M3 q+ F% S7 n, z
      five_country$date<-as.Date(five_country$date)
      3 U! d* ]8 c6 P2 s( q7 ~" f5 x. R+ k- b3 J" Z6 U' e- \1 }
      ggplot(five_country, 0 i  Q/ O1 g9 P# z$ {) l  k/ O
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  ' B! ?1 {- H  T0 d' P
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      ) o6 q; X( }. E4 `6 W  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  : H! Z0 M& S( }& w5 A: G
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板! i8 h! C" C% w. J
        theme(legend.position="none",: A0 t0 j" M* O& u7 s  h
              panel.background=element_rect(fill='transparent'),  Z/ y0 Q* W/ A6 ]7 ?4 d9 x
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),6 [: @2 Y3 D, d1 R. P2 D- P
              panel.grid =element_blank(),  #删除网格线* t% W. I+ P' z' t4 m
              axis.text = element_blank(),  #删除刻度标签
      . i+ M8 P5 O3 Z5 }( y2 X        axis.ticks = element_blank(),  #删除刻度线
      9 l& P+ y6 I8 l  a" D. A6 g  )+
      . c2 h1 O) M# Y5 _( ~: S  coord_flip()+  1 B& D1 c. H4 d& m: j  U4 e" m0 K2 i
        transition_manual(frames=date) +  #动态呈现
      : s* s0 w' X7 p  C4 I  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  1 i* S7 V% ^4 a1 B% \
        theme(axis.title.x = element_text(size=15))+
      ( q0 ~: M" e) V9 Z5 V  ease_aes('linear')  + |9 v. S$ i9 R, G4 W
      : N2 \4 V, {; B+ z3 `( ]. v$ ?$ L4 K
      anim_save(filename = "五国累计确诊病例增长动态图.gif")( z1 L9 T. ?2 B

      7 c9 i1 u) o/ N9 A3 i/ |0 D
      1 `) d" F+ Z2 k, H5 s& [9 I' _" o; @, {2 L, ~+ M) h
    3 l- V9 G5 `, o1 ?

    # m& P7 L2 U( o% d  b! e, y
    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-6-4 06:09 , Processed in 0.429099 second(s), 51 queries .

    回顶部