跨多个 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 创建
我想在 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 创建