QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-28 20:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                   可视化实例基于R语言的全球疫情可视化
    " e9 ]* Z$ F% h% q目录7 f! C3 z( r# J6 {% v
    一、数据介绍及预处理
    $ C9 ?! \5 e0 k: f; _二、新增确诊病例变化趋势
    ; a9 b6 ]9 f; v  @三、新增确诊病例全球地理分布( I3 {0 Z3 A- @( V5 X5 }" N
    四、累计确诊病例动态变化图
    & l! U7 ^9 Z5 E* n- ?$ ^$ }一、数据介绍及预处理
    5 b9 t2 s: B8 N( w1. 基本字段介绍% G2 ]6 e, V) d, A6 [; o5 _

    & F$ H2 S" Z" m字段名        含义
    5 H" L  Q8 N+ j* e! B: ?1 |Province/State        省/州
    # j0 L% o  e5 Q: oCountry/Region        国家/地区% b, O9 l& q/ X
    Lat        纬度: ]4 C8 I7 z& g! g2 s+ l: |2 J4 E
    Long        经度) M; f) h- @/ x0 b0 D8 W8 ^7 ~7 P, o
    1/22/20-12/7/20        每日累计确诊病例, h7 c: O; b5 |8 B) S& ], n6 \

    0 ?  J5 U* k3 d: r4 G1 b1 p3 |) f2 u5 k

    - G7 G2 @0 r, ]$ B, y& a- ^

    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)]
      ; W0 j2 ]; F) v8 g( t5 c' M
      [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)]) ]4 |# c6 \4 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)]
      ! Q' b6 \7 l; {3 u
      [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)]
      6 u* W( s7 F" o# L
      [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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
      ; I1 z* c" c3 ^4 H( G- kinspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])
      5 c) O1 k, @7 T0 F. Kincrease_data<-inspect_data-inspect_lag_data, V4 T% S* P+ F1 B$ M! h. f

      * u% z& \! \: b. T#合并数据,new_data为新增确诊人数数据
      3 S% P) @+ L+ J7 U, Z* \5 Znew_data<-cbind(information_data,increase_data)
      - D' D1 A7 C  X: |5 b" F# G( `1 {2 a
      1. 中国新增确诊病例变化趋势! u. h  Z$ I; Z4 g$ v$ I9 ^( t
      #合并所有省份新增确诊人数
      ! U0 `/ j( {+ Y9 A5 o' ~china<-new_data[new_data$`Country/Region`=='China',]0 d8 w* a4 w- z9 r
      china_increase<-data.frame(apply(china[,-c(1:4)],2,sum)). f. _( |0 f7 m
      colnames(china_increase)<-'increase_patient'
      - X% @% f/ r; K. r( D( l0 {5 Z+ `china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
      & P' ?5 m3 [' e4 N$ ]! }8 M6 L$ s8 s2 h' r
      ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+' j  e1 `- f8 b  c9 L( s* y# r& X" J
        scale_x_date(date_breaks = "14 days")+  #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
      + ^$ @4 H; u8 ~9 u5 L- q5 z7 t  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+' W" O4 @+ h9 w3 R0 n. W2 G
        theme_economist()+  #使用经济学人绘图样(式ggthemes包)
      6 h9 g) p) u9 F3 c3 o0 Y' R2 w  theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      ( H& C7 e  f) R  `/ c        axis.title.x = element_blank(),
      2 V; P( a; A& ^9 U2 C+ s& u$ j        axis.title.y = element_text(size=15),5 G9 S7 L# j0 o7 \8 Q
              axis.text.x = element_text(angle = 90,size=15),
      7 T7 y. k7 x. J0 H3 e. g        axis.text.y = element_text(size=15),* ]$ R. H! o6 j* s1 L
              legend.title=element_blank(),
      ! h& Y2 n$ m% m' b$ \9 @        legend.text=element_text(size=15))3 f; q3 g9 u$ J1 u+ g5 s
      9 W( s' q5 s4 p8 z" D) W
                                   - k2 h# N  _- L# v" Q
      2. 美国新增病例变化趋势
      6 ]9 ?3 N# l) A# ?- A7 x0 `6 Q3 jus<-new_data[new_data$`Country/Region`=='United States',]
      % x/ L$ @% c& M2 a3 u1 k) Nus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      5 X( n. J- l& e3 Y5 Sus_increase$date<-as.Date(us_increase$date)( D! B6 Y* q9 f+ O3 r0 D
      ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+4 x0 ?4 e! u) [/ W5 M6 `
        scale_x_date(date_breaks = "14 days")+   #设置横轴日期间隔为14天
      4 q" N1 p( ^7 l4 k# q6 Y. j- `6 E  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
      . \% u) F+ B- [/ m9 H  f  theme_economist()+   #使用经济学人绘图样(式ggthemes包). V3 C8 \. H% d- t& i+ y
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      & A- m3 R. z+ i2 [+ k% Q% t        axis.title.x = element_blank(),
      0 L& M; I4 @0 j& {9 Q( U' \        axis.title.y = element_text(size=15),
      , _% G6 ~/ G0 \0 r9 @        axis.text.x = element_text(angle = 90,size=15),0 n& @9 J' a1 }4 b& G
              axis.text.y = element_text(size=15),+ P3 w% O. ?5 z) c! j
              legend.title=element_blank(),
      " o( m+ q: c- Q# I8 y& b        legend.text=element_text(size=15))
      : z: J/ S- v5 U$ a- F  A
      ( |  w" Q8 e) Z& H3 X8 a

      1 z- r* u; ~& W" |7 V1 H" _3. 全球新增病例变化趋势
      ( Z6 V8 `0 X& gtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
      ; U3 m" c  k7 G$ rcolnames(total_increase)<-'increase_patient'
      ; N1 C; }+ h% Z) |total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")- w# _+ ?1 J) c/ C$ J! d
      ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
      2 K3 ~4 F4 x. |0 u$ a" I& h# X  scale_x_date(date_breaks = "14 days")+
      $ D  U- h% O, }( O  labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
      % D* D* z% N4 {- @8 O  theme_economist()+) n& u$ T/ w# b6 ~2 `9 ~9 _
        scale_y_continuous(limits=c(0,8*10^5),      #考虑数字过大,以文本形式标注y轴标签
      0 K7 y0 Z  c" C                     breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
      ' }1 t8 k6 G; }/ ]% h                     labels=c("0","20万","40万","60万","80万"))+* y) M5 ?% N, {+ Q4 j# ~! W
        theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
      * U: M& J3 @8 P. H        axis.title.x = element_blank(),# u+ w) H* t+ \0 o/ L9 l. L
              axis.title.y = element_text(size=15),; N1 [% T! D1 J- P) w2 [
              axis.text.x = element_text(angle = 90,size=15),& T; r* a8 I* S- b
              axis.text.y = element_text(size=15),
      0 b/ T' l; d, D- |        legend.title=element_blank(),
      4 i4 D+ E* K% y: l) R        legend.text=element_text(size=15))1 x7 c2 ?) Q  ?( k9 h: x2 i
      , I6 h$ B$ t/ q9 e# j

      ) U' u6 z9 _4 Y. u三、新增确诊病例全球地理分布
      " H4 q& Q7 @+ p+ b0 ]( {  q" Hmapworld<-borders("world",colour = "gray50",fill="white")
      - H' D3 d0 y; Tggplot()+mapworld+ylim(-60,90)+
      , f8 t  d- c& X( g' n% L( N  geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
      + `' [! s5 P( ?# m$ v  scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
      ( b0 m( M1 C; y8 W  theme_grey(base_size = 15)+
      0 S4 C7 o* o0 a8 s4 ^7 T1 X  theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
      & ^6 P/ }4 v/ N( r4 z% M. ~        legend.title=element_blank())* c5 T4 X0 o: b: \- l# f
      9 B; ^8 E& d3 o: j5 t; o* h/ A
      ggplot()+mapworld+ylim(-60,90)+; _; o# G9 \3 _1 g
        geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+" f/ G0 u5 M6 O1 J3 h
        scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+" _: j* G5 O$ I
        theme_grey(base_size = 15)+( r* |# ^" i5 \8 V& V  g5 z" O
        theme(plot.title=element_text(face="plain",size=15,hjust=0.5),6 b( I; E- D$ g
              legend.title=element_blank())
      1 g& ]- \( a7 C  C2 @2 m; `5 P' Q9 [5 {

      5 [# d% ]% ?  y3 @0 o四、累计确诊病例动态变化图

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


      0 S2 x& [* \6 v7 Y& I

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

      * M( N( `3 n" O1 H9 ~. U
      2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
      & y; b2 c  n9 i- @4 v2 jcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
      5 r9 @+ {) O( L! C% @8 lcolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
      ' g3 ]4 Y, L( \, H; Dfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
      : g  @; C% p) K0 h7 v' Wfive_country$date<-as.Date(five_country$date)- w. r/ r6 i: l  Q
      4 F) Z+ j& j: c/ H# @
      ggplot(five_country, ! y3 f+ J$ ?6 |$ N) P! _' r8 x
                  aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +  ! D, ?, J; C( m. N/ _8 i
        geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +  
      , B* G, @9 ?3 r  t  geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+  ! B- F4 y- R' A
        scale_fill_brewer(palette='Set3')+  #使用Set3色系模板( e+ H) ]6 l& u2 m' G# \4 _
        theme(legend.position="none",
      1 U! e& v/ }9 K7 }: F3 F$ I3 P3 x) a* w        panel.background=element_rect(fill='transparent'),
      * ]5 }1 m& v& k1 j  b/ R        axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
      ) v4 [7 l$ K3 c- T        panel.grid =element_blank(),  #删除网格线
      , a: d: W0 m( a7 u% B* A+ X& F        axis.text = element_blank(),  #删除刻度标签
      * i3 U' m5 ^/ R8 J0 Q9 x# a        axis.ticks = element_blank(),  #删除刻度线3 m8 Q! b& O6 V
        )+' K% g& v: Z( a8 G. f! L
        coord_flip()+  $ W0 r, B3 y7 e: }% d0 y) Q9 ~
        transition_manual(frames=date) +  #动态呈现) X% a1 F5 K2 A% m4 f
        labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+  - ~6 o3 L2 Q# N+ c* D1 S' F( I! \
        theme(axis.title.x = element_text(size=15))+
      8 k0 F" T) G, ~) i- g+ V. p  ease_aes('linear')  ; k8 A6 O; e$ @  A' V- w9 c

      / W# Q, m* R' N: d$ Ranim_save(filename = "五国累计确诊病例增长动态图.gif")4 h4 ^. P7 J9 ~' p3 {. Z. I; j

      4 l" N8 b; l0 n; s/ A
      + m; D+ {: S5 [. }
      1 x1 ]2 l. ^' D/ e$ ~, _! Y

    % r9 `' J: C5 A& R; W, [8 K# q* A, l. f) @# o, l' w
    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-9-6 22:16 , Processed in 0.455781 second(s), 50 queries .

    回顶部