QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6373|回复: 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/ T* {' C2 [目录
    ) K/ M) D- e6 A. W" W( X0 O2 g一、数据介绍及预处理: B. t3 v: B7 r  A, f
    二、新增确诊病例变化趋势
    : w+ O! l% X* ^三、新增确诊病例全球地理分布
    3 p$ P* U3 ~% [: K' x, T四、累计确诊病例动态变化图8 B" l- d: ~. w( J8 c5 J
    一、数据介绍及预处理
    : E6 a: }: G2 }1. 基本字段介绍
    7 T3 x+ h* Z0 X+ N: Y, y$ I' i( I# g1 ]% f2 I, ?: w+ I/ Y
    字段名        含义
    : H) P- \; [+ x; N( T( w6 sProvince/State        省/州2 z* z+ \6 }: O+ g$ \+ W) ^! \
    Country/Region        国家/地区
    ) x- m- E' e  n6 dLat        纬度
    ! i& S7 I3 A2 i2 z; Z& x8 HLong        经度4 m- k0 X4 X+ _, M8 B. R
    1/22/20-12/7/20        每日累计确诊病例
    7 J; r' o  m+ {. W& k3 J) g' h! a2 W! q) ^7 ]+ @+ _
    . ^  n  }' C* k

    , j* c; w2 e2 E" F2 _5 M

    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)]
      - E& F2 |) |9 w3 F8 i7 d
      [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)]+ h9 N6 Q5 l8 Q
      [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)]
      2 e6 [- V5 \4 {
      [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)]9 Q# w; V- A5 s4 K3 |
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      : \# \# `, n+ y2 e  c( Dinspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      3 U$ i6 P7 S% z3 A9 ~$ sincrease_data<-inspect_data-inspect_lag_data- p/ F, ?  L* R7 d
      0 b& X5 r6 C% x. t
      #合并数据,new_data为新增确诊人数数据6 N& m, c9 H+ X9 X; y
      new_data<-cbind(information_data,increase_data)3 R/ H- A; K' w
      1 u9 ]! p! z6 ]
      1. 中国新增确诊病例变化趋势& o6 D9 L& G2 Y7 o7 g
      #合并所有省份新增确诊人数
      : C; x" _% S1 f2 v6 N% c3 Echina<-new_data[new_data$`Country/Region`=='China',]
      - V& A* [( u/ U; O8 e# Vchina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))( N) q/ D: ^# M" V4 F7 E
      colnames(china_increase)<-'increase_patient'
      4 l2 R( B; @; t( [+ j8 o: gchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")3 G, T$ [8 t- ]% P  j

      + E7 T) _& U6 `2 [8 m3 B4 z0 Sggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)++ d; M1 O0 {4 E" u( C# ?1 s' r
        scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)6 F1 G2 k% i. @/ L; x
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+( m% j4 \  G) l' ~* G0 T- h8 b
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)# C% ]: `; k0 e! r) B
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),( V/ A- H3 a& h2 q2 i0 V9 H5 q
              axis.title.x = element_blank(),
      % c: {; M" o) ]# q- V& s        axis.title.y = element_text(size=15),
      1 P7 ?# j/ X7 m/ S+ [        axis.text.x = element_text(angle = 90,size=15),) ?+ O5 m# Z- F# s* A- H
              axis.text.y = element_text(size=15),2 z+ _- c" O0 C
              legend.title=element_blank(),- V8 ]4 H9 V4 H4 c# c8 S
              legend.text=element_text(size=15))
      6 K: X/ W3 r: z4 m

      : m. h1 r# I4 n! C                             
      + A' u, `$ I; J. w* |# Q5 r( R2. 美国新增病例变化趋势
      9 ^: I, _8 [5 b5 mus<-new_data[new_data$`Country/Region`=='United States',]) }7 x2 @9 l4 }7 ~( ?1 e9 M- F
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      & A* p& _$ o2 ?1 {8 aus_increase$date<-as.Date(us_increase$date)# i+ Y# N# H- f
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      7 v* I/ c  @+ d5 b( |1 h( w  scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      7 L/ k7 W! k, @2 v9 A) O- M0 v  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      " ]4 G9 W( R; M$ D9 Q  theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      " {8 J5 G9 L5 m7 p  {  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      ; O* q" s( C7 T2 I. `8 S; d% }        axis.title.x = element_blank(),
      5 h- s0 G' P; B0 H        axis.title.y = element_text(size=15),$ A9 C: z" A: w4 \3 v& O( D
              axis.text.x = element_text(angle = 90,size=15),
      ( |6 a2 i; |3 o4 I0 T* R/ Q        axis.text.y = element_text(size=15),
      3 I4 S  c/ X  G' p2 b0 c7 B9 w        legend.title=element_blank(),
      - l% W) b; ~) P; q3 n' C. w        legend.text=element_text(size=15))  s5 W' C7 r; A  e: s0 s5 ^# t

      1 u0 M4 \& g* A( e) f0 X8 ?2 M  D/ z
      3. 全球新增病例变化趋势( y" o" H+ `, F: Z# P
      total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      # L* \1 y7 n8 X& h& F9 L3 vcolnames(total_increase)<-'increase_patient'
      5 c$ o, M# f8 U; Z: Ototal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")6 u5 w) {+ W$ t- |5 M  D
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
        _& Z. c5 y* |7 S  scale_x_date(date_breaks = "14 days")+
      . |4 F% s) t# r: p5 B3 m  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+9 Q% \2 y  m. N$ g1 C6 ~
        theme_economist()+
      6 W! q- W2 r. ?  scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      : F0 X2 p0 @+ g5 q% J                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),! _2 N* w$ a  x" j& b  F% ^
                           labels=c("0","20万","40万","60万","80万"))+
      4 R# T$ j0 G8 x; \% X  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),( I! `, r  |, T  E- k8 C
              axis.title.x = element_blank(),
      5 t& q6 P. `6 v/ E! A        axis.title.y = element_text(size=15),5 P  u$ Q! O3 x" {
              axis.text.x = element_text(angle = 90,size=15),2 x3 i9 ~! }$ [. B( U0 f8 @
              axis.text.y = element_text(size=15),$ E+ ]+ W, x3 m0 C( _& F1 j
              legend.title=element_blank(),$ i' S/ L# S( z/ {$ h# I$ e3 y0 J$ q
              legend.text=element_text(size=15))
      $ E# Q' G8 q( \6 w
      : A% q1 `+ z# P; B) D8 ?

      & ^+ {# n$ P5 l三、新增确诊病例全球地理分布
      - D( Z6 {7 S. H! |+ _' z' Umapworld<-borders("world",colour = "gray50",fill="white")
      / x+ G. a0 \$ k" h: \6 fggplot()+mapworld+ylim(-60,90)+; q$ J/ Q) V2 `+ ^: ~
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+# N- b/ U9 M0 Q$ ^; L4 I0 V+ w
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      9 Q3 P& t5 }, q( Q  theme_grey(base_size = 15)+& _5 x  ^; m% p2 ?5 T! ^
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      ( s( F, d7 ?8 e        legend.title=element_blank())$ L5 Y  P* b! y- R
      . o, {1 C; ]8 ^  l* f
      ggplot()+mapworld+ylim(-60,90)+
      : D( m6 Z- _9 r( z; g  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
      & y, _' N; `& F$ P; ^: K5 _( {  scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+/ f; l9 t; b5 J
        theme_grey(base_size = 15)+/ G+ P6 E! b1 ~) Q
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),- v! t, c0 @* Q% Q2 @# {
              legend.title=element_blank())
      ( V; l( ^2 X7 g+ g$ S/ v+ D8 M% b; ]" X" B* Q, Q+ \4 T0 H2 g9 e# K
      % s, ~+ K# I9 O& \1 ?5 x
      四、累计确诊病例动态变化图

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


      # ~* e4 q0 I' b/ E4 w2 d1 Y! J

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

      6 i% t$ K& W2 Q$ U9 x
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      1 [- ~3 K4 p, g. Xcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      $ Z! k7 m7 Z1 j0 @colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      3 H5 J' |! r) n" dfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))3 o" w- S9 i" h8 S# _& n/ s8 h
      five_country$date<-as.Date(five_country$date)* S/ v6 r7 w) f- s, D9 r6 Y
      ! G/ M, c* o1 [5 ]
      ggplot(five_country, 4 @3 P4 b9 E4 M+ j& c; A
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  ) X0 k1 J% `+ `
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      , I# j. `1 k  B2 `* `  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  : o! O" C3 G0 e& t0 {
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板! |0 V1 \; D8 i! c
        theme(legend.position="none",
      8 j' l- C6 e( N8 S. _# f! }4 M        panel.background=element_rect(fill='transparent'),
      : }+ i' r/ h# D. f        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
      ) _! h% j6 J% [5 K        panel.grid =element_blank(),  #删除网格线! `+ V; U; r% }& B& L4 m
              axis.text = element_blank(),  #删除刻度标签
      - n% N; S7 `: Q0 j4 [6 f. N$ Y        axis.ticks = element_blank(),  #删除刻度线
      & \  c: J) \$ s, ?/ m5 k  )++ `: X" ~4 t6 Q2 f
        coord_flip()+  
      / i; m  E8 I! o4 N$ {) F" e  transition_manual(frames=date) +  #动态呈现
      : m% V- t# l* `; W2 L# C1 E  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      ( [: z7 k( y* ?1 D  theme(axis.title.x = element_text(size=15))+
        Z( g+ ^9 |4 h! n  ease_aes('linear')  
      # h: t  s% w7 e; K9 q8 r9 _- r6 b& ?' Z. g3 U, r9 h  }
      anim_save(filename = "五国累计确诊病例增长动态图.gif")( }# z/ x# f6 C5 I- u. o. X5 |  A4 g

      3 D) U- ~9 F4 r
      6 j* g7 Y- B# J8 ]; l! M- H$ L  A* m: j5 j9 e
    : X0 p8 O; f4 d1 g1 o. m
    % k; w' G& v4 ?! E6 O
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-31 15:12 , Processed in 0.219621 second(s), 50 queries .

    回顶部