Два разных цветовых ключа в ggplot

Я хотел бы нанести точки дважды, используя две разные цветовые шкалы:

В данном примере 5 точек тонут, а цвет отображается на две ковариаты (cov1 и cov2): cov1 и cov2 находятся в разных масштабах от 1 до 5 и от 0,01 до 0,05 соответственно.

Мне бы хотелось иметь 2 независимых цветовых клавиши, одну для cov1 и одну для cov2, как на графике ниже. Однако на приведенном ниже графике я использовал 'color = cov1' end 'fill = cov2', чтобы вывести еще один цветовой ключ...

Любая помощь будет оценена.

   gg1 <- ggplot(data = df1 , aes( x = x , y = y ) ) +
   geom_point( aes(x = x , y = y - 1 , color = cov1 ))  +
   geom_point( aes(x = x , y = y + 1 , color =  cov2  )) +
   scale_y_continuous(limits = c(-3,3)) 

  gg2 <- ggplot(data = df1 , aes( x = x , y = y ) ) +
  geom_point( aes(x = x , y = y - 1 , color = cov1 ))  +
  geom_point( aes(x = x , y = y + 1 , fill =  cov2  ), pch = 21 ) +
  scale_y_continuous(limits = c(-3,3)) 

grid.arrange( gg1 , gg2 , ncol = 2 )

2 ответа

В основном ggplot2 это невозможно, если я правильно помню. Но этот репозиторий может быть вашим ответом:

https://github.com/eliocamp/ggnewscale

или это (упомянуто в описании предыдущего):

https://github.com/clauswilke/relayer

Я не пользовалась ggplot2 довольно долго, поэтому я не знаком с этими двумя, но я помню, что использовал один из них хотя бы один раз.

Я только что написал быстрый пример, чтобы проверить, работает ли он:

d1 <- data.frame(x=1:5, y=1)
d2 <- data.frame(x=1:5, y=2)

library(ggplot2)
library(ggnewscale)

ggplot() +
  geom_point(data = d1, aes(x=x, y=y, color = x)) +
  scale_color_continuous(low = "#0000aa", high="#ffffff") +
  new_scale_color() +
  geom_point(data = d2, aes(x=x, y=y, color = x)) +
  scale_color_continuous(low = "#aa0000", high="#00aa00") 

пример

И, кажется, работает, как вы хотите.

Я использовал вашу идею о комбинировании col а также fill и небольшой взлом, чтобы использовать различные формы для cov1 а также cov2:

# sample data
my_data <- data.frame(x = 1:5,
                      cov1 = 1:5,
                      cov2 = seq(0.01, 0.05, 0.01))

library(ggplot2)

ggplot() + 
  geom_point(data = my_data, aes(x = x, y = 0.5, col = cov1), shape = 16) +
  scale_color_continuous(low = "red1", high = "red4") + 
  geom_point(data = my_data, aes(x = x, y = -0.5, fill = cov2), shape = 21, col = "white", size = 2) + 
  ylim(-1, 1)

Надеюсь, поможет.

Другие вопросы по тегам