专栏名称: 生信媛
生信媛,从1人分享,到8人同行。坚持分享生信入门方法与课程,持续记录生信相关的分析pipeline, python和R在生物信息学中的利用。内容涵盖服务器使用、基因组转录组分析以及群体遗传。
目录
相关文章推荐
51好读  ›  专栏  ›  生信媛

ggproto第一课:如何写出自己的ggplot2图层

生信媛  · 公众号  · 生物  · 2019-12-09 21:52

正文

请到「今天看啥」查看全文


这部分内容是Extending ggplot2的学习笔记,大部分内容都是原文的简单翻译。

徐洲更

所有的ggplot2对象都建立自"ggproto"这套面向对象编程系统,因此想要创建出自己的一套图层,而不是简单的对已有图层进行累加,那么就需要学习"ggproto"。

创建新的stat

最简单的stat

我们会从一个最简单的stat开始: 根据已有的一组点,用一个凸壳(convex hull)包围他。

第一步,我们创建一个继承自 Stat 的"ggproto"对象

  1. StatChull ggproto("StatChull", Stat,

  2. compute_group = function(data, scales){

  3. data[chull(data$x, data$y), , drop=FALSE]

  4. },

  5. required_aes = c("x","y")

  6. )

在"ggproto"函数中,前两个是固定项,分别是 类名 和继承的"ggproto"类。而后续内容则是和你继承的类相关,例如 compute_group () 方法负责计算, required_aes 则列出哪些美学属性(aesthetics)必须要存在,这两个都继承自 Stat ,可以用 ? Stat 查看更多信息。。

第二步,我们开始写一个 图层 。由于历史设计原因,Hadley将其称作 stat_ () geom_ () 。但实际上,Hadley认为 layer_ () 可能更准确些,毕竟每一个图层都或多或少的有"stat"和"geom"。

所有的图层都遵循 相同的格式 ,即你在 function 中声明默认参数,然后调用 layer () 函数,将 ... 传递给 params 参数。在 ... 的参数既可以是"geom"的参数(如果你要做一个stat封装),或者是"stat"的参数(如果你要做geom的封装),或者是将要设置的美学属性. layer () 会小心的将不同的参数分开并确保它们存储在正确的位置:

  1. stat_chull function(mapping = NULL, data = NULL, geom = "polygon",

  2. position = "identity", na.rm = TRUE, show.legend = NA,

  3. inherit.aes = TRUE, ...){

  4. layer(

  5. stat = StatChull, data = data , mapping = mapping, geom = geom,

  6. position = position, show.legend = show.legend, inherit.aes = inherit.aes,

  7. params = list(na.rm = na.rm, ...)


  8. )

  9. }

( , 在写R包的时候要注意用 ggplot2 :: layer () 或在命名空间中导入 layer () , 否则会因找到函数而报错)

当我们写好了图层函数后,我们就可以尝试这个新的"stat"了

  1. ggplot(mpg, aes(displ, hwy)) +

  2. geom_point() +

  3. stat_chull(fill = NA, colour= "black")

(后续我们会学习如何通过设置"geom"的默认值,来避免声明 fill = NA )

一旦我们构建了这种基本的对象,ggplot2将会给我们带来极大的自由。举个例子,ggplot2自动保留每组中不变的美学属性,也就是说你可以分组绘制一个凸壳:

  1. ggplot(mpg, aes(displ, hwy, colour = drv)) +

  2. geom_point() +

  3. stat_chull(fill = NA)

我们还可以覆盖默认的图层,来以不同的形式展现凸壳:

  1. ggplot(mpg, aes(displ, hwy)) +

  2. stat_chull(geom = "point", size = 4, colour = "red") +

  3. geom_point()

参考资料

  • https://cran.r-project.org/web/packages/ggplot2/vignettes/extending-ggplot2.html

  • https://ggplot2.tidyverse.org/reference/ggplot2-ggproto.html








请到「今天看啥」查看全文


推荐文章
程序员之家  ·  最令程序员沮丧的 10 件事
8 年前
看见音乐  ·  潘裕文的《空想夜车》
8 年前
不正常人类研究中心  ·  只可惜,多少快乐 ​​​​
7 年前
好奇小姐的好奇心  ·  看完这个,再也没有人敢说你胖了!
7 年前