- 在线时间
- 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语言的全球疫情可视化' ~; }- Z2 l8 q! o3 Y3 `
目录
* c) z& i( G4 M( t' B一、数据介绍及预处理
' ?5 b8 s7 Q; K6 f二、新增确诊病例变化趋势" N S2 Z) o/ D. z3 y
三、新增确诊病例全球地理分布
# s2 [8 d \6 F1 Q' O四、累计确诊病例动态变化图
. I( A/ X/ R8 J$ T$ B9 }一、数据介绍及预处理
# p4 R; ?, s- c0 k2 W/ a; U1. 基本字段介绍
+ A% p' w7 |( {/ g7 N" a% w* E: b! u3 h- ~6 [& W
字段名 含义# M" A( v" p) t1 d/ B1 {, i
Province/State 省/州/ z9 K+ C" [; \" J! B" c
Country/Region 国家/地区( i+ N; c/ g9 L7 d# B& [, B( {# ^( p
Lat 纬度
& T" l% [! G1 Y* G+ MLong 经度
) h/ f; v/ }+ F% Q$ G1/22/20-12/7/20 每日累计确诊病例
1 P9 D7 D7 H. }3 E2 m
' q5 L1 o# X$ x- B; _$ D9 k![]()
0 N, Q- y3 V8 |( a4 ~' a4 l; h8 W; A2 f' X6 o% R6 K
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)]
( K6 O5 |* n U; w% 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)]
U5 E$ r4 s. ?* 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)]; r) O+ Q$ f$ u7 `8 c3 ~
[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)]
1 y/ ?1 T# K! Y! j% ]) U# v[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例9 @, u3 Q. v) ?, i2 @
inspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])& J/ _( g+ B# F/ { A# h8 m6 h+ d
increase_data<-inspect_data-inspect_lag_data4 L4 \5 t' o2 h6 i2 b: D+ Y+ N5 y! M
' ]* ?3 ^" x. g% u6 T#合并数据,new_data为新增确诊人数数据
1 H9 \8 C- g Tnew_data<-cbind(information_data,increase_data)+ C; C# Y5 O# t
; W, x, g1 p! O
1. 中国新增确诊病例变化趋势2 {/ n. d& i# E1 K& Z
#合并所有省份新增确诊人数
5 H1 X( u; e9 s3 _' \" D/ p: Xchina<-new_data[new_data$`Country/Region`=='China',]( {( S* I f/ z, K; X9 j
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
0 ~, \( ~ e$ ~6 {0 u0 ?colnames(china_increase)<-'increase_patient': @* T3 \5 L, Y5 q9 v
china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
1 s2 @$ V- z" B9 k( w- T1 O* O7 s$ {" S& u& [$ k' a2 ]5 m4 q- I8 @) t
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
+ Z* Y8 x2 b6 l9 U2 x \ scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
3 b8 T$ U, E9 z' Z$ B1 g# X labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
* B3 X! U! v$ |+ ^6 k theme_economist()+ #使用经济学人绘图样(式ggthemes包)
% b3 B' K( y4 P' T7 C, K5 x1 E theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
* w1 u7 `4 T" B5 Y axis.title.x = element_blank(), S8 G+ ?6 s& j0 Q7 v* b
axis.title.y = element_text(size=15),: j4 \( S0 k) ^$ ]
axis.text.x = element_text(angle = 90,size=15),
' x6 h- R" G1 t0 x axis.text.y = element_text(size=15), _; v$ F: F' k ~
legend.title=element_blank(),8 i$ c5 _. x: N2 z: u. O
legend.text=element_text(size=15))0 Q, [- b- Z% q
+ ?( A& ~" v( Y; J" H( L
( d& A- P0 g% [2 C2 H, @1 g f
2. 美国新增病例变化趋势' o! ?4 n; l% s3 ~1 E, E! q6 L
us<-new_data[new_data$`Country/Region`=='United States',]
2 ~! E+ ] o7 J# Eus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
. R7 u) \+ w& e5 Eus_increase$date<-as.Date(us_increase$date)
2 |! P( K- B9 g3 Aggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+7 E' {4 C7 E, u$ m# O
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天+ `% T K% V, l; `8 |8 ]
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
6 E: L% k& G! T1 Y- P5 U! p theme_economist()+ #使用经济学人绘图样(式ggthemes包)
5 m: C' ]& q3 k8 V theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
7 p2 X' X5 i. x axis.title.x = element_blank(),
" P8 l3 k6 B4 H: T, q axis.title.y = element_text(size=15)," l' a; l1 b0 Y, o
axis.text.x = element_text(angle = 90,size=15),9 I8 M7 Z3 }- L# c+ S9 f( e' I
axis.text.y = element_text(size=15),6 o& W4 N) Y) J! S0 L0 Y7 |
legend.title=element_blank(),! H, t1 a# x* [; B: d
legend.text=element_text(size=15))
- }2 ~/ Z' t' b' a o- k' y4 {0 _
3 A1 a) p p# k7 l9 f! }, T
3. 全球新增病例变化趋势
' p) d# g H8 z( d$ f& w! _total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
. O; |2 U7 V" hcolnames(total_increase)<-'increase_patient'2 U1 \; Q7 i* O3 `( w5 U9 e
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
1 ]: d# ~. z/ O- @1 xggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
6 w8 m3 z/ S( D; T2 f. ~. C scale_x_date(date_breaks = "14 days")+8 s5 j8 s$ _9 Y5 @7 Q
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
$ J5 r* q) B, T- p theme_economist()+7 P' i7 p3 Y9 s; Q6 d
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签6 p+ L8 @. ~5 Q; I' |% K0 ~2 }0 s, a
breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
; @4 {+ x6 O% ] labels=c("0","20万","40万","60万","80万"))+
" s$ f+ U" _$ ?; v/ X/ M8 b theme(plot.title = element_text(face="plain",size=15,hjust=0.5),/ P- ?6 o ^4 D
axis.title.x = element_blank(),5 J8 M4 ~6 ?# d6 G) n+ l: C
axis.title.y = element_text(size=15),
5 I0 \' `) e7 {: k! B( n) h axis.text.x = element_text(angle = 90,size=15),# O/ g' a4 o" b: ?" q& u
axis.text.y = element_text(size=15),
6 _ W/ t! `2 I" G" d" j3 Q5 X/ i/ O legend.title=element_blank(),$ f. i4 a7 b: `$ S
legend.text=element_text(size=15))4 i8 P9 P: ?. x
; F. V. p% i: z* p4 I + | ~) A7 }+ C8 ~/ A( F
三、新增确诊病例全球地理分布4 z& |/ s+ L$ [! I6 `
mapworld<-borders("world",colour = "gray50",fill="white") " Q' O7 m* Z2 P
ggplot()+mapworld+ylim(-60,90)+
6 e3 w" w, O" J; E geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+/ o1 ~ j6 w- [
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+6 ^- ^+ l; p8 U9 p; Y
theme_grey(base_size = 15)+
2 w! {3 o& l" J! b: O0 U theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
* Q# V4 z6 a9 M w2 n. b7 E legend.title=element_blank())
# k" z' X; q4 C8 e8 G; _
8 ?0 Z7 Z- I( m, z) \ Kggplot()+mapworld+ylim(-60,90)+- `, t- j# S; X, p6 W/ N
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+! s" |- Z* G" `
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+2 W7 J; E: a* I. r+ k
theme_grey(base_size = 15)+
$ I0 f, v; |1 }7 {9 E) @2 x' f theme(plot.title=element_text(face="plain",size=15,hjust=0.5),3 q, W3 T: I0 s! n2 R
legend.title=element_blank())
" Y, g7 @# L8 |8 J4 O1 N4 x; ]
! H$ p0 H' P) S, C! r![]() 3 }/ T: f. D& A5 O
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家 % A; q8 T' N+ [! ~1 U) ~
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)) ![]()
, q0 ]3 q* \" e# D2 z" j9 D2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图! V6 Z; c' X2 [8 _% V" ~5 a
cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
1 K) y7 v$ j5 y- c% Ucolnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient"), |4 \& l' J; b! O+ c
five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))5 d& z, |9 l/ {6 } ]8 u8 c
five_country$date<-as.Date(five_country$date): h' E0 z. ]' n9 q
. B3 B, U! q/ K7 _/ G- u/ \) rggplot(five_country,
L; l8 K0 }6 ]$ w9 U aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +
% o) b: Z9 w; R, F4 M geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
8 A% u. h) S) P geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ & Y2 T1 ^5 g% F0 l
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
( R! M1 v. I1 O4 |4 @ theme(legend.position="none",* Z, p1 E5 _7 a6 z" `
panel.background=element_rect(fill='transparent'),
p" v0 F! K& `) `- k/ _0 d9 o3 l axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),# q& \% v3 j" {; h+ a& [; V
panel.grid =element_blank(), #删除网格线( c. w& m/ {* j. j2 E9 S4 r3 C
axis.text = element_blank(), #删除刻度标签5 i L& z+ J" o/ N1 k- |
axis.ticks = element_blank(), #删除刻度线
6 L" h! _- t0 w& c )+# [1 p6 a7 z: L8 r* `4 t
coord_flip()+
, M# b6 H& d& ?( Q& | transition_manual(frames=date) + #动态呈现1 K6 q w0 z+ K# b/ n3 A6 Y
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
* [8 W# O* r3 e theme(axis.title.x = element_text(size=15))++ @1 h8 X6 D4 Z. W
ease_aes('linear') 7 @% H, j, s5 X& L
7 K& X( \& }+ z' Y# H. ianim_save(filename = "五国累计确诊病例增长动态图.gif")8 g7 J& \, o/ Q7 F5 I* _- n- g( R' M
9 S2 j# X4 h! c; `
4 S2 B% t) ~( t
. D0 k/ M W. J
% B3 O4 ~9 F+ ]
z7 g% F. h, b! @
|
zan
|