QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化
    7 m3 }# J( S2 e/ j% S目录
    : K9 W/ z9 M, S- `% w* {一、数据介绍及预处理
    7 X, y  I: A: C* j二、新增确诊病例变化趋势8 [: w0 w/ S' p0 G8 W
    三、新增确诊病例全球地理分布
    7 J* Y3 j; k6 z5 R四、累计确诊病例动态变化图
    ! H8 N6 P* B1 d; P一、数据介绍及预处理# `, {8 q5 n& h
    1. 基本字段介绍
    , o" J' L. P+ D) B' F' ^
    0 [. {) N1 D+ V, m7 W9 ?" A4 |字段名        含义
    7 m1 F7 u5 f5 S: U6 c, B2 a. K& S& RProvince/State        省/州
    7 q/ v" R5 A% v2 \( W% X/ {1 LCountry/Region        国家/地区, ~7 y6 Q3 q  o- l: Z0 R/ \
    Lat        纬度
    - E2 A* l) y# @9 O1 H" H/ eLong        经度
    $ V! R" E! Z$ V2 y1/22/20-12/7/20        每日累计确诊病例/ z# y8 D7 t! G

    ( x, `) i3 A6 e( C5 K
    ( X" ]% E- X' `% D3 G% [( T
    ) j' l4 ^  x9 X

    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)]
      / `  a# e! U3 s# @% d% g
      [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)]
      & b& [  X1 O0 S9 h
      [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)]- C" Q( Z! y6 R
      [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)]- ^: W% [; c+ 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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例& Y% O! y8 W2 j/ H; V; [
      inspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])4 b- `9 ?* ^, t; L- }; O
      increase_data<-inspect_data-inspect_lag_data% m4 U  }9 @. [" g
      2 k  o9 r' k1 }! F1 O5 a
      #合并数据,new_data为新增确诊人数数据
      * h" \- o* k3 Y. b5 O. Rnew_data<-cbind(information_data,increase_data)  ?. B% b+ B+ Z) t" V  F1 c

      . G* _6 z- q/ S8 D1. 中国新增确诊病例变化趋势
      ( X8 R, I! o, n9 S" S; u8 C#合并所有省份新增确诊人数2 M6 V  c. _! ^. {# f0 p4 d2 e
      china<-new_data[new_data$`Country/Region`=='China',]
      3 {; O! k3 t: J% J9 C$ Zchina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))) N: w2 e. @/ `) |
      colnames(china_increase)<-'increase_patient'
      + b& v, P+ O$ o' U2 d9 ychina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")4 ~7 B' ~$ a: \7 ^1 |

      2 ?' |. w" \- M. b3 rggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+5 \: @5 O9 N0 ^; p# [( A: X
        scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
      7 n8 ?1 ?! }$ O; h0 r7 n  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+7 J. N! k8 L, P  p, }: t# V8 P
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      ; z4 r8 B$ U% o, m; k  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      3 w( z& V" ~! p  K& }& t        axis.title.x = element_blank(),
      % Z: |9 _; }; x8 q        axis.title.y = element_text(size=15),
      / r, Y$ M: `4 m7 R, @0 x) b        axis.text.x = element_text(angle = 90,size=15),, F" [9 v- c* g' \$ }: U
              axis.text.y = element_text(size=15),5 V4 @# G7 l# W+ }- S5 I. A
              legend.title=element_blank(),& h4 j/ J4 h; U" V. a
              legend.text=element_text(size=15))
      ( r. T  J2 t# _0 X
      : A& N$ @& q4 g, t3 x0 t
                                   # R6 N) P* Q. h5 L
      2. 美国新增病例变化趋势7 I) x5 a8 Q1 {+ Q: s% x
      us<-new_data[new_data$`Country/Region`=='United States',]3 n; d4 W, Y# f/ w+ j& {
      us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')8 T1 e" J4 g/ n8 U7 P! I2 u
      us_increase$date<-as.Date(us_increase$date)
      * ?- c2 w4 z4 Z9 Pggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+5 p. `: ^8 B* l" C4 N% Q# Z
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      ! ~0 q* r" x0 G/ P7 K! Z  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+! F4 l& o4 M5 w6 r6 L. _1 q+ B
        theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      ! Q% |( {! S. c; p9 H" _  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      ; s9 j6 s& y/ h$ W. F8 h! u- R        axis.title.x = element_blank(),
      ' M5 ]3 {# J4 b3 X" ^" T        axis.title.y = element_text(size=15),
      4 A2 Z5 `1 M/ D2 T& n- ]        axis.text.x = element_text(angle = 90,size=15),
      $ y" o: Q2 b5 A5 Q% O: D        axis.text.y = element_text(size=15),' [2 T* A. [6 _9 d
              legend.title=element_blank(),/ a7 {3 B  m' v3 D) j' c5 z7 J
              legend.text=element_text(size=15))' b( f; O6 @, _# d& t  e2 ^# w" u

      4 O) v( I9 @" a" F, ^
      9 J  q( K7 i' g8 Y7 Y; \7 C. V1 O' R3. 全球新增病例变化趋势- l7 k/ L- R( k6 E% t1 V
      total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      4 y5 x! z) H% \; D- w; E/ f* o: T/ Lcolnames(total_increase)<-'increase_patient'
      6 U% s4 F/ Y  r* x. b& ntotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")3 ^) t* Y& z& N+ n& c
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      0 c: V, p0 k( m* x, x/ ~( `( V+ x  scale_x_date(date_breaks = "14 days")+; s0 E* m7 ~% a
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+6 s" q1 Y2 p, e
        theme_economist()+6 s; t9 W/ J& U1 i
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      3 w7 ^  c, T4 R6 K- `                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),8 V5 i, I# S& m) X6 ]
                           labels=c("0","20万","40万","60万","80万"))+1 [0 P% \. Q% b  Y0 W* n
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 S" {3 m4 x9 N- A
              axis.title.x = element_blank(),
      4 v# F. O8 G: |' \. T0 `- C" B( c        axis.title.y = element_text(size=15),
      ) O( C3 k' f# F; z        axis.text.x = element_text(angle = 90,size=15),: L' Z; o7 f$ q1 ^  x2 w
              axis.text.y = element_text(size=15),
      $ Z; j/ ]# y8 f7 f        legend.title=element_blank(),
      ) D7 w* E% e* U& G& j8 G: M        legend.text=element_text(size=15))- g# Z! ^2 ?9 F: s! c; j0 y
      ( I& n  ]0 ~; x' b
      ; m. |9 S0 A+ M" X
      三、新增确诊病例全球地理分布7 V8 w5 f8 l7 M( j
      mapworld<-borders("world",colour = "gray50",fill="white")
      ! ]! g. R7 I7 X" O* U7 zggplot()+mapworld+ylim(-60,90)+
      4 n$ N* }5 A& a; A" ^9 {' {- R- L  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      ; l0 h: ]* @6 ^1 ~  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      , m9 V$ U9 l4 [* F  theme_grey(base_size = 15)+
        V! n/ h8 T. l0 j0 J  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      1 ^: D# R6 d3 x8 E% q6 z6 C0 y        legend.title=element_blank())8 w9 h( O7 N- G& w6 h4 F& J

      5 l8 R) U9 U7 U1 H4 Lggplot()+mapworld+ylim(-60,90)+! b2 W9 N/ ~, X
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+2 Y( q. V+ i( @; k1 d3 h
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
      3 P$ r1 H* E$ @9 \+ U; n; b, a  theme_grey(base_size = 15)+1 x% `% C3 R! E0 H/ u- Z
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      % E" b! Y; h6 J( @2 i' E        legend.title=element_blank())  e% d, m2 ^; P( N
      $ L+ w8 {; i4 B8 e2 }

      ( X" s' f3 m& y# i& [) }* Y四、累计确诊病例动态变化图

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


        j) q' P, ?+ v- \

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


      : d, I! q7 e& s4 X- F2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      + {; s* N5 P/ B9 u6 m% u: ^cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')" D; Q6 B' x" W$ i4 i4 ^" c
      colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")# J6 R: I6 X* }; I
      five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))% G  o# U0 m7 P) `: }. d0 f
      five_country$date<-as.Date(five_country$date)# t! I( p5 _$ H- e( l6 E

      : E* F6 T1 }) x% k7 r% h4 A2 Wggplot(five_country,
      3 ?. v- @$ q) X: t2 Q            aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  
      : ^8 ^# |! u6 ^* D: v7 G  geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  $ {; U0 V9 F5 q1 z/ s# t  O+ o" r
        geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  . T2 ]7 N1 G9 `# \
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板, m% k: D% F3 R; U$ q
        theme(legend.position="none",
      0 a% o6 Y* V2 s# n* `: ?# z! C2 p( [        panel.background=element_rect(fill='transparent'),
      $ I0 q; k+ b7 j  W, i. q        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
      - p2 v& u- [% B, t" ~9 }        panel.grid =element_blank(),  #删除网格线) [1 g. w! y' k! L7 q8 {
              axis.text = element_blank(),  #删除刻度标签5 T/ }  d9 q& G6 k0 b
              axis.ticks = element_blank(),  #删除刻度线, Q- W1 L5 I8 U, k) U4 ]! e
        )+
      : G7 Y5 k# Y( I+ V; ]- X( |( o  coord_flip()+  0 X0 x4 ?# K/ J
        transition_manual(frames=date) +  #动态呈现
      5 Q" b6 A6 _! F3 a* `& j  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  * Y8 x) P# G: _6 @3 `2 o! V5 l
        theme(axis.title.x = element_text(size=15))+
      6 D8 v- G3 t. i# @, Y  ease_aes('linear')  
      ( V: b& l5 x6 @& |. `# x4 O, P5 N& T/ w2 K$ R
      anim_save(filename = "五国累计确诊病例增长动态图.gif")
      " S0 U2 q: T" f9 |, y$ w% X
      4 l: u7 ^( N1 \" e, m
      * n$ l' E: T* k6 K! t! J- R
      " p" N- [6 t* l' P: l

    0 H/ v; ?, w$ ?2 n6 L4 H& j' J, M9 l4 q+ U% h% n4 z; D3 n' l6 o; o
    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-7-29 01:00 , Processed in 0.445567 second(s), 50 queries .

    回顶部