- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40345 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12815
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化% N& |; a9 ?4 {# }! e
目录# N* C T, x$ ?8 B9 H$ a) E$ h
一、数据介绍及预处理% }' @2 j5 r" t$ o
二、新增确诊病例变化趋势
4 R7 h D( T! E5 n" i- i三、新增确诊病例全球地理分布
3 x8 ~0 J; c+ N% R0 V四、累计确诊病例动态变化图: u4 Z' C* V, Y3 i
一、数据介绍及预处理5 ~% g' N' K+ B) |; m, G2 g, H* s. {
1. 基本字段介绍0 Y) g% D9 R7 J% I8 Z% ^: i2 W
( s% Y0 S/ R+ v' f: Q字段名 含义0 O2 P' U( z$ I: [" W
Province/State 省/州" O h8 z4 o9 }
Country/Region 国家/地区
( B8 V4 {4 n9 B, r* E3 o* HLat 纬度) |9 x% P$ }. J2 W, Q' B
Long 经度
7 ]5 D4 w2 n7 \. H* b1/22/20-12/7/20 每日累计确诊病例
: L9 p& ]% u# B4 L0 g9 M, e' R* k/ Z6 A; y: y- }# a: W1 d
![]()
: w4 r+ g, y4 I, `0 m1 U) m/ W, Y; F+ N) g+ I4 P+ R
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)]8 g A. o9 n7 p- y5 x3 H
[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 q- `: e9 O: ]) |5 ^[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)]
! v( }8 ]$ ?- l! M8 U- 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)]. K( \2 {3 b& @7 o3 r9 V: L0 h
[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
2 i y0 o& U4 e, P! K- {3 pinspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])
( V# s' W$ ]7 mincrease_data<-inspect_data-inspect_lag_data
" I7 U( k! e# ~% i
+ r! |3 O" m# s+ r* g4 a' t#合并数据,new_data为新增确诊人数数据
4 M2 f8 o. I' I& inew_data<-cbind(information_data,increase_data)
. K% G# B! x$ H2 V2 }) M$ h; p Z* y) f, p. A3 A- c
1. 中国新增确诊病例变化趋势: J4 b! R( r& y" Q- c8 [7 }
#合并所有省份新增确诊人数
. W( M8 i, w7 H7 a% X9 v6 Lchina<-new_data[new_data$`Country/Region`=='China',]
1 B0 G, @# u: {china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))4 f; w& H" Q# S# G
colnames(china_increase)<-'increase_patient'
' ]3 ~$ m+ G S+ A& ?7 J; x6 Jchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
* \& R& v3 U5 r M7 f1 C
9 q+ A& W5 t) n& S( @( [* ~ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
_, c a6 o% M& V scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)$ w4 S1 K! `; W/ m7 J4 [, z9 b# V
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+% h, [! z' M# ^' c2 Q1 J0 c/ f1 [1 P
theme_economist()+ #使用经济学人绘图样(式ggthemes包)! Y9 }) t6 f7 O7 c+ [: v- l6 L( c
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),1 r) u5 t8 C# g$ l y
axis.title.x = element_blank(),$ q; s y; v7 K
axis.title.y = element_text(size=15),3 X# D" a- Q% Q* K" J9 |
axis.text.x = element_text(angle = 90,size=15),
7 z& _* `+ _5 G. w9 F" C axis.text.y = element_text(size=15),
) k3 C4 n; g0 P( S& _/ ~3 x legend.title=element_blank(),5 Y4 S0 T5 x' d! b
legend.text=element_text(size=15))
1 S# d# D$ _! y& L/ |* ^
1 C& u" `& o7 x. w. u : l0 E% y8 {# Q( l* a! D: o
2. 美国新增病例变化趋势
% G1 t# Q4 Q5 i: {& q# {4 N! Kus<-new_data[new_data$`Country/Region`=='United States',]7 Z! E; Z2 B$ k( t" v
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')8 x2 o. m6 r- [, B
us_increase$date<-as.Date(us_increase$date)& g5 |* `7 g% @- M
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
) h" n: v' S# G n scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
* X5 y8 O. E. j- N" V4 i labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+; T5 W9 @- U6 K' f% k/ |' J q
theme_economist()+ #使用经济学人绘图样(式ggthemes包)0 |- N' O/ s. X4 Z4 t- U
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),3 Q0 b2 l: H3 m0 x' K
axis.title.x = element_blank(),
3 t! r! I0 B( _; Q+ n- w axis.title.y = element_text(size=15),
1 q1 D; S1 e/ M8 V2 p! L axis.text.x = element_text(angle = 90,size=15),
& C# v. E7 C5 [* N$ u axis.text.y = element_text(size=15),
1 e' ~/ c2 v& T* b legend.title=element_blank(),5 s+ @1 c: v' W; \! l: k
legend.text=element_text(size=15))
1 Q% L. R4 K+ f0 K; C* N a! W. G( [8 i4 Q& v( S+ B
![]()
6 R8 W* t! P% ~2 \& Q, X3. 全球新增病例变化趋势5 q) W) `% t2 |) C* v/ ]$ s f; D
total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))6 G- k" r* u- H
colnames(total_increase)<-'increase_patient'
7 t, R$ W/ X! Z5 m v- Itotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")* G0 r' I7 |+ b0 J: v' J! R
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
' Q8 ]! N) z- T/ v scale_x_date(date_breaks = "14 days")+
+ H6 l4 s. V( N; o P labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+. r& v/ h6 Y% c& S/ [$ @
theme_economist()+# O7 k: h0 H8 f' A5 l
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签+ O. g0 a& ]2 B% C8 d
breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
3 }! V* d: Q" D# Z' h. S labels=c("0","20万","40万","60万","80万"))+3 y& w; ~: O- A( ?
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
# ]) q/ `" _4 Q axis.title.x = element_blank(),
0 {, X+ _& d2 A9 k* O |& X; E% Q axis.title.y = element_text(size=15),0 {) R; `7 g: Z9 }4 Q) D5 f
axis.text.x = element_text(angle = 90,size=15),
7 P: L9 v. W: ?2 |8 W& \# ~$ ^9 P axis.text.y = element_text(size=15),& K! A9 i2 m5 l
legend.title=element_blank(),
" C' M) ^4 ^7 Y2 i- [ legend.text=element_text(size=15))
! T: T' L/ m7 ` z
) v) X0 A/ @5 z3 k S3 ` / Z+ |$ X; d; s6 ?0 Z" B7 _) o
三、新增确诊病例全球地理分布; h* @4 w# s+ i" S2 c2 o T
mapworld<-borders("world",colour = "gray50",fill="white") 1 H$ }/ P9 M1 l3 W( `8 t5 s
ggplot()+mapworld+ylim(-60,90)+
! q+ W2 u) U* I& V geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+7 @+ p+ w. h9 P" F
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+/ b; m8 v2 |- `: J" \
theme_grey(base_size = 15)+
" m& c3 \$ o) S8 \. q theme(plot.title=element_text(face="plain",size=15,hjust=0.5),) ^8 R8 K7 o! g" M
legend.title=element_blank())
6 `0 I0 q* [0 ^+ l5 F" @
: w, \8 x, W. ]! B) P$ H* Eggplot()+mapworld+ylim(-60,90)+9 m- h: r0 o2 g8 U5 J
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
6 Y+ l; J6 }& x5 [ scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+' x" r1 H5 [* {; _% e
theme_grey(base_size = 15)+* Q4 @- g8 u5 x
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),5 g. g4 Z2 r2 m( Q
legend.title=element_blank()), r. X; f5 ?! {; r
4 Q8 F' J3 j: m2 T
![]() * D" K- E# q6 X5 M( C
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
$ n# a5 k0 D% r8 Q/ Y4 ~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)) ![]()
) x6 H x" o/ e! ^* Z- U! |+ F1 l0 k2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
5 R4 y$ v% S: U3 [8 i+ j9 Q' \cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
8 g. O4 {% y2 n7 k$ scolnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient") O! e* }' d j1 I7 s& X% R
five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))3 O1 P: U2 v! ~4 }! _
five_country$date<-as.Date(five_country$date)
. F: f5 D# a0 F0 k& `: N, W( J V$ K6 H, c8 `. B2 B
ggplot(five_country,
0 N- x) S2 a' u. x- a$ g+ a7 X aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + & T; t0 m: p5 f
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) + 1 O5 \# _% t$ j* u. T$ y7 k
geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ 2 S$ ~" i* F/ h9 F9 y
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
; X$ ^, n4 W8 n$ a3 e! } theme(legend.position="none",
& | B) D1 @8 m panel.background=element_rect(fill='transparent'),; Q0 R6 b. E0 T$ b& g# x
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),( I0 A3 ^. p- z% @
panel.grid =element_blank(), #删除网格线* u0 B/ z& X! A+ \! g
axis.text = element_blank(), #删除刻度标签
, ]$ t' q8 U! G5 {. u/ y( } axis.ticks = element_blank(), #删除刻度线
# u* j! J5 d8 i2 L6 Q )+: f1 x R7 Y3 G' k
coord_flip()+
2 c k4 B, M& W( L transition_manual(frames=date) + #动态呈现
; H5 q! u" p b labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
2 k& h" x' a$ e3 z0 Q9 D theme(axis.title.x = element_text(size=15))+
$ B* I. N$ G1 U# _; u$ |$ m3 H ease_aes('linear')
! ?& k- R! x/ c# `" S5 X. ], G
4 T) N4 d2 w8 \2 S" e7 C" s' W1 Ranim_save(filename = "五国累计确诊病例增长动态图.gif")
! z+ y2 H d: h* y+ n# c0 b. T- A" y5 q$ ]- r& F+ _
![]()
% Z O* U$ N0 A1 ^$ v# c3 Q% z' g) a" O& v+ ?' M' Z
0 v. E/ M5 x3 X. M
# N0 J' p& O% e' l D0 T
|
zan
|