1

我想在 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 之间共享的值->颜色连续映射的建议都将非常感激。谢谢!

4

1 回答 1

1

Axeman 的方法是正确的,尽管我认为发布一种拼凑而不是 gridExtra 的方法可能会有所帮助。您可以使用&运算符将​​ ggplot 对象(通常是比例或主题)应用于所有先前的绘图。要“收集”指南,它们必须共享相同的名称、限制、中断、颜色等,因此您必须设置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 包于 2020-11-25 创建(v0.3.0)

于 2020-11-25T15:41:32.387 回答