- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40325 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12809
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化
" e9 ]* Z$ F% h% q目录7 f! C3 z( r# J6 {% v
一、数据介绍及预处理
$ C9 ?! \5 e0 k: f; _二、新增确诊病例变化趋势
; a9 b6 ]9 f; v @三、新增确诊病例全球地理分布( I3 {0 Z3 A- @( V5 X5 }" N
四、累计确诊病例动态变化图
& l! U7 ^9 Z5 E* n- ?$ ^$ }一、数据介绍及预处理
5 b9 t2 s: B8 N( w1. 基本字段介绍% G2 ]6 e, V) d, A6 [; o5 _
& F$ H2 S" Z" m字段名 含义
5 H" L Q8 N+ j* e! B: ?1 |Province/State 省/州
# j0 L% o e5 Q: oCountry/Region 国家/地区% b, O9 l& q/ X
Lat 纬度: ]4 C8 I7 z& g! g2 s+ l: |2 J4 E
Long 经度) M; f) h- @/ x0 b0 D8 W8 ^7 ~7 P, o
1/22/20-12/7/20 每日累计确诊病例, h7 c: O; b5 |8 B) S& ], n6 \
0 ? J5 U* k3 d: r 4 G1 b1 p3 |) f2 u5 k
- G7 G2 @0 r, ]$ B, y& a- ^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)]
; W0 j2 ]; F) v8 g( t5 c' M[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 |# c6 \4 v% `
[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)]
! Q' b6 \7 l; {3 u[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)]
6 u* W( s7 F" o# L[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例
; I1 z* c" c3 ^4 H( G- kinspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])
5 c) O1 k, @7 T0 F. Kincrease_data<-inspect_data-inspect_lag_data, V4 T% S* P+ F1 B$ M! h. f
* u% z& \! \: b. T#合并数据,new_data为新增确诊人数数据
3 S% P) @+ L+ J7 U, Z* \5 Znew_data<-cbind(information_data,increase_data)
- D' D1 A7 C X: |5 b" F# G( `1 {2 a
1. 中国新增确诊病例变化趋势! u. h Z$ I; Z4 g$ v$ I9 ^( t
#合并所有省份新增确诊人数
! U0 `/ j( {+ Y9 A5 o' ~china<-new_data[new_data$`Country/Region`=='China',]0 d8 w* a4 w- z9 r
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum)). f. _( |0 f7 m
colnames(china_increase)<-'increase_patient'
- X% @% f/ r; K. r( D( l0 {5 Z+ `china_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
& P' ?5 m3 [' e4 N$ ]! }8 M6 L$ s8 s2 h' r
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+' j e1 `- f8 b c9 L( s* y# r& X" J
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
+ ^$ @4 H; u8 ~9 u5 L- q5 z7 t labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+' W" O4 @+ h9 w3 R0 n. W2 G
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
6 h9 g) p) u9 F3 c3 o0 Y' R2 w theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
( H& C7 e f) R `/ c axis.title.x = element_blank(),
2 V; P( a; A& ^9 U2 C+ s& u$ j axis.title.y = element_text(size=15),5 G9 S7 L# j0 o7 \8 Q
axis.text.x = element_text(angle = 90,size=15),
7 T7 y. k7 x. J0 H3 e. g axis.text.y = element_text(size=15),* ]$ R. H! o6 j* s1 L
legend.title=element_blank(),
! h& Y2 n$ m% m' b$ \9 @ legend.text=element_text(size=15))3 f; q3 g9 u$ J1 u+ g5 s
9 W( s' q5 s4 p8 z" D) W
- k2 h# N _- L# v" Q
2. 美国新增病例变化趋势
6 ]9 ?3 N# l) A# ?- A7 x0 `6 Q3 jus<-new_data[new_data$`Country/Region`=='United States',]
% x/ L$ @% c& M2 a3 u1 k) Nus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
5 X( n. J- l& e3 Y5 Sus_increase$date<-as.Date(us_increase$date)( D! B6 Y* q9 f+ O3 r0 D
ggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+4 x0 ?4 e! u) [/ W5 M6 `
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
4 q" N1 p( ^7 l4 k# q6 Y. j- `6 E labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
. \% u) F+ B- [/ m9 H f theme_economist()+ #使用经济学人绘图样(式ggthemes包). V3 C8 \. H% d- t& i+ y
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
& A- m3 R. z+ i2 [+ k% Q% t axis.title.x = element_blank(),
0 L& M; I4 @0 j& {9 Q( U' \ axis.title.y = element_text(size=15),
, _% G6 ~/ G0 \0 r9 @ axis.text.x = element_text(angle = 90,size=15),0 n& @9 J' a1 }4 b& G
axis.text.y = element_text(size=15),+ P3 w% O. ?5 z) c! j
legend.title=element_blank(),
" o( m+ q: c- Q# I8 y& b legend.text=element_text(size=15))
: z: J/ S- v5 U$ a- F A( | w" Q8 e) Z& H3 X8 a
![]()
1 z- r* u; ~& W" |7 V1 H" _3. 全球新增病例变化趋势
( Z6 V8 `0 X& gtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
; U3 m" c k7 G$ rcolnames(total_increase)<-'increase_patient'
; N1 C; }+ h% Z) |total_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")- w# _+ ?1 J) c/ C$ J! d
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+
2 K3 ~4 F4 x. |0 u$ a" I& h# X scale_x_date(date_breaks = "14 days")+
$ D U- h% O, }( O labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+
% D* D* z% N4 {- @8 O theme_economist()+) n& u$ T/ w# b6 ~2 `9 ~9 _
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
0 K7 y0 Z c" C breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),
' }1 t8 k6 G; }/ ]% h labels=c("0","20万","40万","60万","80万"))+* y) M5 ?% N, {+ Q4 j# ~! W
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),
* U: M& J3 @8 P. H axis.title.x = element_blank(),# u+ w) H* t+ \0 o/ L9 l. L
axis.title.y = element_text(size=15),; N1 [% T! D1 J- P) w2 [
axis.text.x = element_text(angle = 90,size=15),& T; r* a8 I* S- b
axis.text.y = element_text(size=15),
0 b/ T' l; d, D- | legend.title=element_blank(),
4 i4 D+ E* K% y: l) R legend.text=element_text(size=15))1 x7 c2 ?) Q ?( k9 h: x2 i
, I6 h$ B$ t/ q9 e# j
![]()
) U' u6 z9 _4 Y. u三、新增确诊病例全球地理分布
" H4 q& Q7 @+ p+ b0 ]( { q" Hmapworld<-borders("world",colour = "gray50",fill="white")
- H' D3 d0 y; Tggplot()+mapworld+ylim(-60,90)+
, f8 t d- c& X( g' n% L( N geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+
+ `' [! s5 P( ?# m$ v scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
( b0 m( M1 C; y8 W theme_grey(base_size = 15)+
0 S4 C7 o* o0 a8 s4 ^7 T1 X theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
& ^6 P/ }4 v/ N( r4 z% M. ~ legend.title=element_blank())* c5 T4 X0 o: b: \- l# f
9 B; ^8 E& d3 o: j5 t; o* h/ A
ggplot()+mapworld+ylim(-60,90)+; _; o# G9 \3 _1 g
geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+" f/ G0 u5 M6 O1 J3 h
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+" _: j* G5 O$ I
theme_grey(base_size = 15)+( r* |# ^" i5 \8 V& V g5 z" O
theme(plot.title=element_text(face="plain",size=15,hjust=0.5),6 b( I; E- D$ g
legend.title=element_blank())
1 g& ]- \( a7 C C2 @2 m; `5 P' Q9 [5 {
![]() ![]()
5 [# d% ]% ? y3 @0 o四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
0 S2 x& [* \6 v7 Y& Icum_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)) * M( N( `3 n" O1 H9 ~. U
2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图
& y; b2 c n9 i- @4 v2 jcum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
5 r9 @+ {) O( L! C% @8 lcolnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
' g3 ]4 Y, L( \, H; Dfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
: g @; C% p) K0 h7 v' Wfive_country$date<-as.Date(five_country$date)- w. r/ r6 i: l Q
4 F) Z+ j& j: c/ H# @
ggplot(five_country, ! y3 f+ J$ ?6 |$ N) P! _' r8 x
aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) + ! D, ?, J; C( m. N/ _8 i
geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
, B* G, @9 ?3 r t geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+ ! B- F4 y- R' A
scale_fill_brewer(palette='Set3')+ #使用Set3色系模板( e+ H) ]6 l& u2 m' G# \4 _
theme(legend.position="none",
1 U! e& v/ }9 K7 }: F3 F$ I3 P3 x) a* w panel.background=element_rect(fill='transparent'),
* ]5 }1 m& v& k1 j b/ R axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),
) v4 [7 l$ K3 c- T panel.grid =element_blank(), #删除网格线
, a: d: W0 m( a7 u% B* A+ X& F axis.text = element_blank(), #删除刻度标签
* i3 U' m5 ^/ R8 J0 Q9 x# a axis.ticks = element_blank(), #删除刻度线3 m8 Q! b& O6 V
)+' K% g& v: Z( a8 G. f! L
coord_flip()+ $ W0 r, B3 y7 e: }% d0 y) Q9 ~
transition_manual(frames=date) + #动态呈现) X% a1 F5 K2 A% m4 f
labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+ - ~6 o3 L2 Q# N+ c* D1 S' F( I! \
theme(axis.title.x = element_text(size=15))+
8 k0 F" T) G, ~) i- g+ V. p ease_aes('linear') ; k8 A6 O; e$ @ A' V- w9 c
/ W# Q, m* R' N: d$ Ranim_save(filename = "五国累计确诊病例增长动态图.gif")4 h4 ^. P7 J9 ~' p3 {. Z. I; j
4 l" N8 b; l0 n; s/ A![]()
+ m; D+ {: S5 [. }
1 x1 ]2 l. ^' D/ e$ ~, _! Y
% r9 `' J: C5 A& R; W, [8 K# q* A, l. f) @# o, l' w
|
zan
|