簡體   English   中英

在多個 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 的方法是正確的,盡管我認為發布帶有拼湊而成的方法而不是 gridExtra 的方法可能會有所幫助。 您可以使用&運算符將 ggplot 對象(通常是比例或主題)應用於所有先前的繪圖。 要“收集”指南,它們必須共享相同的名稱、限制、中斷、顏色等,因此您必須設置name參數以覆蓋默認值。

values參數確實可以用來控制顏色的傳播。 需要記住的是,ggplot2 在應用顏色之前將values重新縮放到 [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 包(v0.3.0) 於 2020 年 11 月 25 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM