QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化' ~; }- Z2 l8 q! o3 Y3 `
    目录
    * c) z& i( G4 M( t' B一、数据介绍及预处理
    ' ?5 b8 s7 Q; K6 f二、新增确诊病例变化趋势" N  S2 Z) o/ D. z3 y
    三、新增确诊病例全球地理分布
    # s2 [8 d  \6 F1 Q' O四、累计确诊病例动态变化图
    . I( A/ X/ R8 J$ T$ B9 }一、数据介绍及预处理
    # p4 R; ?, s- c0 k2 W/ a; U1. 基本字段介绍
    + A% p' w7 |( {/ g7 N" a% w* E: b! u3 h- ~6 [& W
    字段名        含义# M" A( v" p) t1 d/ B1 {, i
    Province/State        省/州/ z9 K+ C" [; \" J! B" c
    Country/Region        国家/地区( i+ N; c/ g9 L7 d# B& [, B( {# ^( p
    Lat        纬度
    & T" l% [! G1 Y* G+ MLong        经度
    ) h/ f; v/ }+ F% Q$ G1/22/20-12/7/20        每日累计确诊病例
    1 P9 D7 D7 H. }3 E2 m
    ' q5 L1 o# X$ x- B; _$ D9 k
    0 N, Q- y3 V8 |( a4 ~' a4 l; h8 W; A2 f' X6 o% R6 K

    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)]
      ( K6 O5 |* n  U; w% 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)]
        U5 E$ r4 s. ?* v
      [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)]; r) O+ Q$ f$ u7 `8 c3 ~
      [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)]
      1 y/ ?1 T# K! Y! j% ]) U# v
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例9 @, u3 Q. v) ?, i2 @
      inspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])& J/ _( g+ B# F/ {  A# h8 m6 h+ d
      increase_data<-inspect_data-inspect_lag_data4 L4 \5 t' o2 h6 i2 b: D+ Y+ N5 y! M

      ' ]* ?3 ^" x. g% u6 T#合并数据,new_data为新增确诊人数数据
      1 H9 \8 C- g  Tnew_data<-cbind(information_data,increase_data)+ C; C# Y5 O# t
      ; W, x, g1 p! O
      1. 中国新增确诊病例变化趋势2 {/ n. d& i# E1 K& Z
      #合并所有省份新增确诊人数
      5 H1 X( u; e9 s3 _' \" D/ p: Xchina<-new_data[new_data$`Country/Region`=='China',]( {( S* I  f/ z, K; X9 j
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
      0 ~, \( ~  e$ ~6 {0 u0 ?colnames(china_increase)<-'increase_patient': @* T3 \5 L, Y5 q9 v
      china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      1 s2 @$ V- z" B9 k( w- T1 O* O7 s$ {" S& u& [$ k' a2 ]5 m4 q- I8 @) t
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      + Z* Y8 x2 b6 l9 U2 x  \  scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
      3 b8 T$ U, E9 z' Z$ B1 g# X  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
      * B3 X! U! v$ |+ ^6 k  theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      % b3 B' K( y4 P' T7 C, K5 x1 E  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      * w1 u7 `4 T" B5 Y        axis.title.x = element_blank(),  S8 G+ ?6 s& j0 Q7 v* b
              axis.title.y = element_text(size=15),: j4 \( S0 k) ^$ ]
              axis.text.x = element_text(angle = 90,size=15),
      ' x6 h- R" G1 t0 x        axis.text.y = element_text(size=15),  _; v$ F: F' k  ~
              legend.title=element_blank(),8 i$ c5 _. x: N2 z: u. O
              legend.text=element_text(size=15))0 Q, [- b- Z% q
      + ?( A& ~" v( Y; J" H( L
                                   ( d& A- P0 g% [2 C2 H, @1 g  f
      2. 美国新增病例变化趋势' o! ?4 n; l% s3 ~1 E, E! q6 L
      us<-new_data[new_data$`Country/Region`=='United States',]
      2 ~! E+ ]  o7 J# Eus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      . R7 u) \+ w& e5 Eus_increase$date<-as.Date(us_increase$date)
      2 |! P( K- B9 g3 Aggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+7 E' {4 C7 E, u$ m# O
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天+ `% T  K% V, l; `8 |8 ]
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      6 E: L% k& G! T1 Y- P5 U! p  theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      5 m: C' ]& q3 k8 V  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      7 p2 X' X5 i. x        axis.title.x = element_blank(),
      " P8 l3 k6 B4 H: T, q        axis.title.y = element_text(size=15)," l' a; l1 b0 Y, o
              axis.text.x = element_text(angle = 90,size=15),9 I8 M7 Z3 }- L# c+ S9 f( e' I
              axis.text.y = element_text(size=15),6 o& W4 N) Y) J! S0 L0 Y7 |
              legend.title=element_blank(),! H, t1 a# x* [; B: d
              legend.text=element_text(size=15))
      - }2 ~/ Z' t' b' a
        o- k' y4 {0 _
      3 A1 a) p  p# k7 l9 f! }, T
      3. 全球新增病例变化趋势
      ' p) d# g  H8 z( d$ f& w! _total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      . O; |2 U7 V" hcolnames(total_increase)<-'increase_patient'2 U1 \; Q7 i* O3 `( w5 U9 e
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
      1 ]: d# ~. z/ O- @1 xggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      6 w8 m3 z/ S( D; T2 f. ~. C  scale_x_date(date_breaks = "14 days")+8 s5 j8 s$ _9 Y5 @7 Q
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
      $ J5 r* q) B, T- p  theme_economist()+7 P' i7 p3 Y9 s; Q6 d
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签6 p+ L8 @. ~5 Q; I' |% K0 ~2 }0 s, a
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      ; @4 {+ x6 O% ]                     labels=c("0","20万","40万","60万","80万"))+
      " s$ f+ U" _$ ?; v/ X/ M8 b  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),/ P- ?6 o  ^4 D
              axis.title.x = element_blank(),5 J8 M4 ~6 ?# d6 G) n+ l: C
              axis.title.y = element_text(size=15),
      5 I0 \' `) e7 {: k! B( n) h        axis.text.x = element_text(angle = 90,size=15),# O/ g' a4 o" b: ?" q& u
              axis.text.y = element_text(size=15),
      6 _  W/ t! `2 I" G" d" j3 Q5 X/ i/ O        legend.title=element_blank(),$ f. i4 a7 b: `$ S
              legend.text=element_text(size=15))4 i8 P9 P: ?. x

      ; F. V. p% i: z* p4 I+ |  ~) A7 }+ C8 ~/ A( F
      三、新增确诊病例全球地理分布4 z& |/ s+ L$ [! I6 `
      mapworld<-borders("world",colour = "gray50",fill="white") " Q' O7 m* Z2 P
      ggplot()+mapworld+ylim(-60,90)+
      6 e3 w" w, O" J; E  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+/ o1 ~  j6 w- [
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+6 ^- ^+ l; p8 U9 p; Y
        theme_grey(base_size = 15)+
      2 w! {3 o& l" J! b: O0 U  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      * Q# V4 z6 a9 M  w2 n. b7 E        legend.title=element_blank())
      # k" z' X; q4 C8 e8 G; _
      8 ?0 Z7 Z- I( m, z) \  Kggplot()+mapworld+ylim(-60,90)+- `, t- j# S; X, p6 W/ N
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+! s" |- Z* G" `
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+2 W7 J; E: a* I. r+ k
        theme_grey(base_size = 15)+
      $ I0 f, v; |1 }7 {9 E) @2 x' f  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),3 q, W3 T: I0 s! n2 R
              legend.title=element_blank())
      " Y, g7 @# L8 |8 J4 O1 N4 x; ]
      ! H$ p0 H' P) S, C! r3 }/ T: f. D& A5 O
      四、累计确诊病例动态变化图

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

      % A; q8 T' N+ [! ~1 U) ~

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


      , q0 ]3 q* \" e# D2 z" j9 D2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图! V6 Z; c' X2 [8 _% V" ~5 a
      cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      1 K) y7 v$ j5 y- c% Ucolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient"), |4 \& l' J; b! O+ c
      five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))5 d& z, |9 l/ {6 }  ]8 u8 c
      five_country$date<-as.Date(five_country$date): h' E0 z. ]' n9 q

      . B3 B, U! q/ K7 _/ G- u/ \) rggplot(five_country,
        L; l8 K0 }6 ]$ w9 U            aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  
      % o) b: Z9 w; R, F4 M  geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      8 A% u. h) S) P  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  & Y2 T1 ^5 g% F0 l
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      ( R! M1 v. I1 O4 |4 @  theme(legend.position="none",* Z, p1 E5 _7 a6 z" `
              panel.background=element_rect(fill='transparent'),
        p" v0 F! K& `) `- k/ _0 d9 o3 l        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),# q& \% v3 j" {; h+ a& [; V
              panel.grid =element_blank(),  #删除网格线( c. w& m/ {* j. j2 E9 S4 r3 C
              axis.text = element_blank(),  #删除刻度标签5 i  L& z+ J" o/ N1 k- |
              axis.ticks = element_blank(),  #删除刻度线
      6 L" h! _- t0 w& c  )+# [1 p6 a7 z: L8 r* `4 t
        coord_flip()+  
      , M# b6 H& d& ?( Q& |  transition_manual(frames=date) +  #动态呈现1 K6 q  w0 z+ K# b/ n3 A6 Y
        labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      * [8 W# O* r3 e  theme(axis.title.x = element_text(size=15))++ @1 h8 X6 D4 Z. W
        ease_aes('linear')  7 @% H, j, s5 X& L

      7 K& X( \& }+ z' Y# H. ianim_save(filename = "五国累计确诊病例增长动态图.gif")8 g7 J& \, o/ Q7 F5 I* _- n- g( R' M
      9 S2 j# X4 h! c; `
      4 S2 B% t) ~( t
      . D0 k/ M  W. J
    % B3 O4 ~9 F+ ]
      z7 g% F. h, b! @
    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, 2025-9-28 17:30 , Processed in 1.055763 second(s), 50 queries .

    回顶部