- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40100 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12741
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于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 F2. 数据预处理 - 整理某些国家的名称,如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[,1 ncol(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 Gcum_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
|