- 在线时间
- 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语言的全球疫情可视化
' {2 U7 f5 R# L5 l3 @% Q1 o5 U目录
( x2 H* P3 b/ X一、数据介绍及预处理2 H1 d! ?* b6 ?/ V; w' v) q* K( ~
二、新增确诊病例变化趋势
% _( E$ ~& y! |2 @( ^& _4 ^# f三、新增确诊病例全球地理分布; N+ v }" X' I& ]6 @2 S5 Y
四、累计确诊病例动态变化图$ e' T8 g! B4 }
一、数据介绍及预处理" n5 |+ ~0 s9 q& Z, G! [
1. 基本字段介绍- N+ `( W9 k1 l' S: W. d
! t, `' C3 `( Y字段名 含义' v( C2 C& I+ L' ~/ b) F, X5 R& F
Province/State 省/州
6 a) V0 F* Y& |3 [- UCountry/Region 国家/地区
% S. f ?; \0 w7 l. x" ]- M: W& `Lat 纬度
% `0 u8 F& _6 d6 T: G% oLong 经度
& ?% g6 @3 P: b9 L- I* U) U1/22/20-12/7/20 每日累计确诊病例! n3 q* W/ M* R
& ?, b2 k6 W2 |; M. ]; i![]()
4 g6 g& S6 M6 i, N4 y$ a# c( f
3 u, g0 o5 {& }8 x8 g2. 数据预处理 - 整理某些国家的名称,如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)]
( F4 [ z- f! k% C) W, b[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)]
. [' L1 {% Y% 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)]
) N3 _' B; z' V6 o' j& a T% E9 J6 E[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)]
/ l1 [& [$ d( m" h+ [1 W; y8 n+ _[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
0 J, q2 ^% m# j1 l( ninspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])* O1 G5 P8 @. J7 M* G- b# E5 a
increase_data<-inspect_data-inspect_lag_data
. T7 q l- U! I6 o; r
# }- b' M# f4 W) y2 D#合并数据,new_data为新增确诊人数数据
$ ]4 ?" h' X1 a: S3 g/ Hnew_data<-cbind(information_data,increase_data)% M( n" `9 s; r4 X2 N
! }+ @% s5 o1 |1 ]1. 中国新增确诊病例变化趋势
; U( {- E; c, n2 L1 o. Z5 ^#合并所有省份新增确诊人数
+ x2 `3 K- ? T2 b* b2 rchina<-new_data[new_data$`Country/Region`=='China',]
. f# G( \2 ?! d# z7 ]3 W% Wchina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))! I& D, g- y9 n5 V" \5 |
colnames(china_increase)<-'increase_patient'
; R. F l$ s' v) H" r- D# q& vchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
4 s% h; u% F. C+ `
9 [& Q" X @9 t+ fggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
. L- r+ d# {' B0 g6 e scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
7 o& @$ X, g L3 [/ ?6 _- a2 w0 h labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+4 B/ t& W5 h7 o
theme_economist()+ #使用经济学人绘图样(式ggthemes包)4 z" r/ N: I$ p; e, H
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
9 y' D* r5 \' Z8 \, Y- R! l9 p axis.title.x = element_blank(),
% |# U+ I+ q. R0 D O axis.title.y = element_text(size=15),+ b! C# m" m" s, Y
axis.text.x = element_text(angle = 90,size=15),
' j: _/ h3 x7 S8 B' {' D7 k axis.text.y = element_text(size=15),
& V* `5 p: x! P* \! c4 c) V legend.title=element_blank(),9 j) J- N, e: i* C) M' [$ B. P0 B
legend.text=element_text(size=15))& H# T2 K6 Q- _" K: m% M0 A8 @
! @' a/ W4 {+ W5 p7 ?
![]()
: W: P- ^' H( P4 A/ V2. 美国新增病例变化趋势
, d) K z# t6 @2 h3 ]' Jus<-new_data[new_data$`Country/Region`=='United States',]9 ?( w' B( Q1 _9 ~$ d
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07'), E/ K, F$ C+ o8 |7 h! |
us_increase$date<-as.Date(us_increase$date). E: Q+ G) p J. @
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+ U0 X& o" n4 g$ w% M$ S3 @
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
5 S) \4 v0 I6 w) Z( G2 B labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+7 f k; |2 s5 k" S6 H! y" c ?
theme_economist()+ #使用经济学人绘图样(式ggthemes包); C* Q; ?; Q; \! J
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),3 Z, U w; ?4 `. p9 }: x3 D3 T* W- U
axis.title.x = element_blank(),
* _6 e$ o! |/ b4 U @0 k/ v axis.title.y = element_text(size=15)," j" b; W) c) W& s# _2 ]
axis.text.x = element_text(angle = 90,size=15),, L3 N4 W& G9 F2 n4 }2 Z6 D
axis.text.y = element_text(size=15),' w) D9 O( H5 k2 Z
legend.title=element_blank(),
/ D* T5 g9 F' p J& Q legend.text=element_text(size=15))3 g/ d3 }9 {6 |; T& a
6 G g2 x- F: Q7 r2 h8 v ' R- z8 p: K8 U( K5 w7 l9 E/ k
3. 全球新增病例变化趋势
1 W4 x! z3 g8 K; q. Ctotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))' g, d3 U: p# {7 O
colnames(total_increase)<-'increase_patient'& A0 j0 I( `) i$ V) c3 O2 z
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")6 S8 y. U8 C: A7 t8 |- U) M
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
' d' V5 Q. g1 N/ a5 G. M scale_x_date(date_breaks = "14 days")+) L; X& _, a: Q( @
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
+ M3 V7 r7 ^% }9 a theme_economist()+: [. c8 e9 Z6 V6 F
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
( Q5 |+ S+ i1 y! ` a breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
& q2 N- K/ s' Q7 b5 i8 m. b labels=c("0","20万","40万","60万","80万"))+ ^% N7 T0 }# c9 j1 }6 W
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),$ |7 c9 Y1 T# n) i( n
axis.title.x = element_blank()," M$ Y0 K8 r: B* j; g2 f
axis.title.y = element_text(size=15),4 \7 r- h0 o, a1 H' S
axis.text.x = element_text(angle = 90,size=15),
' V$ e W, g6 Q+ i axis.text.y = element_text(size=15),
+ E/ z3 d; h3 {& O5 A legend.title=element_blank(),
4 L8 S/ Q8 |8 e" C% | }; { legend.text=element_text(size=15))
3 H" O, j% e2 R7 {6 J0 c* Y5 f4 L0 M u, I: [3 V e7 E$ B' I& K
![]()
4 f) R) ?1 ?4 d三、新增确诊病例全球地理分布5 M+ ~8 \& h/ S" H" z1 j' g- x' U* S
mapworld<-borders("world",colour = "gray50",fill="white")
: j; u' s7 Z" h" p- \4 k0 Rggplot()+mapworld+ylim(-60,90)+2 W3 l; J: g, k% Y$ ~/ i! Q. ~
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+# X% e6 n* }3 f% o$ X& b6 ]. b5 i
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
7 G6 _5 s( ]( o$ e' B I theme_grey(base_size = 15)+" X' g! C) k! o$ \* a4 a0 n
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
8 k( s( D1 Q7 V* O7 E# q% |+ B. E$ n legend.title=element_blank())# l1 [& X$ m1 g$ r
' M6 k4 f' k3 a! S7 w* C4 eggplot()+mapworld+ylim(-60,90)+& q2 N. I+ J! p3 o! [4 T. f
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
/ j6 \5 h: d7 P+ G% n9 v/ P+ y! V scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
3 R: v- \2 I8 Z" b4 j. z) o theme_grey(base_size = 15)+
8 i2 k1 o. e! J$ F# h theme(plot.title=element_text(face="plain",size=15,hjust=0.5),1 |6 e( v, [% _ V+ I* Q4 Z# q
legend.title=element_blank()). d I/ m+ ~; S
# m' \) z+ ]4 p9 v3 q+ e4 K8 q![]() * e% k" ]0 A) b# F- m; Q
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家 9 y! O: o) \8 F8 V" p# T
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)) 1 Q: _6 c; k' k: |5 x8 t
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图; e- D, Q& n' [" N% Y4 f. N
cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07'), ~4 ^' i- e; S- u% Z5 U
colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
4 I& N8 U* y% {five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
3 J! x O4 Y0 }8 X3 Vfive_country$date<-as.Date(five_country$date)3 Y: A# Q2 Z) }- n3 O
0 `; C. a" ^ B3 _& V
ggplot(five_country, ; G, j4 ]8 V, o( \. M0 T0 l
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +
; \& Y+ F3 m/ x+ q& K+ W! X geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
8 Q, s5 ^+ b- r7 {% ~- J# O geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+
: g% t2 @7 t1 ^) p1 T3 G4 x5 x% x* H scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
" ]( N; c! @+ e$ n% n* s' a% f theme(legend.position="none",
$ n; a' r# k, V u4 o( t4 a panel.background=element_rect(fill='transparent'),6 c8 K7 Z+ g# O+ B! {
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1), {2 Z; y3 e( q4 q
panel.grid =element_blank(), #删除网格线
/ V' W% p- [2 {) ]2 A$ w axis.text = element_blank(), #删除刻度标签# a3 B D- K) l
axis.ticks = element_blank(), #删除刻度线
8 r! c+ _" ~- k+ y4 l, q )+
: p; j, f' x, S/ A9 J9 R coord_flip()+ & L- i# `# L2 a" D$ F
transition_manual(frames=date) + #动态呈现; k- n! S& q/ g" e6 d0 g$ i) k( M
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
# l- J% e0 l9 Y3 q& X" m) A theme(axis.title.x = element_text(size=15))+$ L; \9 C/ ]3 w; c& w; w
ease_aes('linear')
( N: l' l& w6 n; j5 N7 x# ?* [. e) g* s6 M3 X( G
anim_save(filename = "五国累计确诊病例增长动态图.gif")1 h- ]4 |7 \9 M, a
7 W/ H F- ?4 \) U9 D7 I 7 c" \. N: h5 X
# n5 u* _5 G$ c4 t# E
4 _, A, k4 {3 M' p& H# d) }9 q" \0 w6 r- H. c# c' ?7 S- q
|
zan
|