R语言与统计分析数据-R语言-图表-决策-Linux-PythonNGS

R-ggplot2-如何实现动态图的绘制与输出?实验科学/数据科

2020-01-09  本文已影响0人  TroyShen

目录


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. 总结

本篇主要解决以下几个问题:

  1. 如何基于ggplot2实现时间演进图的动态化?
  2. 如何将动态化的文件输出为gif图件?
  3. 如何实现动态图的分面?

10. 本篇所使用的软件包(没有的需要通过install.packages('')进行安装)

require(chron)
require(gganimate)
require(ggplot2)
require(reshape2)

11. 致谢

首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个简书技术平台, 代码共享推动科研进程, 多谢大家啦~

大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~


小编联系方式
上一篇下一篇

猜你喜欢

热点阅读