首页 文章

正确扩展ggplot2?

提问于
浏览
36

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

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

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

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

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

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

没有一个连贯的指南(很少有足够先进的修补,因此可能不存在),如何去学习内部结构?检查源显然是一种方式,但开始的功能,等等 .

3 回答

  • 24

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

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

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

    如果 ggplot2lattice 的数据处理内容可供其他人在其上编写实际绘图代码,那将是非常有用的 . 哈德利以前曾在某处提到这件事 .

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

    对于 grid ,我建议你看看Paul Murrell的R Graphics图书,第二版是出版商:http://www.stat.auckland.ac.nz/~paul/RG2e/

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

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

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

  • 5

    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和位置调整,沿着图层包中的草图线(https://github.com/hadley/layers) . 这应该使得地理位置,统计数据和位置调整更容易编写,并有望促进更多的社区贡献,例如geom_tufteboxplot .

  • 8

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

    ggheat

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

    curly braces

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

    quo vadis?

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

    • 以边界框坐标(即x0,x1,y0和y1)的形式提供数据

    • 指定"statistic",例如大括号,方框或其他

    • 指定 geom ,例如 geom_custom_shape

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

相关问题