QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化# ]0 J* E" J5 r# {7 i( H& ?1 |5 a% [
    目录
    , I" ~. u) A( C& b6 g( q. R. u一、数据介绍及预处理5 H  g" r' P7 `' l6 d& Y/ r7 q
    二、新增确诊病例变化趋势
    . h; ^4 t) l+ T三、新增确诊病例全球地理分布
    / X4 P2 ]2 |- g( |8 L" c四、累计确诊病例动态变化图3 l( j9 ]1 f- C, c" A7 N
    一、数据介绍及预处理
    2 [" D7 E& l( Y2 S8 _, d1. 基本字段介绍
    - {9 s" k; g3 d+ C( ~# V& g& r3 N8 U5 J0 L, x/ ~7 I% S
    字段名        含义
    ) |9 y5 U* L. H3 W1 c0 T2 VProvince/State        省/州
    8 W, n# t7 J5 j$ R+ M# OCountry/Region        国家/地区
    : a1 k% ]. L7 O8 R' U8 V- QLat        纬度
    5 G: z( ]# y9 A, \0 y9 |Long        经度* g/ N9 P. T# L6 Y3 w' H- N
    1/22/20-12/7/20        每日累计确诊病例! S% z$ \4 F- o, s3 b
    6 h  u8 m" }9 |5 Q7 b

    + \  _1 N5 a% f" @- H, o5 z. x, R; k
    + U7 ?# T% d4 i8 q9 F

    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 ~2 k4 i: K' t  l- `
      [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  h  N+ ]- ^! Y* \
      [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)]
      , x# I* p& U- u% V
      [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 e  g; e/ M' d& j
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例1 f/ `0 g1 v# h, p8 i; Q/ ]
      inspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)]), u! [/ `7 J+ G5 `! h: b+ k3 P  x9 N1 d
      increase_data<-inspect_data-inspect_lag_data( s1 y7 w! V. r" W' ~' M+ l2 r
      2 F0 Z% Q3 S0 k+ `$ S1 N6 X9 H
      #合并数据,new_data为新增确诊人数数据  `$ b7 J* e! I" y+ y! I
      new_data<-cbind(information_data,increase_data)& v* m- B( O5 [  C+ a* l( \9 g0 ~- k
      8 S" @1 Z5 M4 I3 R9 j% T
      1. 中国新增确诊病例变化趋势
      , e- W0 S. J% m& w+ p9 g#合并所有省份新增确诊人数/ `7 z* J, D# E, N" W
      china<-new_data[new_data$`Country/Region`=='China',]
      ' C1 q5 Z7 ^: j# Schina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))0 e6 w- m. f" ~( t! @: S/ c
      colnames(china_increase)<-'increase_patient'7 [* S) i' B& y8 k  Y3 Y& y3 d0 s0 u
      china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      ; t( h8 [6 R4 Z3 \& n1 w( L+ a' v# b6 t" o# G% k. D
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+( L# g  \/ a  w% X
        scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)& ^# s; U. S. Q8 m3 B' k
        labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+0 w0 }$ P3 S+ h& s. ]7 C
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      . J# q5 u, W$ u3 U4 {4 c, U) t  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      0 c7 z  B9 Y8 v) h& x/ ~* Q        axis.title.x = element_blank(),; X& i+ }, @" \/ {% P  Q
              axis.title.y = element_text(size=15),
      " X: J- u) P  v7 ]7 X6 j+ d        axis.text.x = element_text(angle = 90,size=15),
      $ h, l; [: }# c        axis.text.y = element_text(size=15),5 J. y6 t. z3 {" U$ F2 x+ w
              legend.title=element_blank(),
      0 f" x; [3 z6 E2 L8 M& D/ ~. I: ]        legend.text=element_text(size=15))6 v7 c4 P, @' q2 I

      9 f- r8 ^7 y+ g1 O- Y                             
      ! }5 o6 c) N0 v, R4 c2. 美国新增病例变化趋势& V  N# `4 @/ N0 A, D
      us<-new_data[new_data$`Country/Region`=='United States',]
      # {8 ?: l' ]+ S/ O! W# b. i5 hus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')& {0 j, K7 g8 v2 ~
      us_increase$date<-as.Date(us_increase$date)* Q& k0 }5 Z; y4 S" Q
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+* H7 |6 r/ u3 u7 g
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      , L, Q0 d( w+ W) g  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+! U5 A; j! [, b  U7 Z! g4 @
        theme_economist()+   #使用经济学人绘图样(式ggthemes包)
      6 k4 C8 `  v! s" _0 _  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      1 `0 E9 B2 ?* m        axis.title.x = element_blank(),* G! o' n1 h0 k
              axis.title.y = element_text(size=15),
      " g; v+ p+ C& L1 Q        axis.text.x = element_text(angle = 90,size=15),  ~+ o+ B: s* a. w. K$ F
              axis.text.y = element_text(size=15),
      . Z2 a; a8 V% F5 M4 e/ P1 \# g5 H: A3 v        legend.title=element_blank(),
      ' x3 c$ K" m4 f+ B+ D; d        legend.text=element_text(size=15))8 B# Q$ @( F4 s# z* w- {. J

      ' |) H5 y* Z: d# q6 ~# k$ r5 }+ U- _7 ~' O; F% i
      3. 全球新增病例变化趋势
      ; Y! W, u3 p- K6 E; ~5 Vtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      , B" G3 e; y* ^$ P8 f; icolnames(total_increase)<-'increase_patient', v% ?# E, {7 E  @/ I) y; n
      total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
      ( o  y* j( M7 [6 sggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      0 m" W6 y9 k( ^; W( l8 M* H/ }  scale_x_date(date_breaks = "14 days")+
      % g* }- i# B$ ]( w. S  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
      2 [7 @* N& E  {2 {  theme_economist()+
      + P' }3 F7 L8 o; M/ `  scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签' _8 V! f6 m' W3 [( Y
                           breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      ! a2 E1 f5 ]% k% m                     labels=c("0","20万","40万","60万","80万"))+
      % I: x5 F$ i9 ^2 n' D" d5 F  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      . U0 L  ?, K# f0 I3 J9 a9 O        axis.title.x = element_blank(),; L& ~/ z: ~8 D3 t9 ]  G. f. j: N
              axis.title.y = element_text(size=15),8 m) |: a6 p( C; \
              axis.text.x = element_text(angle = 90,size=15),% E8 ~% j# |6 h
              axis.text.y = element_text(size=15),  N9 p( [) {2 L# _0 I+ y3 w9 i' }
              legend.title=element_blank(),! j8 L) ?& |" F: e+ I$ J2 r
              legend.text=element_text(size=15))
      ( B/ o' o8 P  e( _

      $ o- z% P4 q. @! b% S5 S! K7 }" }+ E9 C$ U
      三、新增确诊病例全球地理分布+ Q: g1 D) `7 W; |3 c
      mapworld<-borders("world",colour = "gray50",fill="white")
      / t; T: h& ~4 N% C9 o8 P+ eggplot()+mapworld+ylim(-60,90)+
      3 s: {! I- i, ?$ I( F8 v6 W  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+8 }3 b2 G9 b! E3 l
        scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+. @& d) `0 W5 P5 v2 a; a
        theme_grey(base_size = 15)+) G7 J7 R& E6 f
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      7 L. }1 p5 g. s( [6 ^        legend.title=element_blank())
      . @1 N6 `) e+ Y
      - M/ t' C% ^+ _; x' _6 P, wggplot()+mapworld+ylim(-60,90)+4 H5 I) j; p; a2 k. Y
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+# j. M: [5 O6 B" n  c
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+& X& B. P9 x/ d
        theme_grey(base_size = 15)+- [' r# b2 b) G' R
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      4 A: r% F) P% s        legend.title=element_blank())* B& }/ k" i  _* l3 T$ p, y3 J. c
      % T6 [0 L' v  L2 H* P- ]# J

        q( a& d6 @3 j& y. i+ P: |四、累计确诊病例动态变化图

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


      ( a9 h5 P: l! E4 G

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

      9 x/ W* w* ?% X" M* Q
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      ) x" A) W8 y3 o  ncum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')* X4 W! H+ X( R3 k9 ?
      colnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")( G, X" U7 o9 X$ Q. O5 ]! f
      five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
      $ ]' b3 L/ c2 Dfive_country$date<-as.Date(five_country$date)4 ~2 r; }# e$ m
      " B% [8 B5 D) g' W, Z+ p4 p& U: e
      ggplot(five_country, * ?, E, {! C3 W0 \8 W
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  
      7 |9 Y3 I7 v0 j" ~9 R  geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  9 E% S$ l; p+ m
        geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  & `8 n* [8 j& M1 H
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板
      6 t/ Z" X9 z- Y# K0 Z: V) n  theme(legend.position="none",$ L1 P! F6 y, y" r/ a
              panel.background=element_rect(fill='transparent'),3 b  _$ b5 A3 C/ |" [& N$ Z
              axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),% r8 v% @# t1 Y" W% U$ Q4 n# J- T! Z
              panel.grid =element_blank(),  #删除网格线3 x# r& g4 `# o& L9 a3 k. g
              axis.text = element_blank(),  #删除刻度标签
      5 L' K; z8 n8 t        axis.ticks = element_blank(),  #删除刻度线
      ; u* B# W6 r* D* c4 Y- Y  )+5 r4 ~$ d1 y9 a1 \/ j. s1 u
        coord_flip()+  
      $ A+ {$ ]' T" ]* K8 K: |  transition_manual(frames=date) +  #动态呈现
      " W" X' X/ I/ X! b/ o  labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  $ l+ P) N$ w, S4 |+ s, n  L
        theme(axis.title.x = element_text(size=15))+. m7 f8 B9 F$ V( \
        ease_aes('linear')  : t- S' F; b& s7 X( S
      6 z, Y2 ?) h3 \4 Z1 \
      anim_save(filename = "五国累计确诊病例增长动态图.gif")
      4 s4 f) E6 Q  H

      ; O8 _1 h& v6 \9 U- Z2 k; E* ?1 w, g: r: q1 o* X* A4 ~

      6 q$ O; k7 V: r  Z
    9 C( z& I/ d+ K* B

    " W& e; i1 `* R5 `$ {9 U
    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-29 04:22 , Processed in 0.319875 second(s), 50 queries .

    回顶部