- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40293 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化
% Q. ]+ {0 R& H/ H. G8 Z- |目录
& }, u: r; \; {; ~7 s( v一、数据介绍及预处理7 Q; y: r9 b2 g
二、新增确诊病例变化趋势
9 e/ F/ ^' c: z* f: f% }. J* c三、新增确诊病例全球地理分布
+ i+ d; P- [% v/ ?$ }+ Z# R `" T四、累计确诊病例动态变化图
1 S- E+ [/ [ |6 L一、数据介绍及预处理/ w L6 X) }; t7 U" P3 Q
1. 基本字段介绍" n; D0 o6 V. c# F1 Q6 c, C
! V# O! J+ z# x
字段名 含义
7 a7 ]: R( w6 a. _, y: w: JProvince/State 省/州9 h3 N; Y6 d2 x0 @4 |3 Y& D) l# Q3 e
Country/Region 国家/地区
0 J/ y; |. r! u: Z: g ~6 kLat 纬度. f) _" G/ N1 n. x& z: J
Long 经度
^7 d5 O- F; q: |" V& t1/22/20-12/7/20 每日累计确诊病例, f1 m( E! X9 F- b& B
, i% D7 |# C% L5 L" n
![]()
: x9 J3 T+ H8 K$ t
% s3 r9 B+ d3 N6 f2. 数据预处理 - 整理某些国家的名称,如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)]" G1 m' {! m/ q) k( ^/ y B/ 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)]1 q: p$ P$ N4 _* p7 L, j
[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)]. J: X( |. |6 [ j/ O
[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)]
* t; M) B' e/ Z4 R3 W[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
' X) ^, g$ a, ?8 Iinspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])2 u# X! k# i% n$ K& H$ ^$ G6 z$ T/ [' W
increase_data<-inspect_data-inspect_lag_data7 i: m3 R9 [9 t2 v: @+ M
6 x' |. W) U+ n$ J2 i8 z) b- S
#合并数据,new_data为新增确诊人数数据
) g E! e7 F0 g, v/ Lnew_data<-cbind(information_data,increase_data)
5 [9 Y5 R) j+ ^6 ?8 }0 T
$ }; K2 F; `5 N1. 中国新增确诊病例变化趋势
: s5 {, b/ G# @#合并所有省份新增确诊人数
/ i6 \- F) _; S% pchina<-new_data[new_data$`Country/Region`=='China',]
# L I/ I7 I8 M# G3 `" M# M4 Ochina_increase<-data.frame(apply(china[,-c(1:4)],2,sum)) ~9 B2 r+ z V. `, n- e$ a
colnames(china_increase)<-'increase_patient') ^# i# n7 B+ Q0 n4 ~% T7 |- T. F2 u
china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")1 p' k5 d5 F& A
k: n( t! F W- N6 t u
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
4 a/ n! e7 e6 Z/ x) v scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
7 Z/ D* x j$ L% z. N labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+* l; C4 n6 ~' S! y' r8 _
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
- ^7 G; \% ~6 d/ a, Z theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
" e8 \9 U$ V0 o4 T6 D6 t5 x axis.title.x = element_blank(),
+ x' U( q, J) U7 L axis.title.y = element_text(size=15),5 R6 E) Q8 u% W7 n) e& W# r
axis.text.x = element_text(angle = 90,size=15),* x9 z( ]& y, u
axis.text.y = element_text(size=15), y$ {. g& k7 M
legend.title=element_blank(),4 k, H% S- ]) }3 w! \2 G
legend.text=element_text(size=15))
7 Q6 S2 [/ A6 e( a& e$ N7 G% ]
2 h0 ^4 O8 F7 f0 Z) L! X: @9 h
2. 美国新增病例变化趋势) Z0 W7 i8 A5 v1 J( L9 B
us<-new_data[new_data$`Country/Region`=='United States',]0 M9 s1 m$ P/ h( _% T
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')% ~" A5 Q; _( U. S4 P q/ D# | c$ e
us_increase$date<-as.Date(us_increase$date)
4 h7 y4 `! c9 I s& uggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
0 I5 q( n: U1 [ scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
" r% Z* W7 y2 w: j2 f' e/ P labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+8 ^3 S6 I: M6 J$ J' b2 |
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
/ z# ]* |0 Z3 T theme(plot.title = element_text(face="plain",size=15,hjust=0.5),: y" S3 N# y% ~: B+ P( m
axis.title.x = element_blank(),+ ~+ n0 T, R. i! ]* |9 c
axis.title.y = element_text(size=15),8 o- v1 i) M( w* y, v l
axis.text.x = element_text(angle = 90,size=15),+ K8 `- T; ?) z1 X
axis.text.y = element_text(size=15),
1 X! W I* X% o* L K1 Z legend.title=element_blank(),
* d3 o8 A8 m! m) E2 M; P legend.text=element_text(size=15))5 C. o+ }' D: ~5 U5 ^3 f# I/ I
5 i( S+ T& b5 Q0 N
![]()
2 k) z* A/ z4 c6 j9 c, `3. 全球新增病例变化趋势: K% Z, x: Y+ T
total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum)) |: B9 s. w0 o# U8 D
colnames(total_increase)<-'increase_patient'% y# [1 C) h5 U- G2 H
total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")
B k& }# {9 ~. [% }ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+9 m7 u6 ~% `. S' I: Z4 [3 x7 C
scale_x_date(date_breaks = "14 days")+
) H. `0 F) [+ ] x% a labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+. v+ |, O5 [% Y
theme_economist()+, M3 Z7 G( V8 p) ]/ o/ F
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
; O$ X$ g: H0 F5 c6 H+ o breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
, [! D* ~$ p7 e' o' p1 i7 ]5 p2 Q' G labels=c("0","20万","40万","60万","80万"))+
/ P Q, c" k% S theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
3 e2 r# q0 i: q; s2 q axis.title.x = element_blank(),
: D$ g1 a# k' V2 V4 p/ k1 M& r axis.title.y = element_text(size=15),
' ^- E6 F( e* b' p axis.text.x = element_text(angle = 90,size=15),
6 D1 S4 n! |7 R5 k, z2 K axis.text.y = element_text(size=15),
( b! L7 |! c. |/ f# D+ _6 u" i/ P% n( d legend.title=element_blank(),
: L2 w' @5 k/ O& G6 W legend.text=element_text(size=15))! Y9 B8 H$ |9 R! a& @
, Z' r u, J6 n" t: T
- ?. `7 t( }8 ]0 I! o* g
三、新增确诊病例全球地理分布: ^! m$ J4 G6 ?+ D! f4 K
mapworld<-borders("world",colour = "gray50",fill="white") 6 e9 B5 H) p/ S" T6 [/ c) g& l
ggplot()+mapworld+ylim(-60,90)+
% r% ~( K% u' I+ J) j2 R6 l geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
9 v7 w& {' X H, [/ e( a scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+& h( X9 T' M- u! W* W3 K) D" `6 G
theme_grey(base_size = 15)+
9 B! K, u; t# L% D theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
, t& Y9 `* [5 ?1 K. k6 A% O legend.title=element_blank())
, q2 R# }2 v' Y, E3 N Q; M1 @" |6 f' `, E" |5 j: x* v( e4 o
ggplot()+mapworld+ylim(-60,90)+
3 L0 G3 ]! T4 g2 P geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
1 _# v9 E& ^% I( u4 b# q scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+
) K8 E- y/ M0 E2 k' l- e) J theme_grey(base_size = 15)+/ \) @; W1 \1 ]
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),1 H1 A: A4 v& i( u& X
legend.title=element_blank()), E9 z1 @/ _5 n3 O0 _3 O
( m8 }9 w# G' J! y; _0 Z6 _1 a![]() / k b) Y U; R/ N/ c
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
9 B6 i% R" B. j9 ?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)) ![]()
, a% ~* L/ v6 t( @& u# N2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图" q. v( w# i" [% ^' o- _1 k
cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')3 P% e; x: l* a$ v
colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")5 U; n3 s( f4 g
five_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
& D5 R0 W( D9 gfive_country$date<-as.Date(five_country$date)5 [7 N- [1 J2 |
5 q5 e' O( W9 q9 B+ Z6 p* ?ggplot(five_country,
* m% G7 G7 |/ K3 |0 z# x* c aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + " n1 h/ l% `) j) T
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
1 Z- ?7 k1 J8 `" m geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+
4 }$ @% B( S' m5 I7 x scale_fill_brewer(palette='Set3')+ #使用Set3色系模板8 U* {. ?9 z5 g: q3 t. C
theme(legend.position="none",
( d3 x, M& N2 L0 h panel.background=element_rect(fill='transparent'),
9 [4 \0 h# ]3 f: l# G; u S9 h axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),& y2 X, P. }3 l
panel.grid =element_blank(), #删除网格线: ~ x1 @2 g" R4 g9 ~! i/ |7 ?
axis.text = element_blank(), #删除刻度标签9 V) r, T6 q& h
axis.ticks = element_blank(), #删除刻度线& N/ j, {5 u" j: m
)+
3 E! H. t0 u7 @: B' N coord_flip()+ - w0 g" `) g2 g5 y; U2 h
transition_manual(frames=date) + #动态呈现+ h4 Z, [) r. {: K
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+ 4 c& N& ]( |3 D% k
theme(axis.title.x = element_text(size=15))+, o& A3 v4 j; M) y* A
ease_aes('linear')
$ A+ s! q |4 U. [7 a% d `6 { z& p3 Q6 E, u# @0 P
anim_save(filename = "五国累计确诊病例增长动态图.gif")) m) b8 }+ Q& M$ k2 C- g# @
6 }* b% S# F N$ y8 e# N+ `3 M5 G9 ]1 W : F( k% p! r6 Y
+ l0 |0 B' q9 a! V S. A* \
8 z, W( ^# |# M" Z; F7 J( P) v: L8 Q: P" o/ ?' ]
|
zan
|