QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6147|回复: 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& {- ^7 {( i; L
    目录! u3 \' S7 O, b8 V1 i' k
    一、数据介绍及预处理& _$ s8 G! J! N( E) t  }% s2 J
    二、新增确诊病例变化趋势$ d6 G$ q. f3 ~/ n/ P9 ^8 w
    三、新增确诊病例全球地理分布  C- c9 y: K0 Q+ i2 d
    四、累计确诊病例动态变化图
    7 s- r. [$ h: v, D一、数据介绍及预处理
    0 R6 A: `2 ~* e. K% |0 n1 |, g1. 基本字段介绍7 U: W8 k$ Q( G! B
    # |! J6 f3 a6 h! ?/ {7 s
    字段名        含义; ^" h2 s! t" C$ Y( n0 R
    Province/State        省/州
    9 j4 R$ ^4 D( m/ {$ LCountry/Region        国家/地区& e1 c* e" V; m, @; C( ?
    Lat        纬度
    9 c6 }. F8 z! ~+ C8 }' Z. ALong        经度9 ]9 J' s3 u; x/ v1 j1 R
    1/22/20-12/7/20        每日累计确诊病例
    " j* C& j. Q; O" i* a- u3 {4 w5 U; j& m; V) y8 ~

    , P. a1 X8 @8 U. {4 S2 q. }' j6 ?  `$ m* p0 ?

    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)]% e1 O  g, V( ?# V) ~$ m
      [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 a  h# r$ p  p" a. b7 k/ ?" d& A
      [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)]* U  C9 i4 k3 K2 P5 T0 q" L
      [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)]
      ) V6 r; R' E2 y7 c2 u
      [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 g1 a7 t; N# K# finspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      1 Q$ z% e' ]/ R1 p% O3 J3 rincrease_data<-inspect_data-inspect_lag_data3 ?8 D8 N* A- s- \
      / w2 o& i' h6 b5 z! M
      #合并数据,new_data为新增确诊人数数据
      . r& X7 ^/ c1 M7 D& unew_data<-cbind(information_data,increase_data)0 R3 e6 R& D8 t1 X7 ~
      + k1 B  I' R$ j6 V& P( a# b
      1. 中国新增确诊病例变化趋势! k* b9 B* a; T0 E7 Q7 ^
      #合并所有省份新增确诊人数
      , a9 Q2 m; t5 ~: ]" Q7 x$ K2 [china<-new_data[new_data$`Country/Region`=='China',], ~$ ^" s1 f' w# M) v' q
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
      " s7 ^& Q. D* f1 O8 L+ tcolnames(china_increase)<-'increase_patient'
      9 C8 u3 V7 t. B0 }' `. z5 b0 bchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")# }0 k% y9 X0 F7 M: w% F

      + t4 W' f3 d8 Xggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      ' Q; _; _  l3 s) P  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)# o. {7 q9 p. C0 }5 o% F$ ]8 u7 q
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
      & R  ~3 V' G0 B  o  theme_economist()+  #使用经济学人绘图样(式ggthemes包)( i" b  v# T9 J$ A- m; w, p4 I
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      % C* l  S6 v$ s2 B' s7 h7 a" x& i0 j        axis.title.x = element_blank(),) f% U' o/ F( i* {
              axis.title.y = element_text(size=15),& j% Y- R  @$ k/ T. @$ X
              axis.text.x = element_text(angle = 90,size=15),/ N4 D- Z# n2 ~) G7 b' A7 D- h
              axis.text.y = element_text(size=15),1 J8 l( {2 P( N" Y
              legend.title=element_blank(),3 v* [" C$ u: p, r7 @4 o
              legend.text=element_text(size=15))
        P# h* h8 e' E9 u
      9 {+ T" o1 U- h: b4 |
                                   
      % D% c( g, u1 ^8 J, K( c. r2. 美国新增病例变化趋势
      7 h3 C- d' |5 G+ P8 ?/ pus<-new_data[new_data$`Country/Region`=='United States',]0 w8 p- E! d; T# S( {8 i  k
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')7 Z0 m/ }6 ~3 R& H
      us_increase$date<-as.Date(us_increase$date)2 R( p' s( h+ H* n) t  P) e9 }
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      / f  a4 _) j+ e! G3 a  scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      ! V) |$ i- a" A; ~6 ~8 v" B5 n  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+% X  o% o' Z( S; E6 p
        theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      $ D4 g0 i0 e0 l& c  {4 t8 J/ R; F$ R  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),2 J. D  T. G' u/ Z; o! v3 J
              axis.title.x = element_blank(),  L2 {' Y9 \9 |% S0 s
              axis.title.y = element_text(size=15),, `7 }: ^' ?# @6 m3 K; T
              axis.text.x = element_text(angle = 90,size=15),: {% B1 [' G, S% P! m
              axis.text.y = element_text(size=15),
        a) q9 P! p. u6 h6 V8 r5 L        legend.title=element_blank(),
      % ?8 i$ K* v* `) n        legend.text=element_text(size=15))
      1 d% s0 R) N( r  u5 N3 k3 S
      9 V9 q$ x1 x8 @+ {* q
      * D- R% ~3 Z( ?1 O. @1 w7 B
      3. 全球新增病例变化趋势
      9 \7 X) U8 J4 S2 b- Btotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      6 x" r, R+ e" |" T& _! scolnames(total_increase)<-'increase_patient'  \& T" j1 g2 m% \$ M: T
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
      ; L& [% z& `2 gggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      9 H" F) l. Z' n, N6 H  scale_x_date(date_breaks = "14 days")+" c4 m" Y' K! H7 ~* c) p
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
      ( R' |4 d: t8 \  y, q  theme_economist()+& V4 H) k; `4 @
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签. _$ K$ {3 u. Q( O* H! S: i2 m
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      - [( u8 ^- M' q. F. _                     labels=c("0","20万","40万","60万","80万"))+
      8 g6 k1 g  ~4 E1 A, `  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),8 {+ s2 J5 _2 _# u- {5 s" x2 i
              axis.title.x = element_blank(),3 j# p$ M7 p8 k7 m- u  H
              axis.title.y = element_text(size=15),4 H0 p+ n+ e  n2 q' G
              axis.text.x = element_text(angle = 90,size=15),4 `8 L& D7 u* T( }9 b5 Q
              axis.text.y = element_text(size=15),
      : p; Q/ t6 d) X2 B" G1 w        legend.title=element_blank(),9 Q: t) _. ?0 n  w5 P
              legend.text=element_text(size=15))& i$ z0 z$ T3 c: T2 Y
      - X) r, s$ e4 ^2 ]* X, I2 o& b% q

      - i  d' j- D" @) x# E. E三、新增确诊病例全球地理分布
      4 T6 x# p% a+ E+ j, G- smapworld<-borders("world",colour = "gray50",fill="white") % D3 p1 K9 }5 D" N8 y* }6 u
      ggplot()+mapworld+ylim(-60,90)+
      $ u6 a) Y4 k0 p2 P/ p  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      0 A* B/ D- ]! t7 Y& a  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      ! T5 b$ A1 v/ V  theme_grey(base_size = 15)+
      9 U3 w1 N4 S: d  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      1 T4 i0 \( f* m& A. E        legend.title=element_blank())
      + I; l) _  W% N% S, g
        e7 }. y4 L! F( `ggplot()+mapworld+ylim(-60,90)+/ W( G6 e3 @8 w, z% C5 w
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
      2 R9 h- N& i! @; o, t  scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
      5 R7 x# s9 D+ N  theme_grey(base_size = 15)+1 v9 _3 F) d) J4 d1 D/ ?
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),4 x, j; T; N2 k$ L: X4 G2 H
              legend.title=element_blank())
      / A* @5 B3 Z& H4 @9 U! a
      * U% N2 b6 E: s2 Z
      ) z5 H3 M: m/ M) ?+ t. K四、累计确诊病例动态变化图

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

      " M5 j3 s  ^5 b1 o! C

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

      " L7 y0 F+ v7 e
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      3 N$ j2 V3 J' ]6 ncum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      3 i. G* a* a. T6 Vcolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient"). s2 l$ }1 ~/ X8 b, B4 L5 c
      five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
      & b5 S! K2 k0 t+ B1 _five_country$date<-as.Date(five_country$date)
      ; a' ]& j+ N! X# X: ^
      0 z' |8 L+ |3 a  U- N( i9 f" Aggplot(five_country,
      4 u& j" k2 O1 j9 ~5 Z            aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  4 B/ o0 a5 i- e; Q$ I; r) h
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  ; ^/ a2 T4 w0 ^9 y
        geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  
      6 T, x: f) {( M, t  scale_fill_brewer(palette='Set3')+  #使用Set3色系模板% z# u  y! i% P" y* f
        theme(legend.position="none",
      3 L) X! ~: v, {7 T( ?* f& _3 J( a        panel.background=element_rect(fill='transparent'),+ i( B% J9 x; z, e! h
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),7 T! {3 N2 a! z: g( N, K
              panel.grid =element_blank(),  #删除网格线
      % X: w; @7 _# H$ w        axis.text = element_blank(),  #删除刻度标签
      . H& O" A8 h$ |  g3 B9 K3 [        axis.ticks = element_blank(),  #删除刻度线
      4 ?7 C1 V' h8 d* D. `) {! r  )+
      " d4 E1 f. N6 W1 g3 d4 N  coord_flip()+  
      ) G  b4 E3 M6 W  transition_manual(frames=date) +  #动态呈现% e& q% w1 `% y& R
        labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      9 _: X. E, r: j0 a  theme(axis.title.x = element_text(size=15))+
      ' F5 R7 ~6 ]" D5 q( e" i  ease_aes('linear')  5 A' x. O- S3 b. Q  Z/ r9 h

      4 e9 b; a0 x. Eanim_save(filename = "五国累计确诊病例增长动态图.gif")
      ! B# k  E5 n) t3 ^+ t' v4 C) k% r9 U

      0 V: g& r5 i" i8 Q1 C. ?! k* e) W) a6 q1 P5 m
      * o1 z! M& U; q8 c. D1 Z
    # s6 O( [) d8 d2 T2 R. A+ x: V
    : j- Q& c# N7 Q4 Z  |& k' t0 [
    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-7-20 07:13 , Processed in 0.351232 second(s), 50 queries .

    回顶部