如何解决如何在多个 ggplot2 等高线图中设置对数刻度?
我正在尝试创建三个等高线图,每个图都说明了应用于两个输入向量和一个固定 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))
}
对于向量 alpha 中的每个 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,z_rel))
plots[[i]] <- ggplot(data = d,aes(x = x,y = y,z = z_rel)) +
geom_contour_filled()
}
当 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)
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。