对于使用R进行绘图,我应该学习ggplot2还是ggvis?


38

对于使用R进行绘图,我应该学习ggplot2还是ggvis?如果其中任何一个在任何方面都比较出色,我都不必学习两者。为什么R社区不断创建具有重叠功能的新软件包?在引进的博客文章并没有提到一个字,为什么ggvis创建给出一个复杂的绘图包GGPLOT2已经存在。


5
ggvis是完全不同的鱼缸。真正的选择是在ggplot和lattice之间。
庆典2014年

1
我认为答案取决于您的追求。如果您正在寻找静态的高级绘图,则需要学习ggplot2。对于Web可视化,请考虑ggvis
RomanLuštrik2014年

Answers:


39

从ggplot2开始。它创建静态图。

除了静态图外,ggvis还可用于创建交互式图。一旦您了解了ggplot2的语法,添加交互性以创建ggivs图的语法就会自然地遵循。


4
这是不准确的(也许在撰写本文时是准确的)。ggvis绝对可以用来创建静态图。它也允许交互式绘图的事实是一个功能,而非限制。静态图解的一个简单示例:library('ggvis'); mtcars %>% ggvis(~wt, ~mpg) %>% layer_points(fill = ~factor(cyl))
Andre Terra

47

我想对戴安娜·库克的答案做些补充。如她所说,ggplot2用于创建静态图,ggvis用于交互式图。有很多含义:

ggvis输出的文件类型是HTML,包括CSS和javascript文件。ggvis自然不会输出普通图像文件。ggplot2输出普通图像,然后可以将其嵌入HTML或pdf或gif或通过电子邮件发送,或其他方式。ggvis,如果要通过电子邮件发送文件,则表示正在压缩HTML文件的目录,以便在浏览器中查看。

动画 这样做的结果是,如果您要创建动画,则可以在ggplot2中制作帧并将其合并,但是使用ggvis没有自然的方法。ggvis交互操作将为“实时”设置动画,但是这些是不同种类的动画。如果每帧正在进行的操作超出了ggvis的处理能力,则无法(至少以自然方式)通过生成图像并在后台制作电影来解决该问题。同样,用户无法从ggvis下载电影或gif文件进行重播。

现在在我当前的项目中,我从ggplot2切换到了ggvis,因为ggplot2太慢了,无法进行交互式动画制作。但是,我还希望用户在玩完设置后能够单击“开始”并下载他们所做的全速,平滑动画电影。我还没有弄清楚如何使用ggvis来做到这一点,但是使用ggplot2却是蛋糕。

速度 ggvis是很多很多,比GGPLOT2快得多,更改数据时尤其如此。每个ggplot2图都有几秒钟或几秒钟的延迟。ggvis在您第一次创建绘图时需要一秒钟左右的时间,之后无缝更改数据-ggvis可以“主动”链接到数据,因此只要数据更改,ggvis就会自动更新。使用ggplot2,整个图将被重绘。

样式和外观 ggplot2图表乍一看似乎比ggvis图表更好。ggplot2情节非常优雅。ggvis图更简单,但它们在我身上不断增长。ggplot2也有扩展,例如xkcd和wesanderson包,其中没有ggvis的模拟。ggplot2情节看起来都像是由同一个人(ggplot2的作者)制作的,过了一会儿就累了。

完整性 至少到目前为止,您可以在ggplot2中创建ggvis不支持的绘图类型。例如,ggvis中没有“ rug”图元素。我已经看过用ggvis制作的一两个节拍器,但是还没有自然的内置支持。ggplot2具有极坐标(即饼图),ggvis没有。ggvis也缺少(可在ggplot2或ggplot2扩展中使用):等高线图; 自然热图;自然相关图 点图 小提琴情节;网络图;树状图。当然,我敢肯定有些非常聪明的人可以在ggvis中创建所有这些东西,但是我并不那么聪明。

注释 ggplot2有一个非常不错的,可能未得到充分利用的注释框架。ggvis没有。

子图和构面 ggplot2具有一个非常不错的“构面”功能,但可能非常有限。您还可以使用网格包组合多个ggplot2图。到目前为止,您无法使用ggvis。ggvis绘图不能合并为单个图像(因为它们不是图像,所以它们是“实时”网页),并且不支持任何类型的构面或子作图。这应该在管道中。

视觉灵活性 ggplot2希望每个图看起来都一样,这意味着像作者更喜欢造型。例如,在ggplot2中无法绘制带有多个y轴的图。ggvis可以。ggvis比ggplot2灵活得多。诸如隐藏图例,将多个图例合并为一个图例,对同一图块上的不同事物使用不同的比例等操作要容易得多。

