- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40031 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12720
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化
7 m3 }# J( S2 e/ j% S目录
: K9 W/ z9 M, S- `% w* {一、数据介绍及预处理
7 X, y I: A: C* j二、新增确诊病例变化趋势8 [: w0 w/ S' p0 G8 W
三、新增确诊病例全球地理分布
7 J* Y3 j; k6 z5 R四、累计确诊病例动态变化图
! H8 N6 P* B1 d; P一、数据介绍及预处理# `, {8 q5 n& h
1. 基本字段介绍
, o" J' L. P+ D) B' F' ^
0 [. {) N1 D+ V, m7 W9 ?" A4 |字段名 含义
7 m1 F7 u5 f5 S: U6 c, B2 a. K& S& RProvince/State 省/州
7 q/ v" R5 A% v2 \( W% X/ {1 LCountry/Region 国家/地区, ~7 y6 Q3 q o- l: Z0 R/ \
Lat 纬度
- E2 A* l) y# @9 O1 H" H/ eLong 经度
$ V! R" E! Z$ V2 y1/22/20-12/7/20 每日累计确诊病例/ z# y8 D7 t! G
( x, `) i3 A6 e( C5 K![]()
( X" ]% E- X' `% D3 G% [( T
) j' l4 ^ x9 X2. 数据预处理 - 整理某些国家的名称,如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)]
/ ` a# e! U3 s# @% d% g[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)]
& b& [ X1 O0 S9 h[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)]- C" Q( Z! y6 R
[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)]- ^: W% [; c+ 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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例& Y% O! y8 W2 j/ H; V; [
inspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])4 b- `9 ?* ^, t; L- }; O
increase_data<-inspect_data-inspect_lag_data% m4 U }9 @. [" g
2 k o9 r' k1 }! F1 O5 a
#合并数据,new_data为新增确诊人数数据
* h" \- o* k3 Y. b5 O. Rnew_data<-cbind(information_data,increase_data) ?. B% b+ B+ Z) t" V F1 c
. G* _6 z- q/ S8 D1. 中国新增确诊病例变化趋势
( X8 R, I! o, n9 S" S; u8 C#合并所有省份新增确诊人数2 M6 V c. _! ^. {# f0 p4 d2 e
china<-new_data[new_data$`Country/Region`=='China',]
3 {; O! k3 t: J% J9 C$ Zchina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))) N: w2 e. @/ `) |
colnames(china_increase)<-'increase_patient'
+ b& v, P+ O$ o' U2 d9 ychina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")4 ~7 B' ~$ a: \7 ^1 |
2 ?' |. w" \- M. b3 rggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+5 \: @5 O9 N0 ^; p# [( A: X
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
7 n8 ?1 ?! }$ O; h0 r7 n labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+7 J. N! k8 L, P p, }: t# V8 P
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
; z4 r8 B$ U% o, m; k theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
3 w( z& V" ~! p K& }& t axis.title.x = element_blank(),
% Z: |9 _; }; x8 q axis.title.y = element_text(size=15),
/ r, Y$ M: `4 m7 R, @0 x) b axis.text.x = element_text(angle = 90,size=15),, F" [9 v- c* g' \$ }: U
axis.text.y = element_text(size=15),5 V4 @# G7 l# W+ }- S5 I. A
legend.title=element_blank(),& h4 j/ J4 h; U" V. a
legend.text=element_text(size=15))
( r. T J2 t# _0 X: A& N$ @& q4 g, t3 x0 t
# R6 N) P* Q. h5 L
2. 美国新增病例变化趋势7 I) x5 a8 Q1 {+ Q: s% x
us<-new_data[new_data$`Country/Region`=='United States',]3 n; d4 W, Y# f/ w+ j& {
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')8 T1 e" J4 g/ n8 U7 P! I2 u
us_increase$date<-as.Date(us_increase$date)
* ?- c2 w4 z4 Z9 Pggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+5 p. `: ^8 B* l" C4 N% Q# Z
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
! ~0 q* r" x0 G/ P7 K! Z labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+! F4 l& o4 M5 w6 r6 L. _1 q+ B
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
! Q% |( {! S. c; p9 H" _ theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
; s9 j6 s& y/ h$ W. F8 h! u- R axis.title.x = element_blank(),
' M5 ]3 {# J4 b3 X" ^" T axis.title.y = element_text(size=15),
4 A2 Z5 `1 M/ D2 T& n- ] axis.text.x = element_text(angle = 90,size=15),
$ y" o: Q2 b5 A5 Q% O: D axis.text.y = element_text(size=15),' [2 T* A. [6 _9 d
legend.title=element_blank(),/ a7 {3 B m' v3 D) j' c5 z7 J
legend.text=element_text(size=15))' b( f; O6 @, _# d& t e2 ^# w" u
4 O) v( I9 @" a" F, ^![]()
9 J q( K7 i' g8 Y7 Y; \7 C. V1 O' R3. 全球新增病例变化趋势- l7 k/ L- R( k6 E% t1 V
total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
4 y5 x! z) H% \; D- w; E/ f* o: T/ Lcolnames(total_increase)<-'increase_patient'
6 U% s4 F/ Y r* x. b& ntotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")3 ^) t* Y& z& N+ n& c
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
0 c: V, p0 k( m* x, x/ ~( `( V+ x scale_x_date(date_breaks = "14 days")+; s0 E* m7 ~% a
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+6 s" q1 Y2 p, e
theme_economist()+6 s; t9 W/ J& U1 i
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
3 w7 ^ c, T4 R6 K- ` breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),8 V5 i, I# S& m) X6 ]
labels=c("0","20万","40万","60万","80万"))+1 [0 P% \. Q% b Y0 W* n
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 S" {3 m4 x9 N- A
axis.title.x = element_blank(),
4 v# F. O8 G: |' \. T0 `- C" B( c axis.title.y = element_text(size=15),
) O( C3 k' f# F; z axis.text.x = element_text(angle = 90,size=15),: L' Z; o7 f$ q1 ^ x2 w
axis.text.y = element_text(size=15),
$ Z; j/ ]# y8 f7 f legend.title=element_blank(),
) D7 w* E% e* U& G& j8 G: M legend.text=element_text(size=15))- g# Z! ^2 ?9 F: s! c; j0 y
( I& n ]0 ~; x' b
; m. |9 S0 A+ M" X
三、新增确诊病例全球地理分布7 V8 w5 f8 l7 M( j
mapworld<-borders("world",colour = "gray50",fill="white")
! ]! g. R7 I7 X" O* U7 zggplot()+mapworld+ylim(-60,90)+
4 n$ N* }5 A& a; A" ^9 {' {- R- L geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
; l0 h: ]* @6 ^1 ~ scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
, m9 V$ U9 l4 [* F theme_grey(base_size = 15)+
V! n/ h8 T. l0 j0 J theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
1 ^: D# R6 d3 x8 E% q6 z6 C0 y legend.title=element_blank())8 w9 h( O7 N- G& w6 h4 F& J
5 l8 R) U9 U7 U1 H4 Lggplot()+mapworld+ylim(-60,90)+! b2 W9 N/ ~, X
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+2 Y( q. V+ i( @; k1 d3 h
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
3 P$ r1 H* E$ @9 \+ U; n; b, a theme_grey(base_size = 15)+1 x% `% C3 R! E0 H/ u- Z
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
% E" b! Y; h6 J( @2 i' E legend.title=element_blank()) e% d, m2 ^; P( N
$ L+ w8 {; i4 B8 e2 }
![]() ![]()
( X" s' f3 m& y# i& [) }* Y四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
j) q' P, ?+ v- \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)) ![]()
: d, I! q7 e& s4 X- F2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
+ {; s* N5 P/ B9 u6 m% u: ^cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')" D; Q6 B' x" W$ i4 i4 ^" c
colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")# J6 R: I6 X* }; I
five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))% G o# U0 m7 P) `: }. d0 f
five_country$date<-as.Date(five_country$date)# t! I( p5 _$ H- e( l6 E
: E* F6 T1 }) x% k7 r% h4 A2 Wggplot(five_country,
3 ?. v- @$ q) X: t2 Q aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +
: ^8 ^# |! u6 ^* D: v7 G geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) + $ {; U0 V9 F5 q1 z/ s# t O+ o" r
geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ . T2 ]7 N1 G9 `# \
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板, m% k: D% F3 R; U$ q
theme(legend.position="none",
0 a% o6 Y* V2 s# n* `: ?# z! C2 p( [ panel.background=element_rect(fill='transparent'),
$ I0 q; k+ b7 j W, i. q axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
- p2 v& u- [% B, t" ~9 } panel.grid =element_blank(), #删除网格线) [1 g. w! y' k! L7 q8 {
axis.text = element_blank(), #删除刻度标签5 T/ } d9 q& G6 k0 b
axis.ticks = element_blank(), #删除刻度线, Q- W1 L5 I8 U, k) U4 ]! e
)+
: G7 Y5 k# Y( I+ V; ]- X( |( o coord_flip()+ 0 X0 x4 ?# K/ J
transition_manual(frames=date) + #动态呈现
5 Q" b6 A6 _! F3 a* `& j labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+ * Y8 x) P# G: _6 @3 `2 o! V5 l
theme(axis.title.x = element_text(size=15))+
6 D8 v- G3 t. i# @, Y ease_aes('linear')
( V: b& l5 x6 @& |. `# x4 O, P5 N& T/ w2 K$ R
anim_save(filename = "五国累计确诊病例增长动态图.gif")
" S0 U2 q: T" f9 |, y$ w% X4 l: u7 ^( N1 \" e, m
* n$ l' E: T* k6 K! t! J- R
" p" N- [6 t* l' P: l
0 H/ v; ?, w$ ?2 n6 L4 H& j' J, M9 l4 q+ U% h% n4 z; D3 n' l6 o; o
|
zan
|