- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化! d' {* j3 x+ z
目录
2 L( S' W) B% b6 [0 N) Y) Q( P( J一、数据介绍及预处理
2 Q7 }9 ?/ w- C6 b3 e( T. t, {二、新增确诊病例变化趋势
! V+ p5 z/ |/ s9 K$ i三、新增确诊病例全球地理分布, n2 [5 m8 F# y6 y; X" ~
四、累计确诊病例动态变化图4 d" ]9 d& O7 g' [' k
一、数据介绍及预处理4 S( e# a: e! S5 y7 U
1. 基本字段介绍
8 K6 v4 v2 \) w ^% S" h) l
7 p, v0 i& o& r9 g字段名 含义
# i; F7 r5 f9 ], WProvince/State 省/州
2 @0 ?3 I, S! ~: d$ dCountry/Region 国家/地区- B- L r; H" t6 V; y0 C
Lat 纬度8 [2 T3 B8 ?& T' W" W
Long 经度) Z3 O, S& w( d8 _8 {
1/22/20-12/7/20 每日累计确诊病例3 @/ `0 l+ M; o5 q( \! Q9 d
D# g5 p" U' s, X! \( J: h; k![]()
) O9 P( p- p; H# Z3 I6 }
! e5 H0 D [. |( F/ f8 p2. 数据预处理 - 整理某些国家的名称,如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)]
. m U3 v; K# K; ^ G; i) F[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)]% H6 K( K7 F( C [ G+ u0 O
[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)]
9 e z+ G& B7 a$ I[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 b5 `# _0 m% {! K9 y
[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例- }- {7 L V" V: v* b# T" a( r
inspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])& r: Y. `: n5 G. V, p' d
increase_data<-inspect_data-inspect_lag_data5 H8 K: K# o: O# J( c
8 I0 \6 c( H8 @3 L! K0 ^; H! Q4 @
#合并数据,new_data为新增确诊人数数据
3 @+ d9 w# |% l, |1 z* _( @# O. lnew_data<-cbind(information_data,increase_data)
5 a% z! a3 I1 b, A, n! `6 w) s Q
# s& c! B+ ~1 T/ Q7 L1. 中国新增确诊病例变化趋势! D! [. f( e4 {0 k6 S
#合并所有省份新增确诊人数
0 Y" n: X. S/ h# Cchina<-new_data[new_data$`Country/Region`=='China',]
$ Z' r% h: @0 P& N. F w0 ~china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))0 s$ {; |+ V0 a y4 P/ e4 o. B
colnames(china_increase)<-'increase_patient'
$ l7 A" V+ w9 Q2 Jchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")/ Q" \3 O, U" y" k0 _7 g
) h$ F! {, h& M. W
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
( i. i; G- M/ Q: R scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
/ f4 X' L7 A8 b5 m labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+" O$ v* ~& z" |2 M
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
. I; p1 `7 g/ v- ^* Y, m theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
7 ^6 S, O% f" ~% A2 S" S axis.title.x = element_blank(),
0 o2 `0 L9 A7 o& Q3 Q( y axis.title.y = element_text(size=15),
8 m1 L7 P4 E! D. J6 U+ P axis.text.x = element_text(angle = 90,size=15),
7 c8 ? I: C, `- O$ \( { axis.text.y = element_text(size=15),
2 ~: f) Z _5 c: a3 j3 W* F& h# Q legend.title=element_blank(),
: ~4 K$ k( `0 W G legend.text=element_text(size=15))
$ L+ h' ~! f" M, k4 C0 \1 Q1 p- j" K7 Y) k2 M; L Q: U
) b3 q" Z4 O Y% W0 c# r
2. 美国新增病例变化趋势6 w4 n% {/ ?, K+ {( `8 ]( Q& _
us<-new_data[new_data$`Country/Region`=='United States',]- w6 A3 W! f* K+ D' Z) ~5 [
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')4 g. D) n; c7 [; ^1 q& Y% m3 i1 X+ I
us_increase$date<-as.Date(us_increase$date)3 J6 |& h! G! Q/ y& U9 }# \
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+6 D6 A. _& s% L# g
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
: [% C: E4 e8 y labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
2 y( u4 e" {0 U, `6 N9 E7 E9 X theme_economist()+ #使用经济学人绘图样(式ggthemes包). A/ d( o- w2 Q) ^! s
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) |, K/ L6 y* B
axis.title.x = element_blank(), S3 k* R$ v9 N) u/ ~
axis.title.y = element_text(size=15),
/ c' s1 e# t2 E# }3 \9 e axis.text.x = element_text(angle = 90,size=15),
) K% o t. B! l, q8 U% m0 M. ~( U3 n( W axis.text.y = element_text(size=15),
4 a3 }1 O0 T& E3 X3 c legend.title=element_blank(),- F5 z! V3 S/ S3 f" F9 z& ]9 o
legend.text=element_text(size=15))
; Q$ t1 I1 l' C: D! d5 H' t8 c
r) p' a8 e* ]7 u& r+ v) m+ M ( ^% j& y/ y1 Z$ T3 l( \
3. 全球新增病例变化趋势' {+ n7 S# X7 z+ J5 @
total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
$ m- _+ P' T7 S" Y7 F0 U' O0 fcolnames(total_increase)<-'increase_patient') q. Q/ _8 `% P. w0 X6 G: p4 i* Q8 R
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
% f4 Y: y9 {+ ?9 j; Hggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+0 j6 w3 T1 s) Z) s' u) _" `- Q+ L
scale_x_date(date_breaks = "14 days")+" V" r& f9 w9 z
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+8 D# ~& }5 y, d0 @
theme_economist()+
' I- R+ [$ {! M7 R0 ^ scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签! W# n. u# S+ T
breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),1 x' R( K6 S. h0 }
labels=c("0","20万","40万","60万","80万"))+$ v }! D/ c3 `$ m) I
theme(plot.title = element_text(face="plain",size=15,hjust=0.5), X% g: M# [' ]& s0 ~
axis.title.x = element_blank(),$ z* s! O+ c: T6 W/ j0 z7 V& Z
axis.title.y = element_text(size=15),( u$ o6 ^; H9 O( s( @' r9 x
axis.text.x = element_text(angle = 90,size=15),3 r% t0 ?4 Z) y2 Y
axis.text.y = element_text(size=15),
" G* C1 C& X5 q- n- S legend.title=element_blank(),
" u$ F: j J# a2 W4 _ legend.text=element_text(size=15))# t1 r$ \7 Y8 }2 @. A) J
! ]/ ?7 Y3 r9 F2 R h+ k# k2 b
# [9 {! j0 W) s* V4 |3 B
三、新增确诊病例全球地理分布0 l! D2 n2 D8 }5 c
mapworld<-borders("world",colour = "gray50",fill="white")
9 H. n" ~: y- J% q \ggplot()+mapworld+ylim(-60,90)+; w9 K: u' _; b4 k
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
' f- d0 ]2 a) ^1 g5 V scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
& x1 n b Q+ f% |0 V theme_grey(base_size = 15)+
\' t3 z# C. d; ?4 K3 R& u theme(plot.title=element_text(face="plain",size=15,hjust=0.5),5 |7 S, Q5 n! g( j3 d
legend.title=element_blank())
; K1 g4 H! M" Q! |1 a
9 E5 v( U1 S: V+ o! T1 t) ? a3 n" y# @ggplot()+mapworld+ylim(-60,90)+
8 M( A/ D2 h1 |9 h) F geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
7 D: q' e% C) p1 _ scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
* ?8 z: |# g- t8 K4 a3 ^1 G8 H theme_grey(base_size = 15)+6 H- ^8 o" E2 v. z
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
( g3 N% I7 Q; _+ ?. p! r6 s legend.title=element_blank())
1 o! J" H$ f. V' K. a0 w! }* F8 F9 B- {. p' S7 N
![]() 6 H: s3 b3 r6 z$ ~4 N$ C) ?
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家 3 y7 o( N2 g3 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)) , K3 y6 M3 @: a2 m% X3 e7 H4 ^
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
! H+ \2 H( {, C/ S& n; bcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')5 y- i! y0 Y' b
colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
2 s. U: X7 O2 O+ k: v3 h4 cfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))$ k7 Q0 M3 q+ F% S7 n, z
five_country$date<-as.Date(five_country$date)
3 U! d* ]8 c6 P2 s( q7 ~" f5 x. R+ k- b3 J" Z6 U' e- \1 }
ggplot(five_country, 0 i Q/ O1 g9 P# z$ {) l k/ O
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + ' B! ?1 {- H T0 d' P
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
) o6 q; X( }. E4 `6 W geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ : H! Z0 M& S( }& w5 A: G
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板! i8 h! C" C% w. J
theme(legend.position="none",: A0 t0 j" M* O& u7 s h
panel.background=element_rect(fill='transparent'), Z/ y0 Q* W/ A6 ]7 ?4 d9 x
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),6 [: @2 Y3 D, d1 R. P2 D- P
panel.grid =element_blank(), #删除网格线* t% W. I+ P' z' t4 m
axis.text = element_blank(), #删除刻度标签
. i+ M8 P5 O3 Z5 }( y2 X axis.ticks = element_blank(), #删除刻度线
9 l& P+ y6 I8 l a" D. A6 g )+
. c2 h1 O) M# Y5 _( ~: S coord_flip()+ 1 B& D1 c. H4 d& m: j U4 e" m0 K2 i
transition_manual(frames=date) + #动态呈现
: s* s0 w' X7 p C4 I labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+ 1 i* S7 V% ^4 a1 B% \
theme(axis.title.x = element_text(size=15))+
( q0 ~: M" e) V9 Z5 V ease_aes('linear') + |9 v. S$ i9 R, G4 W
: N2 \4 V, {; B+ z3 `( ]. v$ ?$ L4 K
anim_save(filename = "五国累计确诊病例增长动态图.gif")( z1 L9 T. ?2 B
7 c9 i1 u) o/ N9 A3 i/ |0 D![]()
1 `) d" F+ Z2 k, H5 s& [9 I' _" o; @, {2 L, ~+ M) h
3 l- V9 G5 `, o1 ?
# m& P7 L2 U( o% d b! e, y |
zan
|