- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40356 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12818
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化
' d/ T* {' C2 [目录
) K/ M) D- e6 A. W" W( X0 O2 g一、数据介绍及预处理: B. t3 v: B7 r A, f
二、新增确诊病例变化趋势
: w+ O! l% X* ^三、新增确诊病例全球地理分布
3 p$ P* U3 ~% [: K' x, T四、累计确诊病例动态变化图8 B" l- d: ~. w( J8 c5 J
一、数据介绍及预处理
: E6 a: }: G2 }1. 基本字段介绍
7 T3 x+ h* Z0 X+ N: Y, y$ I' i( I# g1 ]% f2 I, ?: w+ I/ Y
字段名 含义
: H) P- \; [+ x; N( T( w6 sProvince/State 省/州2 z* z+ \6 }: O+ g$ \+ W) ^! \
Country/Region 国家/地区
) x- m- E' e n6 dLat 纬度
! i& S7 I3 A2 i2 z; Z& x8 HLong 经度4 m- k0 X4 X+ _, M8 B. R
1/22/20-12/7/20 每日累计确诊病例
7 J; r' o m+ {. W& k3 J) g' h! a2 W! q) ^7 ]+ @+ _
. ^ n }' C* k
, j* c; w2 e2 E" F2 _5 M2. 数据预处理 - 整理某些国家的名称,如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)]
- E& F2 |) |9 w3 F8 i7 d[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)]+ h9 N6 Q5 l8 Q
[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)]
2 e6 [- V5 \4 {[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)]9 Q# w; V- A5 s4 K3 |
[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
: \# \# `, n+ y2 e c( Dinspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])
3 U$ i6 P7 S% z3 A9 ~$ sincrease_data<-inspect_data-inspect_lag_data- p/ F, ? L* R7 d
0 b& X5 r6 C% x. t
#合并数据,new_data为新增确诊人数数据6 N& m, c9 H+ X9 X; y
new_data<-cbind(information_data,increase_data)3 R/ H- A; K' w
1 u9 ]! p! z6 ]
1. 中国新增确诊病例变化趋势& o6 D9 L& G2 Y7 o7 g
#合并所有省份新增确诊人数
: C; x" _% S1 f2 v6 N% c3 Echina<-new_data[new_data$`Country/Region`=='China',]
- V& A* [( u/ U; O8 e# Vchina_increase<-data.frame(apply(china[,-c(1:4)],2,sum))( N) q/ D: ^# M" V4 F7 E
colnames(china_increase)<-'increase_patient'
4 l2 R( B; @; t( [+ j8 o: gchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")3 G, T$ [8 t- ]% P j
+ E7 T) _& U6 `2 [8 m3 B4 z0 Sggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)++ d; M1 O0 {4 E" u( C# ?1 s' r
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)6 F1 G2 k% i. @/ L; x
labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+( m% j4 \ G) l' ~* G0 T- h8 b
theme_economist()+ #使用经济学人绘图样(式ggthemes包)# C% ]: `; k0 e! r) B
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),( V/ A- H3 a& h2 q2 i0 V9 H5 q
axis.title.x = element_blank(),
% c: {; M" o) ]# q- V& s axis.title.y = element_text(size=15),
1 P7 ?# j/ X7 m/ S+ [ axis.text.x = element_text(angle = 90,size=15),) ?+ O5 m# Z- F# s* A- H
axis.text.y = element_text(size=15),2 z+ _- c" O0 C
legend.title=element_blank(),- V8 ]4 H9 V4 H4 c# c8 S
legend.text=element_text(size=15))
6 K: X/ W3 r: z4 m
: m. h1 r# I4 n! C ![]()
+ A' u, `$ I; J. w* |# Q5 r( R2. 美国新增病例变化趋势
9 ^: I, _8 [5 b5 mus<-new_data[new_data$`Country/Region`=='United States',]) }7 x2 @9 l4 }7 ~( ?1 e9 M- F
us_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
& A* p& _$ o2 ?1 {8 aus_increase$date<-as.Date(us_increase$date)# i+ Y# N# H- f
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
7 v* I/ c @+ d5 b( |1 h( w scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
7 L/ k7 W! k, @2 v9 A) O- M0 v labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
" ]4 G9 W( R; M$ D9 Q theme_economist()+ #使用经济学人绘图样(式ggthemes包)
" {8 J5 G9 L5 m7 p { theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
; O* q" s( C7 T2 I. `8 S; d% } axis.title.x = element_blank(),
5 h- s0 G' P; B0 H axis.title.y = element_text(size=15),$ A9 C: z" A: w4 \3 v& O( D
axis.text.x = element_text(angle = 90,size=15),
( |6 a2 i; |3 o4 I0 T* R/ Q axis.text.y = element_text(size=15),
3 I4 S c/ X G' p2 b0 c7 B9 w legend.title=element_blank(),
- l% W) b; ~) P; q3 n' C. w legend.text=element_text(size=15)) s5 W' C7 r; A e: s0 s5 ^# t
1 u0 M4 \& g* A( e) f 0 X8 ?2 M D/ z
3. 全球新增病例变化趋势( y" o" H+ `, F: Z# P
total_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
# L* \1 y7 n8 X& h& F9 L3 vcolnames(total_increase)<-'increase_patient'
5 c$ o, M# f8 U; Z: Ototal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")6 u5 w) {+ W$ t- |5 M D
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
_& Z. c5 y* |7 S scale_x_date(date_breaks = "14 days")+
. |4 F% s) t# r: p5 B3 m labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+9 Q% \2 y m. N$ g1 C6 ~
theme_economist()+
6 W! q- W2 r. ? scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
: F0 X2 p0 @+ g5 q% J breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),! _2 N* w$ a x" j& b F% ^
labels=c("0","20万","40万","60万","80万"))+
4 R# T$ j0 G8 x; \% X theme(plot.title = element_text(face="plain",size=15,hjust=0.5),( I! `, r |, T E- k8 C
axis.title.x = element_blank(),
5 t& q6 P. `6 v/ E! A axis.title.y = element_text(size=15),5 P u$ Q! O3 x" {
axis.text.x = element_text(angle = 90,size=15),2 x3 i9 ~! }$ [. B( U0 f8 @
axis.text.y = element_text(size=15),$ E+ ]+ W, x3 m0 C( _& F1 j
legend.title=element_blank(),$ i' S/ L# S( z/ {$ h# I$ e3 y0 J$ q
legend.text=element_text(size=15))
$ E# Q' G8 q( \6 w: A% q1 `+ z# P; B) D8 ?
![]()
& ^+ {# n$ P5 l三、新增确诊病例全球地理分布
- D( Z6 {7 S. H! |+ _' z' Umapworld<-borders("world",colour = "gray50",fill="white")
/ x+ G. a0 \$ k" h: \6 fggplot()+mapworld+ylim(-60,90)+; q$ J/ Q) V2 `+ ^: ~
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+# N- b/ U9 M0 Q$ ^; L4 I0 V+ w
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
9 Q3 P& t5 }, q( Q theme_grey(base_size = 15)+& _5 x ^; m% p2 ?5 T! ^
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
( s( F, d7 ?8 e legend.title=element_blank())$ L5 Y P* b! y- R
. o, {1 C; ]8 ^ l* f
ggplot()+mapworld+ylim(-60,90)+
: D( m6 Z- _9 r( z; g geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+
& y, _' N; `& F$ P; ^: K5 _( { scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+/ f; l9 t; b5 J
theme_grey(base_size = 15)+/ G+ P6 E! b1 ~) Q
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),- v! t, c0 @* Q% Q2 @# {
legend.title=element_blank())
( V; l( ^2 X7 g+ g$ S/ v+ D8 M% b; ]" X" B* Q, Q+ \4 T0 H2 g9 e# K
![]() % s, ~+ K# I9 O& \1 ?5 x
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
# ~* e4 q0 I' b/ E4 w2 d1 Y! Jcum_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)) 6 i% t$ K& W2 Q$ U9 x
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
1 [- ~3 K4 p, g. Xcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
$ Z! k7 m7 Z1 j0 @colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
3 H5 J' |! r) n" dfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))3 o" w- S9 i" h8 S# _& n/ s8 h
five_country$date<-as.Date(five_country$date)* S/ v6 r7 w) f- s, D9 r6 Y
! G/ M, c* o1 [5 ]
ggplot(five_country, 4 @3 P4 b9 E4 M+ j& c; A
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + ) X0 k1 J% `+ `
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
, I# j. `1 k B2 `* ` geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ : o! O" C3 G0 e& t0 {
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板! |0 V1 \; D8 i! c
theme(legend.position="none",
8 j' l- C6 e( N8 S. _# f! }4 M panel.background=element_rect(fill='transparent'),
: }+ i' r/ h# D. f axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
) _! h% j6 J% [5 K panel.grid =element_blank(), #删除网格线! `+ V; U; r% }& B& L4 m
axis.text = element_blank(), #删除刻度标签
- n% N; S7 `: Q0 j4 [6 f. N$ Y axis.ticks = element_blank(), #删除刻度线
& \ c: J) \$ s, ?/ m5 k )++ `: X" ~4 t6 Q2 f
coord_flip()+
/ i; m E8 I! o4 N$ {) F" e transition_manual(frames=date) + #动态呈现
: m% V- t# l* `; W2 L# C1 E labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
( [: z7 k( y* ?1 D theme(axis.title.x = element_text(size=15))+
Z( g+ ^9 |4 h! n ease_aes('linear')
# h: t s% w7 e; K9 q8 r9 _- r6 b& ?' Z. g3 U, r9 h }
anim_save(filename = "五国累计确诊病例增长动态图.gif")( }# z/ x# f6 C5 I- u. o. X5 | A4 g
3 D) U- ~9 F4 r![]()
6 j* g7 Y- B# J8 ]; l! M- H$ L A* m: j5 j9 e
: X0 p8 O; f4 d1 g1 o. m
% k; w' G& v4 ?! E6 O
|
zan
|