Как установить фиксированные непрерывные значения цвета в ggplot2

Я рисую много графики, и я хотел бы, чтобы у всех из них была одна и та же цветовая шкала, чтобы я мог сравнивать друг с другом. Здесь мой код:

myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
print(ggplot(mydata, aes(x= X, y= Y, colour= Z)) + geom_point(alpha=.5,size = 6) + scale_colour_gradientn(colours = myPalette(100)) + ylim(.1,.4) + xlim(1.5,2) + ggtitle(title))

Есть ли способ установить эту цветовую шкалу?

Ответы

Ответ 1

Я правильно понимаю это? У вас есть два графика, где значения цветовой шкалы сопоставляются различным цветам на разных графиках, потому что графики не имеют одинаковых значений в них.

library("ggplot2")
library("RColorBrewer")
ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6)

enter image description here

ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6)

enter image description here

В верхней синей синей будет 1, а светло-голубой - 4, а в нижней - синий (1), а голубой - 8.

Вы можете исправить концы цветовой полосы, предоставив аргумент limits для шкалы; он должен охватывать весь диапазон, который данные могут принимать на любом из участков. Кроме того, вы можете назначить эту шкалу переменной и добавить ее ко всем графикам (чтобы уменьшить избыточный код, чтобы определение находилось только в одном месте, а не на каждом графике).

myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
sc <- scale_colour_gradientn(colours = myPalette(100), limits=c(1, 8))

ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6) + sc

enter image description here

ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6) + sc

enter image description here

Ответ 2

Там может быть лучший способ сделать это, но я не знаю об этом. Тем временем вам нужно убедиться, что аргумент values scale_colour_gradientn таков, что значения всех ваших графиков соответствуют правильным цветам. Итак, здесь я делаю два графика с одинаковым отображением между 0-100, но один из них имеет значения от 50 до 150:

mydata <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 0, 100))
p1 <- ggplot(mydata, aes(x=X, y=Y, colour=Z)) + 
  geom_point(alpha=.5, size = 6) + 
  scale_colour_gradientn(colours = myPalette(100), values=seq(0, 100, length.out=100)/100) + 
  ggtitle("Z: 0 - 100")

Это ключевой бит:

mydata2 <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 50, 150))
nrm.range.2 <- (range(mydata$Z) - min(mydata2$Z)) / diff(range(mydata2$Z))
nrm.vals <- seq(nrm.range.2[[1]], nrm.range.2[[2]], length.out=100)

Теперь сделайте второй график.

p2 <- ggplot(mydata2, aes(x=X, y=Y, colour=Z)) + 
  geom_point(alpha=.5, size = 6) + 
  scale_colour_gradientn(colours = myPalette(100), values=nrm.vals) + 
  ggtitle("Z: 50 - 150")

enter image description here

В любом случае я не знаю, какой диапазон значений отображается на шкале, но в той степени, в которой у вас есть несколько графиков с неперекрывающимися диапазонами значений Z, вы можете создать третий фиктивный график со всем диапазоном и использовать это. Здесь я целенаправленно ушел с диапазона, чтобы показать, что значения, которые перекрываются, имеют одинаковые цвета.