QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化' r$ O- \" p0 i2 p
    目录
    3 n4 l# Z& S) J. w* H8 R6 Y) L一、数据介绍及预处理) |. V) }. v+ F- P
    二、新增确诊病例变化趋势
    : Y" [6 B( k" d三、新增确诊病例全球地理分布
    ) S! k2 Z6 _9 V5 g四、累计确诊病例动态变化图5 C  H8 ~$ n" N( m. {* j
    一、数据介绍及预处理  I, ]- o0 ~3 B$ I2 M/ s
    1. 基本字段介绍8 T( x' ]( U! R( Y9 o/ i
    6 |1 E' f2 ?- n: v: ^2 s3 a. k1 k
    字段名        含义5 {: Q  U2 u2 E' U- A" m
    Province/State        省/州
    3 x7 ~( P2 l% X1 n% OCountry/Region        国家/地区
    5 x3 R6 Z" P1 x8 ]* TLat        纬度
    + j( Y3 F! `) V& o2 E+ `Long        经度+ I; W- a# v/ }. g' z( ]5 N) E
    1/22/20-12/7/20        每日累计确诊病例: B0 H, [7 m1 C. `

    ; i6 G% Q7 V/ b6 S5 n7 I3 P, e
    : u' Z2 H) G1 F7 w$ ?* n0 J3 _( l. K+ ^8 q+ w) B1 x1 @& E( l1 _

    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)]
      ( o8 w* x5 z& q" a8 m: m% Q
      [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 J8 _3 ]8 k* F$ A+ O5 S4 C
      [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)]) H! ]. z4 ?" k9 H
      [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)]
      - U3 r8 I) @9 h* r9 L. s* l) S
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      ' g4 w% ~/ c. oinspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      3 F* |/ i3 p: S( b* bincrease_data<-inspect_data-inspect_lag_data' \4 n' [: A% u' a! ]( U

      ; q$ Y0 O8 u9 Z# \; `7 l4 L5 w#合并数据,new_data为新增确诊人数数据. h; r6 s; @) t8 {9 ]; d6 p
      new_data<-cbind(information_data,increase_data)
      % R8 h1 _% ~" Q1 h+ A% X" X
      7 O1 l. @: [) k& J. d1. 中国新增确诊病例变化趋势: }7 z! V  j$ c  {
      #合并所有省份新增确诊人数
      6 w7 F; e4 _  _% r1 ]china<-new_data[new_data$`Country/Region`=='China',]$ h0 E+ ~1 c; E% Y
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
      ' |8 a  l# J2 N7 z% n+ \' `colnames(china_increase)<-'increase_patient'' A( s/ W9 n8 K1 ]
      china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      - z" e, y& R6 B* S1 d+ @+ A
      # G; `% C& M1 @0 F6 `ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      - R2 I) c8 l, @: k& R! a% \  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)4 X3 `! S& G- k
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
      7 v9 E( u; A5 K* @0 T2 u0 G- ~' z/ r  theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      , l" {  t4 m* M) X  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      , F& z) P7 v% v6 m( V1 u! ]        axis.title.x = element_blank(),* v8 X6 {' }: T4 {$ o. m
              axis.title.y = element_text(size=15),* f& M8 T; v0 [9 Z
              axis.text.x = element_text(angle = 90,size=15),
      ( D# T/ b& o. R6 y$ ]# B+ a        axis.text.y = element_text(size=15),
      1 J  }0 T  b7 ]; |0 F/ K        legend.title=element_blank()," J+ T$ \" u' w/ u8 I
              legend.text=element_text(size=15))$ |! n1 U, ^# c. ]( g, A* D

      ) L4 z8 S7 N( k" y                             
      * m: O! q. R; S4 Q2. 美国新增病例变化趋势
      - p4 @, S8 @4 ]) M# B  Qus<-new_data[new_data$`Country/Region`=='United States',], y) b' Y% u- z, a$ E
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      ' @" F8 K& l2 R# U: h9 R* [us_increase$date<-as.Date(us_increase$date)
      # Y9 c$ V4 F/ n/ k( j- Yggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+2 `# Z" N3 l8 \
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      & f4 f- {9 @" h, i1 T, Y. z/ S  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+. }4 B4 _# Y. R* o' W
        theme_economist()+   #使用经济学人绘图样(式ggthemes包)1 E1 Y/ `. W' ^2 `
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      " w' N, T3 f/ |( ^0 L        axis.title.x = element_blank(),
      1 b( l0 J# I2 ~# x6 J. ?        axis.title.y = element_text(size=15),! i5 O0 }8 C9 d1 z0 o! [
              axis.text.x = element_text(angle = 90,size=15),0 K6 \2 ^. T* u" j8 q7 H. Y
              axis.text.y = element_text(size=15),
      & ^  I: i/ e. b7 |  i        legend.title=element_blank(),2 v9 z; s4 b4 |6 J
              legend.text=element_text(size=15))  x; m7 Y  g; S6 D6 M
      5 m2 ]3 f" j9 D2 b1 s

      + N8 ]4 q, S: P$ q+ g9 i3. 全球新增病例变化趋势
      5 X( ~; h6 m- z9 z1 rtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      3 \" r  X$ h' n  ~0 [4 Fcolnames(total_increase)<-'increase_patient'
      6 ~) v$ z  q9 L) H1 J3 Gtotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")1 @3 |( o0 |* O2 t! l$ h1 I
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      + C7 k( E9 J6 S8 b: k  scale_x_date(date_breaks = "14 days")+
        s3 f3 W4 s2 R/ Z/ d: W8 n  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+$ k/ \# E& ?( }7 j! `
        theme_economist()+  p" w2 ~+ b% ^" |! J
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签' w3 w; ~+ Q6 |+ ~* T* k
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      3 b5 K, A3 p+ h6 ?' j* A! I% B                     labels=c("0","20万","40万","60万","80万"))+% A9 K: X, Z1 A' E
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) {" F) e& A. a( ?
              axis.title.x = element_blank(),! L$ w% m/ x1 ~* A
              axis.title.y = element_text(size=15),
      3 D2 ?9 O7 G2 W+ \$ e' S/ C! G        axis.text.x = element_text(angle = 90,size=15),5 N6 h  J; e% I" |) J9 o
              axis.text.y = element_text(size=15),) d, m/ y0 d. a. B) d! L  {9 G9 h
              legend.title=element_blank(),1 J; K/ S# V# V# a' u; v  b
              legend.text=element_text(size=15))
      1 o; n2 a7 P5 I' U
      1 r. h- H5 R  G- \

      , T8 a* `! o0 W' R6 H& [三、新增确诊病例全球地理分布
      1 {; \  a  L3 h& O) h1 ^% imapworld<-borders("world",colour = "gray50",fill="white")
      ( e+ r+ h+ N/ n& ?2 i1 g$ g4 Kggplot()+mapworld+ylim(-60,90)+
      . ?5 x) w- C9 j& G" X  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      . j& n. Q* J) C" m, [  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+% |; ~/ k" k" W/ p1 s9 k" }
        theme_grey(base_size = 15)+
      ' t: ^: P/ G) o' {  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      7 c. g7 s, V( N$ t/ |        legend.title=element_blank())
      ' @% [/ N$ [# g' \/ h7 }
      ; F) q, `6 E, ]+ m- V' M9 S( nggplot()+mapworld+ylim(-60,90)+. D( g" v. r& b
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+' M5 [, g& f% r: Z7 [' V8 Q
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
      ) G. k5 Y& x# F5 {  theme_grey(base_size = 15)+" F" W- u  J' b9 {7 O7 Y2 J7 j/ L
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),1 H6 }9 c2 E: M9 Q6 T! a
              legend.title=element_blank()); ^9 L% X& B1 n) @

      : n- Z8 m0 E: F2 Q8 p$ b: r+ s' l
      四、累计确诊病例动态变化图

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


      / y4 F. u8 X  y! l8 S

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

      5 _3 h7 Z! o1 {- l
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      & e# U% v# I& Lcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      6 M& Q% l  j( g1 ?: v8 A$ Mcolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      + J3 w# C1 n$ o- [3 Qfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))/ y- }& X. F6 O4 S
      five_country$date<-as.Date(five_country$date)
      - j% p) B) C3 g# |7 V3 c" \! P' y, `7 G# c
      ggplot(five_country, 3 |6 n: P. I0 W& @
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  & t: @9 O3 n- e/ h
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  0 g' U9 v. s3 r
        geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  
      . V' l6 n4 J+ [& f) }2 ?  scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      + x8 D7 U1 Y' [0 I8 j! `& q9 P  theme(legend.position="none",
      + E1 K5 a" H& c) u$ y* R4 x# L& R        panel.background=element_rect(fill='transparent'),3 y" y( z+ _5 ^0 K1 U/ G* y+ Y4 }
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),& G9 L, F2 u3 N
              panel.grid =element_blank(),  #删除网格线  N; s- G- b8 F1 ^1 D: m# r1 o4 z
              axis.text = element_blank(),  #删除刻度标签
      ; e3 r9 {6 L7 M0 u% ^0 S        axis.ticks = element_blank(),  #删除刻度线
      ) v/ I7 o! @& v  )+
      ) J. b& G* e1 O) R+ W( i  coord_flip()+  
      + k+ `3 C( i9 Y! t/ v! z  transition_manual(frames=date) +  #动态呈现
      - T8 j) |& f8 t( i& ^  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  & m. T9 L: V/ H& [
        theme(axis.title.x = element_text(size=15))+
      % w  C1 `+ Q' Q9 e4 t$ o  ease_aes('linear')  
      4 m, c/ H. K3 H6 X
      - }5 H; y  x, J& I+ S( ~3 v9 Ianim_save(filename = "五国累计确诊病例增长动态图.gif"), S* z3 e6 r$ k7 t1 @

      9 L/ D& Q9 Z7 ?( v
      + ^" O5 ~+ C/ m/ h
      : a! t1 U0 r5 a0 _- m' q6 y; o0 O

    7 K! J+ P) T$ A# b( Z9 S9 k* t* \! ]* D) G
    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-9-6 23:08 , Processed in 0.526212 second(s), 50 queries .

    回顶部