美文网首页ChIP-seq学习R可视化和ggplot2
答: 扪心自问,meme几何?

答: 扪心自问,meme几何?

作者: xuzhougeng | 来源:发表于2019-12-11 11:47 被阅读0次

在2018-04-06,Y叔推送了一篇文章 扪心自问,meme几何?。从一个不到146行的meme.R出发,提了5个问题。让检查我们的ggplot2的理解程度。

从我第一次接触ggplot2开始,至今差不多过去了2年多时间。Y叔推荐的「ggplot2: 数据分析和图形语法」和「R绘图系统」也被我翻得书页泛黄,加上近日又在学习Hadley写的 extending-ggplot2,近日终于有所悟,尝试解答Y叔提出的几个问题。

1. meme的输出不是图?为什么能画出图?

这一题,Y叔在 R绘图系统 的书评中给出了答案。

感谢译者送我的签名版,这是最全面介绍R绘图系统的书,没有之一。Base因为有大量的绘图函数还大量在使用,但做为新人学习,必须是grid系统!因为图是对象,可以操作,只有在需要渲染成静态图片的时候才产生图片。

更加详细一点,核心语句在于imageGrob <- rasterGrob(x)将读取的图像转成了grid的Grob对象,之后在此基础上构建了p,它继承了memerecordeplot。这里的继承是关键词,也就是第二题的答案所在。

2. 为什么+可以改变图的内容和状态?

解答这一题需要两个关键知识

  1. R语言是一个面向对象编程的语言,里面有一类泛型函数,可以根据你的对象类型自动调用对应的函数。
  2. +是函数。

Y叔为meme对象专门定义了一个泛型函数+.meme, 因此在调用+的时候,也就是调用了+.meme函数。

3. 为什么ggsave能识别meme对象

这一题是讨论ggsave的本质,如果你直接在命令行里敲ggsave,他会输出ggsave的源代码,倒数第二句就是答案所在。

grid.draw(plot)

ggsave在绘图商调用的是grid.draw, 这是用来绘制一个grob对象。而无论是cowplot,还是meme, 它们都建立在grid系统下,也就能够用grid.draw画出来。

而如果你调用的是print(meme),那么泛型函数会尝试调用print.grob

4. 为什么使用传统的出图方式来画meme,在循环中需要显示print(object)?而ggsave则不用?到底区别在那里?

这个问题稍微比较复杂, 我们需要先来实际的代码进行演示。

下面的for循环中,图形设备中不会出现图片,并且test.pdf打开的时候会显示图形损坏。

library(meme)
u <- system.file("angry8.jpg", package="meme")

for ( i in 1:10){
  meme(u, "code", "all the things!")
}

# 图片输出到新的pdf中
pdf("test.pdf")
for ( i in 1:10){
  meme(u, "code", "all the things!")
}
dev.off()

而下面的代码中,图形设备会打印图片,并且test2.pdf能出现图片。

for ( i in 1:10){
  p <- meme(u, "code", "all the things!")
  print(p)
}
# 图片输出到新的pdf中
pdf("test2.pdf")
for ( i in 1:10){
  p <- meme(u, "code", "all the things!")
  print(p)
}
dev.off()

为什么要在for循环里要用到print才行呢?

我们在R的控制台(console)运行meme时,实际上R会给你调用对应print函数答应。而在for循环中,它不会调用print。因此你必须要显示的调用print才行。

In a loop, automatic printing is turned off, as it is inside a function

参考: https://stackoverflow.com/questions/4716152/why-do-r-objects-not-print-in-a-function-or-a-for-loop

5. 为什么meme对象能够被ggimagecowplot识别?

Y叔说的马甲其实就是指meme继承了recordedplot,不过现在版本的cowplot似乎搞不定

cowplot::plot_grid(p, p, ncol=1, labels = c("A", "B"))
# 报错如下
Error in value[[3L]](cond) : 
  invalid "recordedplot": Incompatible graphics state
In addition: Warning messages:
1: In restoreRecordedPlot(x, reloadPkgs) :
  snapshot recorded in different R version (pre 3.3.0)
2: In doTryCatch(return(expr), name, parentenv, handler) :
  snapshot recorded with different graphics engine version (pre 11 - this is version 12)

而为什么ggimage能够识别呢?ggimage是创建了一个专门的geom_image图层,为此Y叔利用ggproto,基于grid系统创造了一个GeomImage 类。这个图层就是用来绘制图片。

相关文章

  • 答: 扪心自问,meme几何?

    在2018-04-06,Y叔推送了一篇文章 扪心自问,meme几何?。从一个不到146行的meme.R出发,提了5...

  • 基因家族鉴定--motif分析

    1.用到了MEME在线网站MEME - Submission form (meme-suite.org)[http...

  • House on the Mango street

    Meme Meme moved into the neighbourhood after Catchy moved...

  • motif 分析

    The MEME Suite http://meme-suite.org/index.htmlJASPAR - a...

  • meme

    meme-->模因,梗,meme是文化这个宏达概念的最基本组成单元,从这个角度来说,可以理解为梗是文化带组成单元,...

  • MEME模体分析

    一、按照构建的进化树排列蛋白序列 二、利用meme预测蛋白结构 (网址:http://meme-suite.org...

  • Meme 20160426

    1 非沙盘游戏要求控制玩家的体验路线,就像拍电影一样,要设计哪里是铺垫、哪里是高潮。 就像一架台灯。你要根据使用的...

  • Meme 20160420

    看订阅邮件的时候,突然觉得自己回到了十几年前,通过邮政订阅杂志的年代。同样是付费并提供地址,只不过现在的内容寄托于...

  • Meme 20160421

    看了诸多游戏设计分析稿之后: A:我要买 ps4 我要买 pc 我要血缘2K辐射打枪开车…… B:说的好像你有时间...

  • 错过了 DOGE 和 SHIB?你需要重新吃透 meme 经济

    Meme 经济也是 21 世纪资本主义个人体验史:是在正确的时间辨别出正确的稀缺数字 meme。 撰文:Kyle ...

网友评论

    本文标题:答: 扪心自问,meme几何?

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