QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化
    6 g9 s! Q5 `5 d# v4 G$ j目录
    8 L/ S2 Q9 n) e5 L一、数据介绍及预处理; N# s: ~; g: k. d  Y2 [
    二、新增确诊病例变化趋势
    6 x- O; o1 M" R4 \- e# N: L三、新增确诊病例全球地理分布
    , d; p! j  T! E1 w  W0 `4 @四、累计确诊病例动态变化图
    2 n1 }3 u: d. l* r一、数据介绍及预处理2 B  j: B3 [$ X/ ]4 [! u# {
    1. 基本字段介绍+ u; a# D$ o1 v! o1 ~/ m
    8 Q! j" r, \& m
    字段名        含义3 [+ N, |% O/ Q  |- u
    Province/State        省/州
    ' n" C! C- _/ Z$ E4 DCountry/Region        国家/地区# m  r+ H. J, C# g; K( ?9 Q
    Lat        纬度
    0 B* S; S, t# p- Q* P# @Long        经度: n8 T; V* |7 q
    1/22/20-12/7/20        每日累计确诊病例
    + m3 A6 _# \! B0 p9 }& B3 c; _, A$ d% V* q! f8 |. A
    & f: l4 h* O4 F4 \  s  J' s

    # z7 ?/ x! j0 t, z5 c

    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)]
      4 P& P- Z& j! M  a  p9 p
      [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)]! t6 ^0 {( B3 T; O  i
      [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)]
      6 p- T( ?: g  g# [3 w% w; 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)]
      ; b& H0 O) l! b- R, C  q
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例: u7 v9 l" \3 P' C* ]+ g& W) r
      inspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])# G$ W( v0 R7 C
      increase_data<-inspect_data-inspect_lag_data1 z$ _- X" c. v% |6 e/ j/ `

      2 v# z2 h" M2 a3 J#合并数据,new_data为新增确诊人数数据
      4 y# W( J7 O3 dnew_data<-cbind(information_data,increase_data)
      # _5 S4 Q/ @8 D' W8 K2 }) V* Z8 w/ G2 v# p! T0 R
      1. 中国新增确诊病例变化趋势
      0 Q0 A3 q6 H$ s/ n0 c! t#合并所有省份新增确诊人数' k  U7 v6 U2 {
      china<-new_data[new_data$`Country/Region`=='China',]9 n3 M, b0 V% w
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
      2 X! y/ p7 p2 ~colnames(china_increase)<-'increase_patient'
      4 T- B3 r9 ?9 E0 e. Nchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      8 X; W5 g7 H. `& p. \- I6 E6 B. W1 c, M' E, l8 c0 z  q
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+  n% A5 ]. K" B9 b3 U9 x3 E& z" ]1 U
        scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
      " H1 |  L6 s) y$ @, \  r  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+1 ^" B  u  V3 E! P7 ]: P
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      % A' Q1 H! W: [: F7 r: s( J; I  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),; B/ e: A+ I. d
              axis.title.x = element_blank(),
      / n6 K  v, D" N        axis.title.y = element_text(size=15),
      ( _& |: f% r* b        axis.text.x = element_text(angle = 90,size=15),
      1 ^* \# P" Y5 u0 X        axis.text.y = element_text(size=15),
      - P, N3 ^1 D- n$ W0 j        legend.title=element_blank(),! X( _. l7 O+ R6 {
              legend.text=element_text(size=15))
      3 {4 G+ w3 S) N* ^. I4 K

      6 `2 t* q1 ]5 Q% t% F8 X                             
        i  R( H7 G7 x3 ^, R  x2. 美国新增病例变化趋势
      , B+ p9 U/ f' f4 z& b0 }% uus<-new_data[new_data$`Country/Region`=='United States',]
      + U/ I/ h# f& j- D/ k( [1 F$ P1 Lus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      ! m/ f# z3 c/ t; Q, \% L2 {us_increase$date<-as.Date(us_increase$date)
      0 P$ e' [" h5 ^* z% \5 ^4 f, P( R/ W3 p4 cggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+( @9 }4 N- G2 `% \
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      9 m9 K. W0 \. h" a/ n% j  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      9 i" Z" c& R. }6 R4 i5 y  theme_economist()+   #使用经济学人绘图样(式ggthemes包), l4 w' w/ _4 ^+ r4 _( O
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 @- m- n$ M, E9 _. Q1 }
              axis.title.x = element_blank(),
      3 D; ]; H9 A) n% {0 n+ c7 S% L        axis.title.y = element_text(size=15),
      & D9 T# u: |$ T, P7 f7 b        axis.text.x = element_text(angle = 90,size=15),
      $ j7 S3 }' G& i; ^: t        axis.text.y = element_text(size=15),/ `$ X2 q6 t% ?' m
              legend.title=element_blank(),
      # q# T: W0 J; t  J9 V/ n! r/ v4 B        legend.text=element_text(size=15))8 W1 V" p' M2 M( v; j

      4 ]4 q/ j4 H" g  v9 p  p% `2 t/ W0 f- p1 q1 U# J5 P( z
      3. 全球新增病例变化趋势
      # c' O7 K' W! [* Jtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      ( M0 T: f9 g# Ecolnames(total_increase)<-'increase_patient'
      . ^) x: }  ]2 j# @# Ktotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")$ E, B3 T6 f1 D: u( \' v7 p
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+$ f0 y) v! G8 C; `! X4 p8 ~1 a
        scale_x_date(date_breaks = "14 days")+
      : |# Q1 e+ W. v- [6 L. V  a  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+' |" @$ @+ x( q8 W. Y
        theme_economist()+, C' ?  f) [  v
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      4 B7 [; t0 y" R/ {6 d# m3 E                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),- v) B; d2 s" {: N4 p
                           labels=c("0","20万","40万","60万","80万"))+7 p! x1 P: }. c6 W
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) X" s8 ^5 @6 Y8 E) o* g8 l
              axis.title.x = element_blank(),
      4 a6 E- [9 H1 j! C7 |, T. u        axis.title.y = element_text(size=15),2 z; \+ w$ n8 o/ V( t
              axis.text.x = element_text(angle = 90,size=15),' H+ K( k# ~. t) n, @/ z
              axis.text.y = element_text(size=15),
      : z) ^5 a# t+ ]! c7 Y' e        legend.title=element_blank(),8 ^6 |1 X1 M* m" ^4 {3 _: H( U
              legend.text=element_text(size=15))# _% R/ p6 H+ E# K: B. R* L+ P) ?: h

      0 R( K, P& Q2 h) _9 g/ U7 N6 z
      ( K% m# K6 s( Y* J& W5 h三、新增确诊病例全球地理分布: ~7 `5 Y2 Z" ]/ @0 B' X
      mapworld<-borders("world",colour = "gray50",fill="white")
      . w; p) l; v& c: w/ eggplot()+mapworld+ylim(-60,90)+
        b; x5 ]8 F" ~  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+' l8 u$ Q/ m* u
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      1 s( H: B# X: x0 M+ w  theme_grey(base_size = 15)+
      ; R5 T/ k* V" ]) w9 V1 _  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),0 u- V% `& j4 v. u
              legend.title=element_blank())
      2 [' y( {2 A6 K2 Q5 r0 S" R6 z0 D
      ggplot()+mapworld+ylim(-60,90)+
      * W" Q0 |2 s4 N  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+, j  i3 n# n) W% I- R9 g
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+6 O( P6 f8 R: N' U
        theme_grey(base_size = 15)+
      7 s: E+ l0 r% O' M# c0 ^0 F/ R  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      - A# e( |9 V. b+ f9 c" ~4 |) z        legend.title=element_blank())
      $ }6 c0 v$ `. `) O$ [# ^- b9 x/ |$ t3 Q2 U
      $ [3 V) U: G9 t  g( d
      四、累计确诊病例动态变化图

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


      $ o' V* H, V$ y6 S0 R5 U, y+ X

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


      4 R: b) q$ `( }/ W" X; U2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图+ W. ~) O- Q5 [
      cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07'), @0 @9 D1 B% P) H: d) Q* y) R
      colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      & N+ S6 L- g$ w6 v1 C! M$ o) Rfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
      7 C8 H9 Y1 X9 E/ Z# O6 Tfive_country$date<-as.Date(five_country$date)
      & \5 n+ b: _3 M/ z' ]* N! w
      3 Q% b' _* R8 g9 Hggplot(five_country,
      6 z6 o3 F: `% I/ @5 Y            aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  
      " n: e5 c  x6 `) {  geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      / r% g- [; f% J9 a* z8 V  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  
      4 B0 I7 O. P% H# C/ b) ^3 X9 i  scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      # ^1 }8 b5 m3 }! @; c5 z/ N9 N  theme(legend.position="none",
      5 t" Z5 F- B9 t$ |4 O& Z8 H  B* {        panel.background=element_rect(fill='transparent'),2 N5 n) Z& _" Q% T- j& a$ g7 k
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),& }* }) M4 j( N# W/ D
              panel.grid =element_blank(),  #删除网格线2 A2 Y2 X& _8 x
              axis.text = element_blank(),  #删除刻度标签
      7 v5 L$ B; P; j4 i& N6 B        axis.ticks = element_blank(),  #删除刻度线
      8 J0 X& F& j9 Z+ S  )+* Y1 s, W. J7 L$ ^2 l2 E- [
        coord_flip()+  
      6 ^( ^# p( q2 Q; [3 _& A1 _" Y( D  transition_manual(frames=date) +  #动态呈现
      % y7 q# }5 q, u  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  
      2 n' O. `/ _) c  theme(axis.title.x = element_text(size=15))+
      9 j# v' q) R4 |# e* ?7 r  ease_aes('linear')  
      : G  D  M& \% J4 L( |% R0 H7 e7 ^# k: o$ B9 M
      anim_save(filename = "五国累计确诊病例增长动态图.gif")  t1 F, B0 Y- I4 c/ i# ]

      4 S( @1 k* H8 X0 a( t- ?9 U  s* H1 f  |
      ! K. Y- }+ R5 D

    " s" w8 E2 g. h! {3 K, t- o6 ?" V& j# V# v6 p; S* Y) t% k# f
    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-6-4 07:36 , Processed in 0.646321 second(s), 51 queries .

    回顶部