- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40293 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化; d& {- ^7 {( i; L
目录! u3 \' S7 O, b8 V1 i' k
一、数据介绍及预处理& _$ s8 G! J! N( E) t }% s2 J
二、新增确诊病例变化趋势$ d6 G$ q. f3 ~/ n/ P9 ^8 w
三、新增确诊病例全球地理分布 C- c9 y: K0 Q+ i2 d
四、累计确诊病例动态变化图
7 s- r. [$ h: v, D一、数据介绍及预处理
0 R6 A: `2 ~* e. K% |0 n1 |, g1. 基本字段介绍7 U: W8 k$ Q( G! B
# |! J6 f3 a6 h! ?/ {7 s
字段名 含义; ^" h2 s! t" C$ Y( n0 R
Province/State 省/州
9 j4 R$ ^4 D( m/ {$ LCountry/Region 国家/地区& e1 c* e" V; m, @; C( ?
Lat 纬度
9 c6 }. F8 z! ~+ C8 }' Z. ALong 经度9 ]9 J' s3 u; x/ v1 j1 R
1/22/20-12/7/20 每日累计确诊病例
" j* C& j. Q; O" i* a- u3 {4 w5 U; j& m; V) y8 ~
![]()
, P. a1 X8 @8 U. {4 S2 q. }' j6 ? `$ m* p0 ?
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)]% e1 O g, V( ?# V) ~$ 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)]
2 a h# r$ p p" a. b7 k/ ?" d& A[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)]* U C9 i4 k3 K2 P5 T0 q" L
[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)]
) V6 r; R' E2 y7 c2 u[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 g1 a7 t; N# K# finspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])
1 Q$ z% e' ]/ R1 p% O3 J3 rincrease_data<-inspect_data-inspect_lag_data3 ?8 D8 N* A- s- \
/ w2 o& i' h6 b5 z! M
#合并数据,new_data为新增确诊人数数据
. r& X7 ^/ c1 M7 D& unew_data<-cbind(information_data,increase_data)0 R3 e6 R& D8 t1 X7 ~
+ k1 B I' R$ j6 V& P( a# b
1. 中国新增确诊病例变化趋势! k* b9 B* a; T0 E7 Q7 ^
#合并所有省份新增确诊人数
, a9 Q2 m; t5 ~: ]" Q7 x$ K2 [china<-new_data[new_data$`Country/Region`=='China',], ~$ ^" s1 f' w# M) v' q
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
" s7 ^& Q. D* f1 O8 L+ tcolnames(china_increase)<-'increase_patient'
9 C8 u3 V7 t. B0 }' `. z5 b0 bchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")# }0 k% y9 X0 F7 M: w% F
+ t4 W' f3 d8 Xggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
' Q; _; _ l3 s) P scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)# o. {7 q9 p. C0 }5 o% F$ ]8 u7 q
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
& R ~3 V' G0 B o theme_economist()+ #使用经济学人绘图样(式ggthemes包)( i" b v# T9 J$ A- m; w, p4 I
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
% C* l S6 v$ s2 B' s7 h7 a" x& i0 j axis.title.x = element_blank(),) f% U' o/ F( i* {
axis.title.y = element_text(size=15),& j% Y- R @$ k/ T. @$ X
axis.text.x = element_text(angle = 90,size=15),/ N4 D- Z# n2 ~) G7 b' A7 D- h
axis.text.y = element_text(size=15),1 J8 l( {2 P( N" Y
legend.title=element_blank(),3 v* [" C$ u: p, r7 @4 o
legend.text=element_text(size=15))
P# h* h8 e' E9 u9 {+ T" o1 U- h: b4 |
![]()
% D% c( g, u1 ^8 J, K( c. r2. 美国新增病例变化趋势
7 h3 C- d' |5 G+ P8 ?/ pus<-new_data[new_data$`Country/Region`=='United States',]0 w8 p- E! d; T# S( {8 i k
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')7 Z0 m/ }6 ~3 R& H
us_increase$date<-as.Date(us_increase$date)2 R( p' s( h+ H* n) t P) e9 }
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
/ f a4 _) j+ e! G3 a scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
! V) |$ i- a" A; ~6 ~8 v" B5 n labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+% X o% o' Z( S; E6 p
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
$ D4 g0 i0 e0 l& c {4 t8 J/ R; F$ R theme(plot.title = element_text(face="plain",size=15,hjust=0.5),2 J. D T. G' u/ Z; o! v3 J
axis.title.x = element_blank(), L2 {' Y9 \9 |% S0 s
axis.title.y = element_text(size=15),, `7 }: ^' ?# @6 m3 K; T
axis.text.x = element_text(angle = 90,size=15),: {% B1 [' G, S% P! m
axis.text.y = element_text(size=15),
a) q9 P! p. u6 h6 V8 r5 L legend.title=element_blank(),
% ?8 i$ K* v* `) n legend.text=element_text(size=15))
1 d% s0 R) N( r u5 N3 k3 S9 V9 q$ x1 x8 @+ {* q
* D- R% ~3 Z( ?1 O. @1 w7 B
3. 全球新增病例变化趋势
9 \7 X) U8 J4 S2 b- Btotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
6 x" r, R+ e" |" T& _! scolnames(total_increase)<-'increase_patient' \& T" j1 g2 m% \$ M: T
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
; L& [% z& `2 gggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
9 H" F) l. Z' n, N6 H scale_x_date(date_breaks = "14 days")+" c4 m" Y' K! H7 ~* c) p
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
( R' |4 d: t8 \ y, q theme_economist()+& V4 H) k; `4 @
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签. _$ K$ {3 u. Q( O* H! S: i2 m
breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
- [( u8 ^- M' q. F. _ labels=c("0","20万","40万","60万","80万"))+
8 g6 k1 g ~4 E1 A, ` theme(plot.title = element_text(face="plain",size=15,hjust=0.5),8 {+ s2 J5 _2 _# u- {5 s" x2 i
axis.title.x = element_blank(),3 j# p$ M7 p8 k7 m- u H
axis.title.y = element_text(size=15),4 H0 p+ n+ e n2 q' G
axis.text.x = element_text(angle = 90,size=15),4 `8 L& D7 u* T( }9 b5 Q
axis.text.y = element_text(size=15),
: p; Q/ t6 d) X2 B" G1 w legend.title=element_blank(),9 Q: t) _. ?0 n w5 P
legend.text=element_text(size=15))& i$ z0 z$ T3 c: T2 Y
- X) r, s$ e4 ^2 ]* X, I2 o& b% q
![]()
- i d' j- D" @) x# E. E三、新增确诊病例全球地理分布
4 T6 x# p% a+ E+ j, G- smapworld<-borders("world",colour = "gray50",fill="white") % D3 p1 K9 }5 D" N8 y* }6 u
ggplot()+mapworld+ylim(-60,90)+
$ u6 a) Y4 k0 p2 P/ p geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
0 A* B/ D- ]! t7 Y& a scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
! T5 b$ A1 v/ V theme_grey(base_size = 15)+
9 U3 w1 N4 S: d theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
1 T4 i0 \( f* m& A. E legend.title=element_blank())
+ I; l) _ W% N% S, g
e7 }. y4 L! F( `ggplot()+mapworld+ylim(-60,90)+/ W( G6 e3 @8 w, z% C5 w
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
2 R9 h- N& i! @; o, t scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
5 R7 x# s9 D+ N theme_grey(base_size = 15)+1 v9 _3 F) d) J4 d1 D/ ?
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),4 x, j; T; N2 k$ L: X4 G2 H
legend.title=element_blank())
/ A* @5 B3 Z& H4 @9 U! a
* U% N2 b6 E: s2 Z![]() ![]()
) z5 H3 M: m/ M) ?+ t. K四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家 " M5 j3 s ^5 b1 o! C
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)) " L7 y0 F+ v7 e
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
3 N$ j2 V3 J' ]6 ncum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
3 i. G* a* a. T6 Vcolnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient"). s2 l$ }1 ~/ X8 b, B4 L5 c
five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
& b5 S! K2 k0 t+ B1 _five_country$date<-as.Date(five_country$date)
; a' ]& j+ N! X# X: ^
0 z' |8 L+ |3 a U- N( i9 f" Aggplot(five_country,
4 u& j" k2 O1 j9 ~5 Z aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + 4 B/ o0 a5 i- e; Q$ I; r) h
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) + ; ^/ a2 T4 w0 ^9 y
geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+
6 T, x: f) {( M, t scale_fill_brewer(palette='Set3')+ #使用Set3色系模板% z# u y! i% P" y* f
theme(legend.position="none",
3 L) X! ~: v, {7 T( ?* f& _3 J( a panel.background=element_rect(fill='transparent'),+ i( B% J9 x; z, e! h
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),7 T! {3 N2 a! z: g( N, K
panel.grid =element_blank(), #删除网格线
% X: w; @7 _# H$ w axis.text = element_blank(), #删除刻度标签
. H& O" A8 h$ | g3 B9 K3 [ axis.ticks = element_blank(), #删除刻度线
4 ?7 C1 V' h8 d* D. `) {! r )+
" d4 E1 f. N6 W1 g3 d4 N coord_flip()+
) G b4 E3 M6 W transition_manual(frames=date) + #动态呈现% e& q% w1 `% y& R
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
9 _: X. E, r: j0 a theme(axis.title.x = element_text(size=15))+
' F5 R7 ~6 ]" D5 q( e" i ease_aes('linear') 5 A' x. O- S3 b. Q Z/ r9 h
4 e9 b; a0 x. Eanim_save(filename = "五国累计确诊病例增长动态图.gif")
! B# k E5 n) t3 ^+ t' v4 C) k% r9 U
0 V: g& r5 i" i8 Q1 C. ? ! k* e) W) a6 q1 P5 m
* o1 z! M& U; q8 c. D1 Z
# s6 O( [) d8 d2 T2 R. A+ x: V
: j- Q& c# N7 Q4 Z |& k' t0 [
|
zan
|