在 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 创建
我正在使用 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 创建