Использование двух масштабных градиентов цвета ggplot2

Если есть, я думаю, для этого должно быть очень простое решение. У меня есть два больших блока данных, которые в основном выглядят так:

> data1[1,]
      chromosome start    end      test ref position log2      p.value 
13600 Y          10199251 10200750 533  616 10200000 0.2181711 0.00175895   
...

> data2[1,]
      chromosome start    end      test ref position log2       p.value 
4080  Y          10197501 10202500 403  367 10200000 0.04113596 0.3149926   
...

Я использую этот код для построения двух данных в одном графике:

p <- ggplot() + geom_point(data=subset(data1, p.value >= glim[1]),
map=aes(x=position, y=log2, colour=p.value))
+ geom_point(data=subset(data2, p.value >= glim[1]), map=aes(x=position,
y=log2, colour=p.value))

Когда я рисовал одиночные кадры данных, я использовал красно-белый градиент цвета для значений в столбце "p.value". Используя эту строку:

p <- p + scale_colour_gradient(limits=glim, trans='log10', low="red", 
high="white") 

Центральная проблема: теперь с двумя кадрами данных, как я могу установить один градиент цвета для data1 и другой для data2? В предыдущем сообщении я читал, что невозможно использовать две разные цветовые шкалы (ej. "Low =" для первого и "high =" для второго), но в этом случае это точно такая же цветовая шкала (Если я не смешиваю терминологию). Синтаксис явно неверен, но я хотел бы сделать что-то вроде этого:

p <- p + scale_colour_gradient(limits=glim, trans='log10', low="red", 
high="white") 

p <- p + scale_colour_gradient(limits=glim, trans='log10', low="blue", 
high="white") 

Ответ 1

Во-первых, обратите внимание, что причина ggplot не поощряет это, потому что графики, как правило, трудно интерпретировать.

Вы можете получить две цветовые градиентные шкалы, прибегая к немногому обману. В geom_point некоторые формы (от 21 до 25) могут иметь как заливку, так и цвет. Вы можете использовать это, чтобы создать один слой со шкалой "fill", а другой - с "цветным" масштабом.

# dummy up data
dat1<-data.frame(log2=rnorm(50), p.value= runif(50))
dat2<-data.frame(log2=rnorm(50), p.value= runif(50))

# geom_point with two scales
p <- ggplot() 
p <- p + geom_point(data=dat1, aes(x=p.value, y=log2, color=p.value), shape=21, size=3)
p <- p + scale_color_gradient(low="red", high="gray50")
p <- p +  geom_point(data= dat2, aes(x=p.value, y=log2, shape=shp, fill=p.value), shape=21, size=2)
p <- p + scale_fill_gradient(low="gray90", high="blue")

enter image description here