目录
- 0.问题导入
- 1.示例数据
- 2.导入数据与数据预处理
- 3.绘图data.frame重构
- 4.图件x轴label 设置
- 5.静态图初始化(图1)
- 6.静态图动态化及动图输出(图2,耗时)
- 7.静态图分面初始化(图3)
- 8.动态图分面(图4,耗时)
- 9.总结
- 10.本篇所使用的软件包(没有的需要通过install.packages('')进行安装)
- 11.致谢
0. 问题导入
我们有时候会有分析动态监测数据,比如实验测试数据,长序列降水数据等。当然,在做论文/分析报告的之后,静态图就可以满足我们的要求。但是,当我们在做汇报的时候,一幅幅的动态演进图真正实现动态是不是会更加锦上添花呢?嘿嘿嘿,今天我们就在本篇实现这个操作。
1. 示例数据
2. 导入数据与数据预处理
setwd('/Users/jerseyshen/Documents/JianShu_Project/20200109')
df_res = read.csv('test_data.csv',header = T)
df_res = df_res[,-1]
df_res = as.data.frame(df_res)
df_res$Wave1 = as.numeric(df_res$Wave1)
df_res$Wave2 = as.numeric(df_res$Wave2)
df_res$Wave3 = as.numeric(df_res$Wave3)
df_res$Time = as.character(df_res$Time)
df_res$Time_sec = unlist(lapply(
lapply(strsplit(df_res$Time,':'),as.numeric)
,function(x) x[1]*60+x[2]
))
head(df_res)
Time Wave1 Wave2 Wave3 Time_sec
1 37:22.0 0.0000000 0.007400000 0.004520000 2242.0
2 37:22.8 0.6963507 0.002682733 0.002713600 2242.8
3 37:22.2 0.1735450 0.002716643 0.006014286 2242.2
4 37:22.3 0.2778986 0.003336429 0.004400000 2242.3
5 37:22.4 0.3727643 0.002163564 0.003708214 2242.4
6 37:22.5 0.4401000 0.003809973 0.004718000 2242.5
3. 绘图data.frame重构
df_m = melt(df_res,c('Time','Time_sec'))
df_m$value = as.numeric(df_m$value)
4. 图件x轴label 设置
labels_x = df_res$Time
index = seq(1,81,20)
breaks = df_res$Time_sec[index]
labels_x = labels_x[index]
5. 静态图初始化(图1)
p1 = ggplot()+
geom_line(data =df_m, aes(x = Time_sec, y = value,color = variable),
size = 1)+
scale_x_continuous(breaks = breaks,labels = labels_x)+
theme_bw()+
theme(
axis.text = element_text(face = 'bold',color = 'black',size = 12),
axis.title = element_text(face = 'bold',color = 'black',size = 14, hjust = .5),
legend.text = element_text(face = 'bold',color = 'black',size = 12),
legend.title = element_blank(),
legend.position = 'bottom',
legend.direction = 'horizontal'
)+
xlab('Time')+
ylab('Wave')
png('p1.png',
height = 20,
width = 20,
units = 'cm',
res = 600)
print(p1)
dev.off()
图1 静态图初始化
6. 静态图动态化及动图输出(图2,耗时)
ggplot2 动态图输出格式为gif图。其中,anim_save函数是基于ggsvae的,因此可以在其中设置width,height等图幅变量。
p2 = p1+transition_reveal()
anim_save('p2.gif',p2,
width = 20,
height = 15,
units = 'cm',
res = 300
)
图2 静态图动态化及动图输出(
对比图1-2,是不是会发现Wave1变化很大,Wave2-3变化甚微呢?不,其实Wave2-3相对与Wave1波动很大,只是受值域影响,在y轴上被压缩了。
那么,我们应该如何体现出Wave2-3的波动呢?静态图中,我们可以选择分面操作,但是动态图还可以分面吗?答案是肯定的~
7. 静态图分面初始化(图3)
p3 = ggplot()+
geom_line(data =df_m, aes(x = Time_sec, y = value,color = variable),
size = 1)+
scale_x_continuous(breaks = breaks,labels = labels_x)+
theme_bw()+
theme(
axis.text = element_text(face = 'bold',color = 'black',size = 12),
axis.title = element_text(face = 'bold',color = 'black',size = 14, hjust = .5),
legend.text = element_text(face = 'bold',color = 'black',size = 12),
legend.title = element_blank(),
legend.position = 'bottom',
legend.direction = 'horizontal'
)+
facet_wrap(~variable, scales = 'free_y',ncol = 1)+
xlab('Time')+
ylab('Wave')
png('p3.png',
height = 20,
width = 20,
units = 'cm',
res = 600)
print(p3)
dev.off()
图3 静态图分面初始化
8. 动态图分面(图4,耗时)
p4 = p3+transition_reveal()
anim_save('p4.gif',p4,
width = 20,
height = 10,
units = 'cm',
res = 300
)
图4 动态图分面
9. 总结
本篇主要解决以下几个问题:
- 如何基于ggplot2实现时间演进图的动态化?
- 如何将动态化的文件输出为gif图件?
- 如何实现动态图的分面?
10. 本篇所使用的软件包(没有的需要通过install.packages('')进行安装)
require(chron)
require(gganimate)
require(ggplot2)
require(reshape2)
11. 致谢
首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!
大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个简书技术平台, 代码共享推动科研进程, 多谢大家啦~
大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~
小编联系方式
网友评论