r - 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
吗?
即,
- 一个或另一个
memory
比另一个更有效吗? - 一种或另一种更符合良好的编码实践,即。它是否更易于跨语言阅读?
总而言之,ggplot
速度更快。但是R
,ggplot
在处理plots
演示文稿和政策建议时,什么时候比较好。
解决方案
推荐阅读
- php - Google Cloud PHP Translate 使用什么版本的翻译 API?
- php - 通过模块升级创建自定义客户属性 (UpgradeData.php)
- ios - 等待网络调用完成
- python - 当axis = 0时,Keras BatchNormalization仅适用于恒定批次暗淡?
- firefox - 如何从 Firefox 插件中读取配置文件首选项?
- javascript - 从本地存储中删除整个阵列
- sql - 列中的分组和空值
- reactjs - 如何用 GatsbyJS 响应式图像替换 HTML 图像?
- batch-file - 在不更改已经存在的环境变量的情况下更新 PATH
- python - 如何在python散点图中制作标准差和百分位带