- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 39388 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12512
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1388
- 主题
- 1158
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
|
可视化实例基于R语言的全球疫情可视化! Z! {" l4 a+ }6 S$ E' \/ M8 z6 Y
目录1 j' d3 M& r% r0 x( |
一、数据介绍及预处理9 u, o9 o# t/ F3 Y
二、新增确诊病例变化趋势
8 a; q% N: O6 x' e9 }8 o( k j% v/ |三、新增确诊病例全球地理分布
! U: I8 T# X" V! T四、累计确诊病例动态变化图/ n1 i$ n9 {3 P6 q, ~0 }' n4 h
一、数据介绍及预处理3 g0 w( f: b! ?+ u
1. 基本字段介绍
6 Z' d: G D1 _2 e! e/ P7 I* L8 O+ p/ v! U# M0 m" b
字段名 含义4 j+ y( [% p$ u4 }7 s- y7 [2 M
Province/State 省/州
8 X0 Y3 z' D2 t# GCountry/Region 国家/地区
: ` s: W$ i6 F4 \Lat 纬度
# {' `4 o* {; A( B. f9 I( M" aLong 经度: @1 ~. S7 d, Z
1/22/20-12/7/20 每日累计确诊病例( b) X! T/ V! }9 k* q
* k$ e7 R+ J6 S* _$ ]! g7 C# u) T
! ?! J+ ]8 i+ |" E: `% F% x
: r/ g! ]( {/ S2. 数据预处理 - 整理某些国家的名称,如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)]
3 A3 `6 F$ b8 _5 ]( U$ v7 `# K3 n, W! V[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 I; E7 n' _; d3 X7 t[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)]
" w V9 `1 }8 k/ J3 z: F[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)]
5 u5 d1 o1 h# R. d: i[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
, a5 z0 c: q. Q: n3 z& x+ Minspect_lag_data<-cbind(0,inspect_data[,1ncol(inspect_data)-1)])& Y) S- t* ?$ B; g0 w0 N' X# k
increase_data<-inspect_data-inspect_lag_data
W3 ]9 K: C4 e7 A) Q$ ]" P1 O( J1 \/ r4 [8 a& \2 r# n7 ^
#合并数据,new_data为新增确诊人数数据
2 k8 q7 |7 I- V. Q# U/ y. v# Tnew_data<-cbind(information_data,increase_data)
- d3 w2 P( Z+ W& }
$ [/ l9 v! a. l. V1. 中国新增确诊病例变化趋势$ s' X* Q0 R) Q8 c# F# ?7 w9 h: `) `( H
#合并所有省份新增确诊人数
7 R: Y0 j! R* I- m& ]china<-new_data[new_data$`Country/Region`=='China',]$ N4 a, f4 a" M
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
, O" m2 K, ^5 t/ l* Jcolnames(china_increase)<-'increase_patient'
# @7 e0 k* V2 H D+ echina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
6 ?2 r! w4 i( H* k! v, \$ T. b3 r' z& Y% k$ P9 \( i6 K' T9 C
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
% D. n- d" g5 D. q" g scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)0 x* \/ U8 c' a1 O
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+
5 `3 h3 G! M: d- S9 ^, `8 F theme_economist()+ #使用经济学人绘图样(式ggthemes包)2 U( n1 i. x) I- c& w, X2 S
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
6 B5 w& f$ p8 @- l' V) N axis.title.x = element_blank(),( w8 u, R7 |- E5 k: {5 ~8 w
axis.title.y = element_text(size=15),
, c2 ~7 e* n: G* h- O0 B E axis.text.x = element_text(angle = 90,size=15),
! T! ?$ M4 v! \ ] axis.text.y = element_text(size=15),
. A$ z* m, p6 W) u legend.title=element_blank(),; R: c/ G$ |, d) t* J$ P
legend.text=element_text(size=15)). }/ y7 x" M0 [) |; Z2 H7 b1 i
' ~. a! V& p- x. n2 e0 m
I, y! u" d9 p `
2. 美国新增病例变化趋势
1 M2 y& ]/ [5 rus<-new_data[new_data$`Country/Region`=='United States',]8 Q# L, X, A) p+ e& w7 l# s
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
* Q V$ e4 W7 T" w( Nus_increase$date<-as.Date(us_increase$date), `3 J) n) C% ^
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)++ P* Q2 s) p" W
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天5 \0 @ m1 D2 ~( ]8 \/ B$ N$ I
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
. c) Q) t: L$ H+ P4 ~' ] theme_economist()+ #使用经济学人绘图样(式ggthemes包)* s# V6 E; H0 w2 Q% @2 C
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
+ ]6 h; p, f/ C, D& T3 u3 p axis.title.x = element_blank(),7 R- \" ?3 j+ T0 l6 W
axis.title.y = element_text(size=15),4 o- T8 O1 [+ a/ T0 f! A( ~3 B
axis.text.x = element_text(angle = 90,size=15),
, I/ ~$ S4 A4 _ axis.text.y = element_text(size=15),7 B w- `/ e" A1 W
legend.title=element_blank(),; a# P7 C9 p/ r7 s
legend.text=element_text(size=15))4 \0 T0 r3 g6 R' C) ] A% Q4 o3 n* q
5 B) \( [8 r+ y' q2 A* j5 g8 m8 R9 V: L4 ^. g9 k
3. 全球新增病例变化趋势
' W& ]9 {0 F" g4 b- ~" f ~+ _% Stotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))5 s2 e1 |" @0 O. d- W
colnames(total_increase)<-'increase_patient'. c$ D5 R' u! Q) y3 T
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")8 l) \% H' O, a* n N% t
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+. c( h5 I3 }$ K. T9 x
scale_x_date(date_breaks = "14 days")+8 l3 ^! V7 a" Z% D( \. K
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+' v/ w8 ]3 w# _" B' M
theme_economist()+0 s% E) M* q+ |* z/ j- ~
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
* x! V0 ~/ o! @( u5 W8 z' i7 ~ breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
$ ~, h" w6 A/ F# s labels=c("0","20万","40万","60万","80万"))+% H1 a: Y" L7 m2 n, q
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
' @8 P, t" i: m# V% Y axis.title.x = element_blank(),
- L0 r; |# Z$ F' R/ k4 e axis.title.y = element_text(size=15),7 X1 z. a" p$ X# K6 C! h: s
axis.text.x = element_text(angle = 90,size=15),
; z r! H. C, I, l axis.text.y = element_text(size=15),, x! ?2 }/ v- M3 `2 I% @
legend.title=element_blank(),
4 \# N# ?0 g8 a8 Q' H, m legend.text=element_text(size=15))
* y* e8 Q5 a* d- R) a6 Z
% n$ x2 k9 N6 z) N N& I
* i' ~* v1 W# M2 q三、新增确诊病例全球地理分布4 t+ _9 n* W$ ~* S: M
mapworld<-borders("world",colour = "gray50",fill="white")
, ?0 e1 i& M5 N0 {ggplot()+mapworld+ylim(-60,90)+
! m/ e8 q9 V; u M E- c$ ? geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+, {. `; d; ]9 i/ [, s* T2 l
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+) ] l4 Y% X5 I& y5 v
theme_grey(base_size = 15)+4 Q) q4 Z! a4 b. j( Y4 i: s
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),) E- P$ Z W0 T
legend.title=element_blank())
0 W6 N' k- k) d& G# a$ M$ ?1 x( [ D0 z) j
ggplot()+mapworld+ylim(-60,90)+) K$ f; p3 {" ^' Q o
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+" r* A H; n9 F( p
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+ b# K1 l+ |7 h. Q5 K$ y& r6 y T
theme_grey(base_size = 15)+
% v- q+ O; ?' v; N' B theme(plot.title=element_text(face="plain",size=15,hjust=0.5),; E- P m; Q( Z/ Q) J
legend.title=element_blank())
7 H4 E4 G* q, }2 r* {2 M" q
% ~9 R/ `1 m3 c C$ J+ V6 i. u u- f/ U# h$ P1 ]" D
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家 % k& T' @+ M' r: B
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))
7 Y: r* E8 O+ y( [/ _, q2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
, \3 {0 E8 O% N' s" _7 y4 c( L$ fcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
4 j! Z7 I f0 |" Vcolnames(cum_patient_time)<-c("rovince","Country","Lat","Long","date","increase_patient")
" B0 O& v$ V: ~" r, ` Ufive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
! q' B6 A1 n) e5 Y% Ifive_country$date<-as.Date(five_country$date)
& t' ~4 d' b# a% f/ R2 R. V1 M9 E0 e
ggplot(five_country, 8 M E2 I) d- \' g7 s6 u5 s
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + & H4 A5 Y6 m+ ]! {
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
" m: l# q: o& Y3 W* f0 g, R! f geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ % M' B5 D5 H4 Y9 X- H; d8 l
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
/ @% }( [' J" ?1 X5 X5 R theme(legend.position="none",# l9 l( Y' P0 A% }+ M* ` V' \$ L
panel.background=element_rect(fill='transparent'),
+ p4 ]; _ x! b# F; C2 \ axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),( O* T x1 [' b( K/ @2 @9 B
panel.grid =element_blank(), #删除网格线+ D; ?. j" L f( m: h* N' v; q5 {% a$ R
axis.text = element_blank(), #删除刻度标签
1 w% _* f! `( E% h; @# A axis.ticks = element_blank(), #删除刻度线5 T9 p) _: n! r; E6 G8 I1 `- U, Z
)+. @1 X6 V% b1 m' |2 b/ q: E
coord_flip()+
8 I Z% \1 w- P6 [+ B: Y transition_manual(frames=date) + #动态呈现' G' G. r/ r8 g- L U
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
2 e7 |% L; o9 ?% N; y( A$ p* r theme(axis.title.x = element_text(size=15))+/ T) M2 k" w4 i4 e
ease_aes('linear') ) H, P$ |6 ]+ I( R7 a5 I1 `1 o
6 ` k1 D U- S4 \- ~7 Janim_save(filename = "五国累计确诊病例增长动态图.gif")
0 r! j3 N9 y2 }& i: u2 n, a6 S0 C) m" a/ y1 ~" f1 J
) x5 b4 V. J. [( g$ J3 Y$ E( ~: W3 C/ |
: z+ ?0 h# Z# A* Y5 }1 j2 y2 Y
$ g5 _6 D3 b- t |
zan
|