QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化% N& |; a9 ?4 {# }! e
    目录# N* C  T, x$ ?8 B9 H$ a) E$ h
    一、数据介绍及预处理% }' @2 j5 r" t$ o
    二、新增确诊病例变化趋势
    4 R7 h  D( T! E5 n" i- i三、新增确诊病例全球地理分布
    3 x8 ~0 J; c+ N% R0 V四、累计确诊病例动态变化图: u4 Z' C* V, Y3 i
    一、数据介绍及预处理5 ~% g' N' K+ B) |; m, G2 g, H* s. {
    1. 基本字段介绍0 Y) g% D9 R7 J% I8 Z% ^: i2 W

    ( s% Y0 S/ R+ v' f: Q字段名        含义0 O2 P' U( z$ I: [" W
    Province/State        省/州" O  h8 z4 o9 }
    Country/Region        国家/地区
    ( B8 V4 {4 n9 B, r* E3 o* HLat        纬度) |9 x% P$ }. J2 W, Q' B
    Long        经度
    7 ]5 D4 w2 n7 \. H* b1/22/20-12/7/20        每日累计确诊病例
    : L9 p& ]% u# B4 L0 g9 M, e' R* k/ Z6 A; y: y- }# a: W1 d

    : w4 r+ g, y4 I, `0 m1 U) m/ W, Y; F+ N) g+ I4 P+ R

    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)]8 g  A. o9 n7 p- y5 x3 H
      [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)]
      2 q- `: e9 O: ]) |5 ^
      [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)]
      ! v( }8 ]$ ?- l! M8 U- 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)]. K( \2 {3 b& @7 o3 r9 V: L0 h
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      2 i  y0 o& U4 e, P! K- {3 pinspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      ( V# s' W$ ]7 mincrease_data<-inspect_data-inspect_lag_data
      " I7 U( k! e# ~% i
      + r! |3 O" m# s+ r* g4 a' t#合并数据,new_data为新增确诊人数数据
      4 M2 f8 o. I' I& inew_data<-cbind(information_data,increase_data)
      . K% G# B! x$ H2 V2 }) M$ h; p  Z* y) f, p. A3 A- c
      1. 中国新增确诊病例变化趋势: J4 b! R( r& y" Q- c8 [7 }
      #合并所有省份新增确诊人数
      . W( M8 i, w7 H7 a% X9 v6 Lchina<-new_data[new_data$`Country/Region`=='China',]
      1 B0 G, @# u: {china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))4 f; w& H" Q# S# G
      colnames(china_increase)<-'increase_patient'
      ' ]3 ~$ m+ G  S+ A& ?7 J; x6 Jchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      * \& R& v3 U5 r  M7 f1 C
      9 q+ A& W5 t) n& S( @( [* ~ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
        _, c  a6 o% M& V  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)$ w4 S1 K! `; W/ m7 J4 [, z9 b# V
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+% h, [! z' M# ^' c2 Q1 J0 c/ f1 [1 P
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)! Y9 }) t6 f7 O7 c+ [: v- l6 L( c
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),1 r) u5 t8 C# g$ l  y
              axis.title.x = element_blank(),$ q; s  y; v7 K
              axis.title.y = element_text(size=15),3 X# D" a- Q% Q* K" J9 |
              axis.text.x = element_text(angle = 90,size=15),
      7 z& _* `+ _5 G. w9 F" C        axis.text.y = element_text(size=15),
      ) k3 C4 n; g0 P( S& _/ ~3 x        legend.title=element_blank(),5 Y4 S0 T5 x' d! b
              legend.text=element_text(size=15))
      1 S# d# D$ _! y& L/ |* ^

      1 C& u" `& o7 x. w. u                             : l0 E% y8 {# Q( l* a! D: o
      2. 美国新增病例变化趋势
      % G1 t# Q4 Q5 i: {& q# {4 N! Kus<-new_data[new_data$`Country/Region`=='United States',]7 Z! E; Z2 B$ k( t" v
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')8 x2 o. m6 r- [, B
      us_increase$date<-as.Date(us_increase$date)& g5 |* `7 g% @- M
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      ) h" n: v' S# G  n  scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      * X5 y8 O. E. j- N" V4 i  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+; T5 W9 @- U6 K' f% k/ |' J  q
        theme_economist()+   #使用经济学人绘图样(式ggthemes包)0 |- N' O/ s. X4 Z4 t- U
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),3 Q0 b2 l: H3 m0 x' K
              axis.title.x = element_blank(),
      3 t! r! I0 B( _; Q+ n- w        axis.title.y = element_text(size=15),
      1 q1 D; S1 e/ M8 V2 p! L        axis.text.x = element_text(angle = 90,size=15),
      & C# v. E7 C5 [* N$ u        axis.text.y = element_text(size=15),
      1 e' ~/ c2 v& T* b        legend.title=element_blank(),5 s+ @1 c: v' W; \! l: k
              legend.text=element_text(size=15))
      1 Q% L. R4 K+ f0 K; C* N
        a! W. G( [8 i4 Q& v( S+ B

      6 R8 W* t! P% ~2 \& Q, X3. 全球新增病例变化趋势5 q) W) `% t2 |) C* v/ ]$ s  f; D
      total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))6 G- k" r* u- H
      colnames(total_increase)<-'increase_patient'
      7 t, R$ W/ X! Z5 m  v- Itotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")* G0 r' I7 |+ b0 J: v' J! R
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      ' Q8 ]! N) z- T/ v  scale_x_date(date_breaks = "14 days")+
      + H6 l4 s. V( N; o  P  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+. r& v/ h6 Y% c& S/ [$ @
        theme_economist()+# O7 k: h0 H8 f' A5 l
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签+ O. g0 a& ]2 B% C8 d
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      3 }! V* d: Q" D# Z' h. S                     labels=c("0","20万","40万","60万","80万"))+3 y& w; ~: O- A( ?
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      # ]) q/ `" _4 Q        axis.title.x = element_blank(),
      0 {, X+ _& d2 A9 k* O  |& X; E% Q        axis.title.y = element_text(size=15),0 {) R; `7 g: Z9 }4 Q) D5 f
              axis.text.x = element_text(angle = 90,size=15),
      7 P: L9 v. W: ?2 |8 W& \# ~$ ^9 P        axis.text.y = element_text(size=15),& K! A9 i2 m5 l
              legend.title=element_blank(),
      " C' M) ^4 ^7 Y2 i- [        legend.text=element_text(size=15))
      ! T: T' L/ m7 `  z

      ) v) X0 A/ @5 z3 k  S3 `/ Z+ |$ X; d; s6 ?0 Z" B7 _) o
      三、新增确诊病例全球地理分布; h* @4 w# s+ i" S2 c2 o  T
      mapworld<-borders("world",colour = "gray50",fill="white") 1 H$ }/ P9 M1 l3 W( `8 t5 s
      ggplot()+mapworld+ylim(-60,90)+
      ! q+ W2 u) U* I& V  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+7 @+ p+ w. h9 P" F
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+/ b; m8 v2 |- `: J" \
        theme_grey(base_size = 15)+
      " m& c3 \$ o) S8 \. q  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),) ^8 R8 K7 o! g" M
              legend.title=element_blank())
      6 `0 I0 q* [0 ^+ l5 F" @
      : w, \8 x, W. ]! B) P$ H* Eggplot()+mapworld+ylim(-60,90)+9 m- h: r0 o2 g8 U5 J
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
      6 Y+ l; J6 }& x5 [  scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+' x" r1 H5 [* {; _% e
        theme_grey(base_size = 15)+* Q4 @- g8 u5 x
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),5 g. g4 Z2 r2 m( Q
              legend.title=element_blank()), r. X; f5 ?! {; r
      4 Q8 F' J3 j: m2 T
      * D" K- E# q6 X5 M( C
      四、累计确诊病例动态变化图

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


      $ n# a5 k0 D% r8 Q/ Y4 ~

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


      ) x6 H  x" o/ e! ^* Z- U! |+ F1 l0 k2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      5 R4 y$ v% S: U3 [8 i+ j9 Q' \cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      8 g. O4 {% y2 n7 k$ scolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")  O! e* }' d  j1 I7 s& X% R
      five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))3 O1 P: U2 v! ~4 }! _
      five_country$date<-as.Date(five_country$date)
      . F: f5 D# a0 F0 k& `: N, W( J  V$ K6 H, c8 `. B2 B
      ggplot(five_country,
      0 N- x) S2 a' u. x- a$ g+ a7 X            aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  & T; t0 m: p5 f
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  1 O5 \# _% t$ j* u. T$ y7 k
        geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  2 S$ ~" i* F/ h9 F9 y
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      ; X$ ^, n4 W8 n$ a3 e! }  theme(legend.position="none",
      & |  B) D1 @8 m        panel.background=element_rect(fill='transparent'),; Q0 R6 b. E0 T$ b& g# x
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),( I0 A3 ^. p- z% @
              panel.grid =element_blank(),  #删除网格线* u0 B/ z& X! A+ \! g
              axis.text = element_blank(),  #删除刻度标签
      , ]$ t' q8 U! G5 {. u/ y( }        axis.ticks = element_blank(),  #删除刻度线
      # u* j! J5 d8 i2 L6 Q  )+: f1 x  R7 Y3 G' k
        coord_flip()+  
      2 c  k4 B, M& W( L  transition_manual(frames=date) +  #动态呈现
      ; H5 q! u" p  b  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      2 k& h" x' a$ e3 z0 Q9 D  theme(axis.title.x = element_text(size=15))+
      $ B* I. N$ G1 U# _; u$ |$ m3 H  ease_aes('linear')  
      ! ?& k- R! x/ c# `" S5 X. ], G
      4 T) N4 d2 w8 \2 S" e7 C" s' W1 Ranim_save(filename = "五国累计确诊病例增长动态图.gif")
      ! z+ y2 H  d: h* y
      + n# c0 b. T- A" y5 q$ ]- r& F+ _

      % Z  O* U$ N0 A1 ^$ v# c3 Q% z' g) a" O& v+ ?' M' Z
    0 v. E/ M5 x3 X. M
    # N0 J' p& O% e' l  D0 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, 2026-10-23 05:32 , Processed in 2.650632 second(s), 50 queries .

    回顶部