美文网首页R语言与统计分析数据-R语言-图表-决策-Linux-PythonNGS
R-ggplot2-如何实现动态图的绘制与输出?实验科学/数据科

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

作者: TroyShen | 来源:发表于2020-01-09 11:50 被阅读0次

    目录

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

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

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

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

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

    11. 致谢

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

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

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


    小编联系方式

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/pzqyactx.html