- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化' r$ O- \" p0 i2 p
目录
3 n4 l# Z& S) J. w* H8 R6 Y) L一、数据介绍及预处理) |. V) }. v+ F- P
二、新增确诊病例变化趋势
: Y" [6 B( k" d三、新增确诊病例全球地理分布
) S! k2 Z6 _9 V5 g四、累计确诊病例动态变化图5 C H8 ~$ n" N( m. {* j
一、数据介绍及预处理 I, ]- o0 ~3 B$ I2 M/ s
1. 基本字段介绍8 T( x' ]( U! R( Y9 o/ i
6 |1 E' f2 ?- n: v: ^2 s3 a. k1 k
字段名 含义5 {: Q U2 u2 E' U- A" m
Province/State 省/州
3 x7 ~( P2 l% X1 n% OCountry/Region 国家/地区
5 x3 R6 Z" P1 x8 ]* TLat 纬度
+ j( Y3 F! `) V& o2 E+ `Long 经度+ I; W- a# v/ }. g' z( ]5 N) E
1/22/20-12/7/20 每日累计确诊病例: B0 H, [7 m1 C. `
; i6 G% Q7 V/ b6 S5 n7 I3 P, e![]()
: u' Z2 H) G1 F7 w$ ?* n0 J3 _( l. K+ ^8 q+ w) B1 x1 @& E( l1 _
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)]
( o8 w* x5 z& q" a8 m: m% Q[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 \1 J8 _3 ]8 k* F$ A+ O5 S4 C[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)]) H! ]. z4 ?" k9 H
[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)]
- U3 r8 I) @9 h* r9 L. s* l) S[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
' g4 w% ~/ c. oinspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])
3 F* |/ i3 p: S( b* bincrease_data<-inspect_data-inspect_lag_data' \4 n' [: A% u' a! ]( U
; q$ Y0 O8 u9 Z# \; `7 l4 L5 w#合并数据,new_data为新增确诊人数数据. h; r6 s; @) t8 {9 ]; d6 p
new_data<-cbind(information_data,increase_data)
% R8 h1 _% ~" Q1 h+ A% X" X
7 O1 l. @: [) k& J. d1. 中国新增确诊病例变化趋势: }7 z! V j$ c {
#合并所有省份新增确诊人数
6 w7 F; e4 _ _% r1 ]china<-new_data[new_data$`Country/Region`=='China',]$ h0 E+ ~1 c; E% Y
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
' |8 a l# J2 N7 z% n+ \' `colnames(china_increase)<-'increase_patient'' A( s/ W9 n8 K1 ]
china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
- z" e, y& R6 B* S1 d+ @+ A
# G; `% C& M1 @0 F6 `ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
- R2 I) c8 l, @: k& R! a% \ scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)4 X3 `! S& G- k
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
7 v9 E( u; A5 K* @0 T2 u0 G- ~' z/ r theme_economist()+ #使用经济学人绘图样(式ggthemes包)
, l" { t4 m* M) X theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
, F& z) P7 v% v6 m( V1 u! ] axis.title.x = element_blank(),* v8 X6 {' }: T4 {$ o. m
axis.title.y = element_text(size=15),* f& M8 T; v0 [9 Z
axis.text.x = element_text(angle = 90,size=15),
( D# T/ b& o. R6 y$ ]# B+ a axis.text.y = element_text(size=15),
1 J }0 T b7 ]; |0 F/ K legend.title=element_blank()," J+ T$ \" u' w/ u8 I
legend.text=element_text(size=15))$ |! n1 U, ^# c. ]( g, A* D
) L4 z8 S7 N( k" y ![]()
* m: O! q. R; S4 Q2. 美国新增病例变化趋势
- p4 @, S8 @4 ]) M# B Qus<-new_data[new_data$`Country/Region`=='United States',], y) b' Y% u- z, a$ E
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
' @" F8 K& l2 R# U: h9 R* [us_increase$date<-as.Date(us_increase$date)
# Y9 c$ V4 F/ n/ k( j- Yggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+2 `# Z" N3 l8 \
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
& f4 f- {9 @" h, i1 T, Y. z/ S labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+. }4 B4 _# Y. R* o' W
theme_economist()+ #使用经济学人绘图样(式ggthemes包)1 E1 Y/ `. W' ^2 `
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
" w' N, T3 f/ |( ^0 L axis.title.x = element_blank(),
1 b( l0 J# I2 ~# x6 J. ? axis.title.y = element_text(size=15),! i5 O0 }8 C9 d1 z0 o! [
axis.text.x = element_text(angle = 90,size=15),0 K6 \2 ^. T* u" j8 q7 H. Y
axis.text.y = element_text(size=15),
& ^ I: i/ e. b7 | i legend.title=element_blank(),2 v9 z; s4 b4 |6 J
legend.text=element_text(size=15)) x; m7 Y g; S6 D6 M
5 m2 ]3 f" j9 D2 b1 s
![]()
+ N8 ]4 q, S: P$ q+ g9 i3. 全球新增病例变化趋势
5 X( ~; h6 m- z9 z1 rtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
3 \" r X$ h' n ~0 [4 Fcolnames(total_increase)<-'increase_patient'
6 ~) v$ z q9 L) H1 J3 Gtotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")1 @3 |( o0 |* O2 t! l$ h1 I
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
+ C7 k( E9 J6 S8 b: k scale_x_date(date_breaks = "14 days")+
s3 f3 W4 s2 R/ Z/ d: W8 n labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+$ k/ \# E& ?( }7 j! `
theme_economist()+ p" w2 ~+ b% ^" |! J
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签' w3 w; ~+ Q6 |+ ~* T* k
breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
3 b5 K, A3 p+ h6 ?' j* A! I% B labels=c("0","20万","40万","60万","80万"))+% A9 K: X, Z1 A' E
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) {" F) e& A. a( ?
axis.title.x = element_blank(),! L$ w% m/ x1 ~* A
axis.title.y = element_text(size=15),
3 D2 ?9 O7 G2 W+ \$ e' S/ C! G axis.text.x = element_text(angle = 90,size=15),5 N6 h J; e% I" |) J9 o
axis.text.y = element_text(size=15),) d, m/ y0 d. a. B) d! L {9 G9 h
legend.title=element_blank(),1 J; K/ S# V# V# a' u; v b
legend.text=element_text(size=15))
1 o; n2 a7 P5 I' U1 r. h- H5 R G- \
![]()
, T8 a* `! o0 W' R6 H& [三、新增确诊病例全球地理分布
1 {; \ a L3 h& O) h1 ^% imapworld<-borders("world",colour = "gray50",fill="white")
( e+ r+ h+ N/ n& ?2 i1 g$ g4 Kggplot()+mapworld+ylim(-60,90)+
. ?5 x) w- C9 j& G" X geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
. j& n. Q* J) C" m, [ scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+% |; ~/ k" k" W/ p1 s9 k" }
theme_grey(base_size = 15)+
' t: ^: P/ G) o' { theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
7 c. g7 s, V( N$ t/ | legend.title=element_blank())
' @% [/ N$ [# g' \/ h7 }
; F) q, `6 E, ]+ m- V' M9 S( nggplot()+mapworld+ylim(-60,90)+. D( g" v. r& b
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+' M5 [, g& f% r: Z7 [' V8 Q
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
) G. k5 Y& x# F5 { theme_grey(base_size = 15)+" F" W- u J' b9 {7 O7 Y2 J7 j/ L
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),1 H6 }9 c2 E: M9 Q6 T! a
legend.title=element_blank()); ^9 L% X& B1 n) @
: n- Z8 m0 E: F![]() 2 Q8 p$ b: r+ s' l
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
/ y4 F. u8 X y! l8 Scum_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)) 5 _3 h7 Z! o1 {- l
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
& e# U% v# I& Lcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
6 M& Q% l j( g1 ?: v8 A$ Mcolnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
+ J3 w# C1 n$ o- [3 Qfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))/ y- }& X. F6 O4 S
five_country$date<-as.Date(five_country$date)
- j% p) B) C3 g# |7 V3 c" \! P' y, `7 G# c
ggplot(five_country, 3 |6 n: P. I0 W& @
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + & t: @9 O3 n- e/ h
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) + 0 g' U9 v. s3 r
geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+
. V' l6 n4 J+ [& f) }2 ? scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
+ x8 D7 U1 Y' [0 I8 j! `& q9 P theme(legend.position="none",
+ E1 K5 a" H& c) u$ y* R4 x# L& R panel.background=element_rect(fill='transparent'),3 y" y( z+ _5 ^0 K1 U/ G* y+ Y4 }
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),& G9 L, F2 u3 N
panel.grid =element_blank(), #删除网格线 N; s- G- b8 F1 ^1 D: m# r1 o4 z
axis.text = element_blank(), #删除刻度标签
; e3 r9 {6 L7 M0 u% ^0 S axis.ticks = element_blank(), #删除刻度线
) v/ I7 o! @& v )+
) J. b& G* e1 O) R+ W( i coord_flip()+
+ k+ `3 C( i9 Y! t/ v! z transition_manual(frames=date) + #动态呈现
- T8 j) |& f8 t( i& ^ labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+ & m. T9 L: V/ H& [
theme(axis.title.x = element_text(size=15))+
% w C1 `+ Q' Q9 e4 t$ o ease_aes('linear')
4 m, c/ H. K3 H6 X
- }5 H; y x, J& I+ S( ~3 v9 Ianim_save(filename = "五国累计确诊病例增长动态图.gif"), S* z3 e6 r$ k7 t1 @
9 L/ D& Q9 Z7 ?( v![]()
+ ^" O5 ~+ C/ m/ h
: a! t1 U0 r5 a0 _- m' q6 y; o0 O
7 K! J+ P) T$ A# b( Z9 S9 k* t* \! ]* D) G
|
zan
|