- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
可视化实例基于R语言的全球疫情可视化
6 g9 s! Q5 `5 d# v4 G$ j目录
8 L/ S2 Q9 n) e5 L一、数据介绍及预处理; N# s: ~; g: k. d Y2 [
二、新增确诊病例变化趋势
6 x- O; o1 M" R4 \- e# N: L三、新增确诊病例全球地理分布
, d; p! j T! E1 w W0 `4 @四、累计确诊病例动态变化图
2 n1 }3 u: d. l* r一、数据介绍及预处理2 B j: B3 [$ X/ ]4 [! u# {
1. 基本字段介绍+ u; a# D$ o1 v! o1 ~/ m
8 Q! j" r, \& m
字段名 含义3 [+ N, |% O/ Q |- u
Province/State 省/州
' n" C! C- _/ Z$ E4 DCountry/Region 国家/地区# m r+ H. J, C# g; K( ?9 Q
Lat 纬度
0 B* S; S, t# p- Q* P# @Long 经度: n8 T; V* |7 q
1/22/20-12/7/20 每日累计确诊病例
+ m3 A6 _# \! B0 p9 }& B3 c; _, A$ d% V* q! f8 |. A
& f: l4 h* O4 F4 \ s J' s
# z7 ?/ x! j0 t, z5 c2. 数据预处理 - 整理某些国家的名称,如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)]
4 P& P- Z& j! M a p9 p[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)]! t6 ^0 {( B3 T; O i
[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)]
6 p- T( ?: g g# [3 w% w; 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)]
; b& H0 O) l! b- R, C q[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)]二、新增确诊病例变化趋势#由累计确诊病例计算新增确诊病例: u7 v9 l" \3 P' C* ]+ g& W) r
inspect_lag_data<-cbind(0,inspect_data[,1 ncol(inspect_data)-1)])# G$ W( v0 R7 C
increase_data<-inspect_data-inspect_lag_data1 z$ _- X" c. v% |6 e/ j/ `
2 v# z2 h" M2 a3 J#合并数据,new_data为新增确诊人数数据
4 y# W( J7 O3 dnew_data<-cbind(information_data,increase_data)
# _5 S4 Q/ @8 D' W8 K2 }) V* Z8 w/ G2 v# p! T0 R
1. 中国新增确诊病例变化趋势
0 Q0 A3 q6 H$ s/ n0 c! t#合并所有省份新增确诊人数' k U7 v6 U2 {
china<-new_data[new_data$`Country/Region`=='China',]9 n3 M, b0 V% w
china_increase<-data.frame(apply(china[,-c(1:4)],2,sum))
2 X! y/ p7 p2 ~colnames(china_increase)<-'increase_patient'
4 T- B3 r9 ?9 E0 e. Nchina_increase$date<-as.Date(rownames(china_increase),format="%Y-%m-%d")
8 X; W5 g7 H. `& p. \- I6 E6 B. W1 c, M' E, l8 c0 z q
ggplot(china_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+ n% A5 ]. K" B9 b3 U9 x3 E& z" ]1 U
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天(注意:此时的date列必须为日期格式!)
" H1 | L6 s) y$ @, \ r labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日中国新增确诊人数变化趋势图')+1 ^" B u V3 E! P7 ]: P
theme_economist()+ #使用经济学人绘图样(式ggthemes包)
% A' Q1 H! W: [: F7 r: s( J; I theme(plot.title = element_text(face="plain",size=15,hjust=0.5),; B/ e: A+ I. d
axis.title.x = element_blank(),
/ n6 K v, D" N axis.title.y = element_text(size=15),
( _& |: f% r* b axis.text.x = element_text(angle = 90,size=15),
1 ^* \# P" Y5 u0 X axis.text.y = element_text(size=15),
- P, N3 ^1 D- n$ W0 j legend.title=element_blank(),! X( _. l7 O+ R6 {
legend.text=element_text(size=15))
3 {4 G+ w3 S) N* ^. I4 K
6 `2 t* q1 ]5 Q% t% F8 X ![]()
i R( H7 G7 x3 ^, R x2. 美国新增病例变化趋势
, B+ p9 U/ f' f4 z& b0 }% uus<-new_data[new_data$`Country/Region`=='United States',]
+ U/ I/ h# f& j- D/ k( [1 F$ P1 Lus_increase<-gather(us,key="date",value="increase_patient",'2020-01-22':'2020-12-07')
! m/ f# z3 c/ t; Q, \% L2 {us_increase$date<-as.Date(us_increase$date)
0 P$ e' [" h5 ^* z% \5 ^4 f, P( R/ W3 p4 cggplot(us_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+( @9 }4 N- G2 `% \
scale_x_date(date_breaks = "14 days")+ #设置横轴日期间隔为14天
9 m9 K. W0 \. h" a/ n% j labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日美国新增确诊人数变化趋势图')+
9 i" Z" c& R. }6 R4 i5 y theme_economist()+ #使用经济学人绘图样(式ggthemes包), l4 w' w/ _4 ^+ r4 _( O
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),0 @- m- n$ M, E9 _. Q1 }
axis.title.x = element_blank(),
3 D; ]; H9 A) n% {0 n+ c7 S% L axis.title.y = element_text(size=15),
& D9 T# u: |$ T, P7 f7 b axis.text.x = element_text(angle = 90,size=15),
$ j7 S3 }' G& i; ^: t axis.text.y = element_text(size=15),/ `$ X2 q6 t% ?' m
legend.title=element_blank(),
# q# T: W0 J; t J9 V/ n! r/ v4 B legend.text=element_text(size=15))8 W1 V" p' M2 M( v; j
4 ]4 q/ j4 H" g v9 p p% `2 t/ W0 f- p1 q1 U# J5 P( z
3. 全球新增病例变化趋势
# c' O7 K' W! [* Jtotal_increase<-data.frame(apply(new_data[,-c(1:4)],2,sum))
( M0 T: f9 g# Ecolnames(total_increase)<-'increase_patient'
. ^) x: } ]2 j# @# Ktotal_increase$date<-as.Date(rownames(total_increase),format="%Y-%m-%d")$ E, B3 T6 f1 D: u( \' v7 p
ggplot(total_increase,aes(x=date,y=increase_patient,color='新增确诊人数'))+geom_line(size=1)+$ f0 y) v! G8 C; `! X4 p8 ~1 a
scale_x_date(date_breaks = "14 days")+
: |# Q1 e+ W. v- [6 L. V a labs(x='日期',y='新增确诊人数',title='2020年1月22日-2020年12月7日全球新增确诊人数变化趋势图')+' |" @$ @+ x( q8 W. Y
theme_economist()+, C' ? f) [ v
scale_y_continuous(limits=c(0,8*10^5), #考虑数字过大,以文本形式标注y轴标签
4 B7 [; t0 y" R/ {6 d# m3 E breaks=c(0,2*10^5,4*10^5,6*10^5,8*10^5),- v) B; d2 s" {: N4 p
labels=c("0","20万","40万","60万","80万"))+7 p! x1 P: }. c6 W
theme(plot.title = element_text(face="plain",size=15,hjust=0.5),) X" s8 ^5 @6 Y8 E) o* g8 l
axis.title.x = element_blank(),
4 a6 E- [9 H1 j! C7 |, T. u axis.title.y = element_text(size=15),2 z; \+ w$ n8 o/ V( t
axis.text.x = element_text(angle = 90,size=15),' H+ K( k# ~. t) n, @/ z
axis.text.y = element_text(size=15),
: z) ^5 a# t+ ]! c7 Y' e legend.title=element_blank(),8 ^6 |1 X1 M* m" ^4 {3 _: H( U
legend.text=element_text(size=15))# _% R/ p6 H+ E# K: B. R* L+ P) ?: h
0 R( K, P& Q2 h) _9 g/ U7 N6 z![]()
( K% m# K6 s( Y* J& W5 h三、新增确诊病例全球地理分布: ~7 `5 Y2 Z" ]/ @0 B' X
mapworld<-borders("world",colour = "gray50",fill="white")
. w; p) l; v& c: w/ eggplot()+mapworld+ylim(-60,90)+
b; x5 ]8 F" ~ geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-01-22`),color="darkorange")+' l8 u$ Q/ m* u
scale_size(range=c(2,9))+labs(title="2020年1月22日全球新增确诊人数分布")+
1 s( H: B# X: x0 M+ w theme_grey(base_size = 15)+
; R5 T/ k* V" ]) w9 V1 _ theme(plot.title=element_text(face="plain",size=15,hjust=0.5),0 u- V% `& j4 v. u
legend.title=element_blank())
2 [' y( {2 A6 K2 Q5 r0 S" R6 z0 D
ggplot()+mapworld+ylim(-60,90)+
* W" Q0 |2 s4 N geom_point(aes(x=new_data$Long,y=new_data$Lat,size=new_data$`2020-11-22`),color="darkorange")+, j i3 n# n) W% I- R9 g
scale_size(range=c(2,9))+labs(title="2020年11月22日全球新增确诊人数分布")+6 O( P6 f8 R: N' U
theme_grey(base_size = 15)+
7 s: E+ l0 r% O' M# c0 ^0 F/ R theme(plot.title=element_text(face="plain",size=15,hjust=0.5),
- A# e( |9 V. b+ f9 c" ~4 |) z legend.title=element_blank())
$ }6 c0 v$ `. `) O$ [# ^- b9 x/ |$ t3 Q2 U
![]() $ [3 V) U: G9 t g( d
四、累计确诊病例动态变化图1. 至12月7日全球累计病例确诊人数前十国家
$ o' V* H, V$ y6 S0 R5 U, y+ Xcum_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)) ![]()
4 R: b) q$ `( }/ W" X; U2. 五国(India、Brazil、Russia、Spain、Italy)累计确诊病例动态变化图+ W. ~) O- Q5 [
cum_patient_time<-gather(data,key="date",value="increase_patient",'2020-01-22':'2020-12-07'), @0 @9 D1 B% P) H: d) Q* y) R
colnames(cum_patient_time)<-c(" rovince","Country","Lat","Long","date","increase_patient")
& N+ S6 L- g$ w6 v1 C! M$ o) Rfive_country<-subset(cum_patient_time,Country %in% c("India","Brazil","Russia","Spain","Italy"))
7 C8 H9 Y1 X9 E/ Z# O6 Tfive_country$date<-as.Date(five_country$date)
& \5 n+ b: _3 M/ z' ]* N! w
3 Q% b' _* R8 g9 Hggplot(five_country,
6 z6 o3 F: `% I/ @5 Y aes(x=reorder(Country,increase_patient),y=increase_patient, fill=Country,frame=date)) +
" n: e5 c x6 `) { geom_bar(stat= 'identity', position = 'dodge',show.legend = FALSE) +
/ r% g- [; f% J9 a* z8 V geom_text(aes(label=paste0(increase_patient)),col="black",hjust=-0.2)+
4 B0 I7 O. P% H# C/ b) ^3 X9 i scale_fill_brewer(palette='Set3')+ #使用Set3色系模板
# ^1 }8 b5 m3 }! @; c5 z/ N9 N theme(legend.position="none",
5 t" Z5 F- B9 t$ |4 O& Z8 H B* { panel.background=element_rect(fill='transparent'),2 N5 n) Z& _" Q% T- j& a$ g7 k
axis.text.y=element_text(angle=0,colour="black",size=12,hjust=1),& }* }) M4 j( N# W/ D
panel.grid =element_blank(), #删除网格线2 A2 Y2 X& _8 x
axis.text = element_blank(), #删除刻度标签
7 v5 L$ B; P; j4 i& N6 B axis.ticks = element_blank(), #删除刻度线
8 J0 X& F& j9 Z+ S )+* Y1 s, W. J7 L$ ^2 l2 E- [
coord_flip()+
6 ^( ^# p( q2 Q; [3 _& A1 _" Y( D transition_manual(frames=date) + #动态呈现
% y7 q# }5 q, u labs(title = paste('日期:', '{current_frame}'),x = '', y ='五国累计确诊病例增长')+
2 n' O. `/ _) c theme(axis.title.x = element_text(size=15))+
9 j# v' q) R4 |# e* ?7 r ease_aes('linear')
: G D M& \% J4 L( |% R0 H7 e7 ^# k: o$ B9 M
anim_save(filename = "五国累计确诊病例增长动态图.gif") t1 F, B0 Y- I4 c/ i# ]
4 S( @1 k* H8 X0 a( t - ?9 U s* H1 f |
! K. Y- }+ R5 D
" s" w8 E2 g. h! {3 K, t- o6 ?" V& j# V# v6 p; S* Y) t% k# f
|
zan
|