深度定制性。如果你想创建,比方说,一个新的聪明的规模,它不是硬做,在GGPLOT2(虽然它是相当混乱)。在ggvis中似乎没有办法做很多事情。也许还没有。

时间序列 ggplot2不喜欢绘制时间序列。它可以,但并不希望。实际上,他们都不想要;两者都坚持要在data.frame中提供数据,并且它们不能处理xts或zoo对象。它们也没有用于切片时间序列的内置功能。但是ggvis并没有像ggplot2那样艰难地对抗时间序列。我想这部分是因为它是如此之快地更新了ggvis图中的数据。如果您想绘制一个时间序列,则必须击败任何一个都可以提交,但是ggvis对它的被动攻击性要小得多。

它们是相同的语法吗? 排序... ...有很多在他们之间共同的,和学习思考的风格之一,将有助于适应对方的风格。特别是,两者都经过了设计,因此所有绘图调用都在同一行代码中通过管道相互传递。这样的主要优点是,它使调试和性能分析变得非常困难,并且基本上使诸如Rstudio之类的调试/性能分析功能无用。除此之外,它们在语法上完全不同。在ggplot2中很难完成的某些事情在ggvis中很容易。在ggvis中,某些在ggplot2中容易实现的事情是不可能的。反之亦然。(我对ggvis的工作方式有些偏爱,我觉得这更容易理解。)

ggvis的错误仍然很多。有时,它的行为只是奇怪。但是,有时候,由于需要花费数小时才能解决且几乎没有任何意义的原因,地块会随机消失。开发者可以自由地承认这一点,ggvis尚未投入生产。如果您处理任何复杂性,您发现它们不是在开玩笑。

底线: 每个学习中间绘图大约需要16个小时。因此,实际上,您可能会两者都学习。


1
很棒的比较
skan,2015年

什么是更快的ggvis,lattice或rgl?(适用于大型数据集)
skan,2015年

+1精彩的写作。根据到目前为止的经验,我同意这里的所有内容。
大卫·克鲁克

您好,ggvis vs rcharts呢?
skan

时间系列:ggplot2最终凭借ggfortify扩展获胜。请参阅有关此出色的文档:rpubs.com/sinhrks/basics
阿基米德

10

我认为之后出现的消息library(ggvis)是不言而喻的:

ggvis API目前正在迅速发展。强烈建议您不要将其用于生产,而是随时进行探索。如果遇到明显的错误,请在https://github.com/rstudio/ggvis/issues上提交一个可重现的示例。如有疑问和其他讨论,请使用https://groups.google.com/group/ggvis

与ggplot2相比,ggvis仍然缺少某些功能和修饰功能(例如,无法向图形添加标题,轴标题与刻度标签重叠,并且还有更多,不支持构面等)。另一方面,ggvis感觉有点干净,而且交互性真的很棒。

根据我的经验,如果要构建闪亮的应用程序,则必须使用ggvis。这样,使用Web和R友好图绘制引擎的好处就远远超过了它目前存在的任何不足。

如果您想为数据探索做静态图,那么ggplot2是一个成熟的库,具有许多很酷的功能,并且拥有一个健康的用户社区和许多可学习的资源。

两个软件包背后的理念相似,因此可以很容易地将技能从一个软件包转移到另一个软件包。


8

R社区出于各种原因不断提出新的(并且经常是重叠的)软件包:

1)有人想要更改或添加现有软件包中不可用的东西,但是其中很多东西是重叠的(因此,许多软件包会进行回归)

2)有人写一个包作为作业

3)编写软件包很有趣(如果您喜欢这种事情)

4)他们不知道原始包装是否存在


9
关于具体示例和您的观点4:ggvis与ggplot2由同一个人创作。这里的重点是ggplot2的使用范围很广,以至于在不破坏许多现有代码/相关程序包的情况下就不可能实现更改。
罗兰2014年

1
这样的改造既有的包装注定要发生,就像资本主义社会的经济衰退一样吗?
qazwsx 2014年

2
@Peter:作为R的局外人,在我看来,这很像个公平的评论,但(最不寻常的是)您没有回答这个问题!
尼克·考克斯

@NickCox我回答了问题中的一个问题。:-)。
彼得·弗洛姆

1
@Peter很公平。因此,我认为对stats.stackexchange.com/questions/58966/…的交叉引用是适当的。
尼克·考克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.