正确扩展ggplot2?

时间:2011-08-11 16:58:13

标签: r ggplot2 prototype-programming

最近出现了ggplot2的一些巧妙用法,并且已发布部分或完整解决方案:

ggheat值得注意,因为它只是通过绘图而不是返回一个对象来打破ggplot隐喻。

大括号解决方案值得注意,因为没有一个真正适合ggplot2高级概念(例如,你应该指定一系列你想要打破的点,然后在其他地方能够指定你想要的那个点的geom范围显示 - 支架,盒子,紫牛等。)。

ggplot2 book(我将尽快订购并阅读2个在线章节)似乎是关于使用语法和功能而不是编写新的或广泛扩展现有的。

我想学习添加特定功能或开发新的geom,并正确完成。 ggplot2可能不像grid或基本图形那样用作通用图形包,但是有很多图表只是现有ggplot2 geom的一步或两步扩展。当这些情况出现时,我通常可以将足够的物体放在一起做一次,但如果我需要几十次相同的情节呢?如果其他人喜欢它并且想要使用它会怎么样 - 现在他们每次想要那个图表时都必须通过相同的过程进行处理。在我看来,正确的解决方案是添加stat_heatplotgeom_heatplot,或为Tufte box plots添加geom_Tuftebox等。但我从未见过实际扩展ggplot2的例子;只是如何使用它的例子。

有哪些资源可以深入挖掘ggplot2并开始扩展它?我特别感兴趣的是如上所述在轴上指定范围的高级方法,但是关于ggplot2 tick的内容的一般知识也是受欢迎的。

如果没有一致的指南(很少有足够高级的修补,因此可能不存在),如何学习内部结构?检查源显然是一种方式,但开始的功能等等。

3 个答案:

答案 0 :(得分:25)

ggplot2正在逐渐变得越来越可扩展。开发版本https://github.com/hadley/ggplot2/tree/develop使用roxygen2(而不是两个独立的本土系统),并且已经开始从proto切换到更简单的S3类(目前完整用于coords和scale)。这两个更改应该有助于使源代码更容易理解,因此更容易扩展(通过ggplot2的pull请求增加的事实进行备份)。

下一版本中将包含的另一项重大改进是Kohske Takahashi对指南系统的改进(https://github.com/kohske/ggplot2/tree/feature/new-guides-with-gtable)。除了改进默认指南(例如,使用优雅的连续颜色条),他的更改还可以更轻松地使用您自己的自定义图例和轴覆盖默认值。这样就可以在它们可能属于的轴上绘制花括号。

下一轮的大变化(我可能无法在2012年夏天解决)将包括重写geoms,stats和位置调整,沿着图层包中的草图线({{3 }})。这应该使得geoms,stats和position调整更容易编写,并有望促进更多的社区贡献,例如geom_tufteboxplot。

答案 1 :(得分:8)

我不确定我同意你的分析。我将解释原因,然后指出一些资源来编写自己的geoms。

<强> ggheat

据我所知,ggheat返回类ggplot的对象。因此,它是ggplot的一个方便的包装器,为特定用例定制。虽然qplot更通用,但它原则上也是一样的:它是ggplot的包装器,它对数据做出一些有根据的猜测,并选择合理的默认值。 Hadley将此情节函数称为 ggplot2 一书的第181页。

花括号

花括号解决方案完全符合ggplot哲学所说的内容,即将数据与表示分开。在这种情况下,数据由一个小的自定义函数生成,并存储在data.frame中。然后使用有意义的geom显示它,即geom_line

quo vadis?

您已经注意到(在r chat room中)您希望采用更通用的方法来绘制花括号。以下几行(我同时解释和延伸):

  • 以边界框坐标(即x0,x1,y0和y1)的形式提供数据
  • 指定“统计”,例如大括号,方框或其他
  • 指定geom,例如geom_custom_shape

这听起来像是大括号解决方案背后的想法的一个很好的概括和扩展,并且显然需要编写一个新的geom。有一个官方ggplot wiki,您可以在其中找到creating a new geom的说明。

答案 2 :(得分:4)

为什么要延长它?动机是什么?我认为 ggplot2 是一个高级图形包,旨在从特定数据集中生成漂亮的数字。做正确的事情并使其他事情变得简单:比如鳞片,传说等。 ggplot2 并不是一个通用的图形工具包。就像 lattice 一样,它有一个特定的范例,你可以将它用于此目的。

grid 是您要用于执行通用自定义绘图的基础图形工具包。对于这种任意符号/注释等,将网格凹凸添加到网格 ggplot2 图/对象相对容易。

没有多大意义的是沿着你想到的方向扩展 ggplot2 格子。我不明白为什么 ggplot2 不能像现在那样做热点?或者我在这里遗漏了什么?

如果 ggplot2 lattice 的数据处理内容可供其他人在其上编写实际绘图代码,那将是非常有用的。哈德利之前曾在某处提到这一点。

特别是

ggplot2 是非常难以阅读/理解的代码。 ggplot2 使用 proto 包作为OOP版本,这意味着您需要了解正在执行的操作以及 ggplot2 语义。 是类似的,因为那里的语言有很多计算,如果你不熟悉那种R编程,可能会非常恐怖,令人生畏和难以理解!

对于网格,我建议您查看Paul Murrell的R Graphics图书,第二版与发布者合作:http://www.stat.auckland.ac.nz/~paul/RG2e/

编辑我想要了解的一点是ggplot2和lattice等软件包提供的接口必然是高级的。只要它们坚持使用的范式/哲学,扩展它们就很好。已经可以使用现有的宝石制作热图; ggplot系统的一部分理念是将数据与显示/显示分开,并以有趣的方式使用geom来产生所需的显示。

将基本ggplot + geom调用包装成更加用户友好的函数是可以的,只要i)它的工作方式就像ggplot已经做的那样并且返回一个对象,并且ii)它没有一个与路径太不同的接口ggplot有效。开发人员可以自由编写他们想要的任何代码,对于更广泛的社区来说,提供与原始工作方式相差太远的包装器并没有帮助。这导致了用户的混淆,并没有促进ggplot2本身的学习。

动态定位理念很有意思;你可以在所有绘图包中包含这些想法。您可以将其固定到geom中,或者作为外部函数将其固定,以修改输入坐标以生成可由相关geom使用的新数据对象。同样的功能可以用于其他绘图包 - 它不需要特定于ggplot。