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

机器算法验证 r 数据可视化 软件
2022-01-24 14:25:52

对于使用 R 绘图,我应该学习 ggplot2 还是 ggvis?如果其中一个在任何方面都优越,我不一定想同时学习。为什么 R 社区不断创建具有重叠功能的新包?鉴于复杂的绘图包 ggplot2 已经存在,介绍博客文章没有提及为什么要创建 ggvis。

4个回答

我想稍微扩展一下 Dianne Cook 的回答。正如她所说,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 可以“反应性地”链接到数据,因此它会在数据更改时自行更新。使用 ggplot2,整个情节将被重新绘制。

样式和外观 ggplot2 图乍一看似乎比 ggvis 图好一些。ggplot2 绘图非常优雅。ggvis 情节更简单,但它们在我身上生长。还有 ggplot2 的扩展,例如 xkcd 和 wesanderson 包,其中没有 ggvis 的模拟。ggplot2 的情节看起来都像是由同一个人(ggplot2 的作者)制作的,一段时间后就会厌倦。

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

Annotations ggplot2 有一个非常好的,可能未充分利用的注释框架。ggvis 没有。

子图和分面 ggplot2 有一个非常好的,但可能相当有限的“分面”功能。您还可以使用 grid 包组合多个 ggplot2 图。到目前为止,你不能用 ggvis 做任何事情。ggvis 图不能组合成单个图像(因为它们不是图像,它们是“实时”网页),并且它不支持任何类型的刻面或子图。这应该是在管道中。

视觉灵活性ggplot2 希望每个情节看起来都一样,这意味着作者喜欢风格。例如,无法在 ggplot2 中绘制具有多个 y 轴的图。ggvis可以。ggvis 比 ggplot2 灵活得多。做一些事情要容易得多,比如隐藏图例、将多个图例合并为一个、对同一情节上的不同事物使用不同的比例等。

深度可定制性 如果你想创建一个新的智能比例,在 ggplot2 中做到这一点并不(尽管它很混乱)。似乎没有办法在 ggvis 中做很多事情。也许它只是还没有。

时间序列ggplot2 不喜欢绘制时间序列。可以,但它不想实际上他们都不想;两者都坚持在 data.frame 中输入数据,并且它们无法处理 xts 或 zoo 对象。它们也没有用于切片时间序列的内置功能。但是 ggvis 并没有像 ggplot2 那样对时间序列进行反击。我想,部分原因是它更新 ggvis 图中的数据非常快。如果你想绘制一个时间序列,你将不得不击败任何一个提交,但 ggvis 对它的被动攻击性要小得多。

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

Bugs ggvis 还是有不少的。有时它的行为很奇怪。但是,有时,由于需要花费数小时才能解决并且几乎没有意义的原因,情节会随机消失。开发人员坦率地承认这一点,ggvis 还没有准备好生产。如果您处理任何复杂性,您发现它们不是在开玩笑。

底线: 在每个中学习中间绘图大约需要 16 个小时。所以,实际上,你可能会同时学习两者。

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

除了静态图,ggvis 也可用于创建交互式图。一旦你学会了 ggplot2 的语法,那么添加交互性以创建 ggivs 绘图的语法自然会遵循。

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

ggvis API 目前正在迅速发展。我们强烈建议您不要依赖它进行生产,但可以随意探索。如果您遇到明显的错误,请在https://github.com/rstudio/ggvis/issues提交一个最小的可重现示例。如有问题和其他讨论,请使用https://groups.google.com/group/ggvis

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

根据我自己的经验,如果你正在构建一个闪亮的应用程序,ggvis 是必须的。然后,拥有一个对 web 和 R 友好的图形绘图引擎的好处远远超过了它目前的任何缺陷。

如果你想为数据探索做静态图,那么 ggplot2 是一个成熟的库,它有很多很酷的特性,有一个健康的用户社区和很多可以学习的资源。

这两个包背后的理念是相似的,所以技能可以很容易地从一个包转移到另一个包。

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

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

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

3)写包很有趣(如果你喜欢那种东西)

4) 他们不知道原始包的存在