跨多个 ggplots 共享一个连续的值-颜色映射

Share a continuous value-color mapping across several ggplots

我想在 ggplot 中制作 4 个并排的散点图。在每个图中,我用一个连续变量给点上色。我希望将相同的值映射到四个图中的相同颜色,以便我可以比较这些图并使用一个共同的图例。有什么建议么?我尝试了 scale_colour_gradientn() 并尝试了“价值观”的争论,但到目前为止无济于事。

这里有四个地块:

library(tidyverse)
library(gridExtra)
set.seed(111)
n <- 100
X1 <- rnorm(n, mean=0,sd=2)
X2 <- rnorm(n, mean=0,sd=2)
y <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1) +
             15*(X1 > -1 & X2 > 2), sd=1)
y0 <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1), sd=1)
y40 <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1) +
               40*(X1 > -1 & X2 > 2), sd=1)
y20 <- rnorm(100, mean=10*(X1 < -1) - 20*(X1 > -1) +
               15*(X1 > -1 & X2 > 2), sd=1)

p1 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y)) + 
  scale_colour_gradientn(colours = hcl.colors(8, "BluGrn"))
p2 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y0)) + 
  scale_colour_gradientn(colours = hcl.colors(8, "BluGrn"))
p3 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y40)) + 
  scale_colour_gradientn(colours = hcl.colors(8, "BluGrn"))
p4 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y20)) + 
  scale_colour_gradientn(colours = hcl.colors(8, "BluGrn"))
grid.arrange(p1,p2,p3,p4, nrow=2)

如有任何关于如何创建可在 y、y0、y40 和 y20 之间共享的值->颜色连续映射的建议,我们将不胜感激。谢谢!

Axeman 的方法是正确的,尽管我认为 post 拼凑而不是 gridExtra 的方法可能会有所帮助。您可以使用 & 运算符将 ggplot 对象(通常是比例或主题)应用于所有以前的绘图。对于 'collect' 指南,它们必须共享相同的名称、限制、中断、颜色等,因此您必须设置 name 参数以覆盖默认值。

values参数确实可以用来控制颜色的扩散。需要记住的是,ggplot2 在应用颜色之前将值重新缩放到 [0,1] 区间,并且 values 参数也对这些重新缩放的值进行操作。对于您选择的 8 种颜色,它们将位于 scales::rescale(seq(0, 1, length.out = 8)) 的位置。要使中间值靠得更近,您可以尝试 values = c(0, seq(0.2, 0.8, length.out = 6), 1).

library(tidyverse)
library(patchwork)

set.seed(111)
n <- 100
X1 <- rnorm(n, mean=0,sd=2)
X2 <- rnorm(n, mean=0,sd=2)
y <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1) +
             15*(X1 > -1 & X2 > 2), sd=1)
y0 <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1), sd=1)
y40 <- rnorm(100, mean=10*(X1 < -1) - 10*(X1 > -1) +
               40*(X1 > -1 & X2 > 2), sd=1)
y20 <- rnorm(100, mean=10*(X1 < -1) - 20*(X1 > -1) +
               15*(X1 > -1 & X2 > 2), sd=1)

p1 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y))
p2 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y0))
p3 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y40))
p4 <- ggplot(data=NULL) + geom_point(aes(x=X1, y=X2, col=y20))

p1 + p2 + p3 + p4 + plot_layout(guides = "collect") &
  scale_colour_gradientn(colours = hcl.colors(8, "BluGrn"),
                         limits = range(y, y0, y40, y20),
                         values = c(0, seq(0.2, 0.8, length.out = 6), 1),
                         name = "Values")

reprex package (v0.3.0)

于 2020-11-25 创建