在 ggplot2 中的不同等高线图上保持相同的中断

Keep same breaks across different contour plots in ggplot2

我正在使用 ggplot2 stat_contour_filled 函数创建不同数据子集的等高线图。然而,对于每一个它都会产生不同的色标,这使得它们很难进行比较。我试过使用“breaks=”选项,但由于某种原因它不起作用。 MWE 是:

library(ggplot2)
library(gridExtra)

v <- list()
v[[1]] <- ggplot(faithfuld, aes(waiting, eruptions, z = density)) + stat_contour_filled(breaks=(0:10)*0.005)
v[[2]] <- ggplot(faithfuld, aes(waiting, eruptions, z = 1.1*density)) + stat_contour_filled(breaks=(0:10)*0.005)

of = "mwe.png"
png(of)
print(do.call(grid.arrange,  v))
dev.off()

它产生以下情节

如何为两个等高线图获得相同的颜色级别?

这看起来像是 ggplot2 中的错误,可能在此处的 iso_to_polygon 函数中:https://github.com/tidyverse/ggplot2/blob/b76fa9639215785f8e94874d3bdf02225bae898a/R/stat-contour.r#L284。如果级别中没有数据(您的第一个绘图没有大于 0.04,因此前两个带是空的),那么它们将被静默丢弃。

再次编辑:

这是部分解决方法。如果您指定要使用的色阶 drop = FALSE,则不会删除任何级别。例如,

v <- list()
v[[1]] <- ggplot(faithfuld, aes(waiting, eruptions, z = density)) +
          stat_contour_filled(breaks=(0:10)*0.005) +
          scale_fill_viridis_d(drop = FALSE)
v[[2]] <- ggplot(faithfuld, aes(waiting, eruptions, z = 1.1*density)) +
          stat_contour_filled(breaks=(0:10)*0.005) +
          scale_fill_viridis_d(drop = FALSE)
print(do.call(grid.arrange,  v))

这里我将颜色设置为scale_fill_viridis_d();如果您愿意,可以选择不同的调色板。我不知道如何在不指定比例的情况下将 drop 参数更改为 FALSE

这里的根本问题是离散尺度会降低空水平。您可以使用 drop = FALSE 来告诉相关秤不要放下空位。

library(ggplot2)

breaks <- (0:10)*0.005

ggplot(faithfuld, aes(waiting, eruptions, z = density)) + 
  stat_contour_filled(breaks = (0:10)*0.005) + 
  scale_fill_viridis_d(drop = FALSE)

ggplot(faithfuld, aes(waiting, eruptions, z = 1.1*density)) + 
  stat_contour_filled(breaks = (0:10)*0.005) +
  scale_fill_viridis_d(drop = FALSE)

reprex package (v0.3.0)

于 2020-11-17 创建

或者,您可以明确设置限制。这有点尴尬,因为它需要将中断值转换为格式化字符串。

library(ggplot2)

make_break_labels <- function(breaks, digits = 3) {
  n <- length(breaks)
  interval_low <- breaks[1:(n-1)]
  interval_high <- breaks[2:n]
  label_low <- format(as.numeric(interval_low), digits = digits, trim = TRUE)
  label_high <- format(as.numeric(interval_high), digits = digits, trim = TRUE)
  sprintf("(%s, %s]", label_low, label_high)
}

breaks <- (0:10)*0.005
break_labels <- make_break_labels(breaks)

ggplot(faithfuld, aes(waiting, eruptions, z = density)) + 
  stat_contour_filled(breaks = (0:10)*0.005) + 
  scale_fill_viridis_d(limits = break_labels)

ggplot(faithfuld, aes(waiting, eruptions, z = 1.1*density)) + 
  stat_contour_filled(breaks = (0:10)*0.005) +
  scale_fill_viridis_d(limits = break_labels)

reprex package (v0.3.0)

于 2020-11-17 创建