首页 > 解决方案 > ggplot2 vs base-r 绘图及其冗长的性质

问题描述

此处找到的问题中, OP 提出了一个相当简单的问题,据我所知,它有一个简单的答案。但是,OP 认为这太冗长而拒绝,这引起了我对是否比 baseggplot2不必要地复杂R的问题感兴趣。

假设我想制作以下情节,

在此处输入图像描述

我可以做到这一点是基于R以下script

# Grid of X-axis values
x <- seq(0, 10, 0.01)

# Data
set.seed(1)
y1 <- 2 * cos(x) + 8
y2 <- 3 * sin(x) + 4

# Lines
plot(x, y1, type = "l",
     ylim = c(1, 10), ylab = "y")
lines(x, y2, type = "l", col = 2)

# Fill area between lines
polygon(c(x, rev(x)), c(y2, rev(y1)),
        col = "#6BD7AF")

这等效地可以用ggplot2-syntax 表示,如下所示script

library(tidyverse)

x <- seq(0, 10, 0.01)

# Data
set.seed(1)
y1 <- 2 * cos(x) + 8
y2 <- 3 * sin(x) + 4



sample_data <- tibble(
        x,
        y1,
        y2
)

sample_data %>% 
        ggplot() + 
        geom_ribbon(
                aes(
                x =x, ymin = y1, ymax = y2
                ),
                fill = "#6BD7AF",
                color = "black"
        ) + theme_classic()

这个关于%>%-operator 的讨论中,提到了一些间接成本,并举了一个合适的例子。所以我比较了这两种方法microbenchmark,看看这里是否也是这种情况。结果如下,

Unit: milliseconds
   expr       min        lq      mean    median        uq       max neval
 ggplot  2.836232  3.013435  3.350137  3.188025  3.388644  9.357495   100
  baseR 20.090868 58.090015 58.993941 59.568097 60.235889 65.577104   100

平均而言,远远ggplot超过基数R。下面script产生这些结果,

library(microbenchmark)


base_foo <- function() {
        
        # Grid of X-axis values
        x <- seq(0, 10, 0.01)
        
        # Data
        set.seed(1)
        y1 <- 2 * cos(x) + 8
        y2 <- 3 * sin(x) + 4
        
        # Lines
        plot(x, y1, type = "l",
             ylim = c(1, 10), ylab = "y")
        lines(x, y2, type = "l", col = 2)
        
        # Fill area between lines
        polygon(c(x, rev(x)), c(y2, rev(y1)),
                col = "#6BD7AF")
        
}


ggplot_foo <- function() {
        
        # Grid of X-axis values
        x <- seq(0, 10, 0.01)
        
        # Data
        set.seed(1)
        y1 <- 2 * cos(x) + 8
        y2 <- 3 * sin(x) + 4
        
        
        sample_data <- tibble(
                x,
                y1,
                y2
        )
        
        sample_data %>% 
                ggplot() + 
                
                geom_ribbon(
                        
                        aes(
                                x =x, ymin = y1, ymax = y2
                        ),
                        fill = "#6BD7AF",
                        color = "black"
                ) + theme_classic()
        
        
        
}


microbenchmark(
        ggplot = ggplot_foo(),
        baseR  = base_foo()
)

ggplot2在此特定应用程序中具有更快的优势,但是在某些情况下使用 base 更有意义R吗?

即,

  1. 一个或另一个memory比另一个更有效吗?
  2. 一种或另一种更符合良好的编码实践,即。它是否更易于跨语言阅读?

总而言之,ggplot速度更快。但是Rggplot在处理plots演示文稿和政策建议时,什么时候比较好。

标签: rggplot2tidyverse

解决方案


推荐阅读