如何跨多个 ggplot2 等高线图设置对数刻度?

How to set a logarithmic scale across multiple ggplot2 contour plots?

我正在尝试创建三个等高线图,每个图都说明了应用于两个输入向量和固定 alpha 的以下函数:

alphas <- c(1, 5, 25)
x_vals <- seq(0, 25, length.out = 100)
y_vals <- seq(0, 50, length.out = 100)

my_function <- function(x, y, alpha) {
  z <- (1 / (x + alpha)) * (1 / (y + alpha))
}

对于向量 alphas 中的每个 alpha,我正在创建 z 值的等高线图——相对于最小 z 值——在 x 和 y 轴上。

我使用以下代码(可能不是最佳实践;我仍在学习 R 的基础知识):

plots <- list()

for(i in seq_along(alphas)) {
  z_table <- sapply(x_vals, my_function, y = y_vals, alpha = alphas[i])
  
  x <- rep(x_vals, each = 100)
  y <- rep(y_vals, 100)
  z <- unlist(flatten(list(z_table)))
  z_rel <- z / min(z)
  d <- data.frame(cbind(x, y, z_rel))
  
  plots[[i]] <- ggplot(data = d, aes(x = x, y = y, z = z_rel)) + 
    geom_contour_filled()
}

当 alpha = 1 时:

当 alpha = 25 时:

我想使用 ggarrange() 以 一个对数色标 将这些图显示在一组中(因为相对 z 因图而异)。有办法吗?

您可以构建一个数据框,将所有 alpha 的所有数据组合在一起,并用一列指示 alpha,这样您就可以对图表进行分面:

我基本上删除了 plot[[i]] 部分,并将在前一个循环中创建的 d 叠加起来:

d = numeric()
for(i in seq_along(alphas)) {
  z_table <- sapply(x_vals, my_function, y = y_vals, alpha = alphas[i])
  
  x <- rep(x_vals, each = 100)
  y <- rep(y_vals, 100)
  z <- unlist(flatten(list(z_table)))
  z_rel <- z / min(z)
  d <- rbind(d, cbind(x, y, z_rel))}

d = as.data.frame(d)

然后我们创建 alphas 列:

d$alpha = factor(paste("alpha =", alphas[rep(1:3, each=nrow(d)/length(alphas))]),
                 levels = paste("alpha =", alphas[1:3]))

然后在等高线内建立对数刻度:

ggplot(data = d, aes(x = x, y = y, z = z_rel)) +
  geom_contour_filled(breaks=round(exp(seq(log(1), log(1400), length = 14)),1)) +
  facet_wrap(~alpha)

输出: