使用两个缩放颜色渐变ggplot2

JRo*_*goF 15 r 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   
...
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码将两个数据帧绘制到同一个图中:

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))
Run Code Online (Sandbox Code Playgroud)

当我绘制单个数据帧时,我在"p.value"列中使用了红白色渐变.使用此行:

p <- p + scale_colour_gradient(limits=glim, trans='log10', low="red", 
high="white") 
Run Code Online (Sandbox Code Playgroud)

核心问题是:现在有两个数据帧,如何为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") 
Run Code Online (Sandbox Code Playgroud)

Ram*_*han 16

首先,请注意ggplot不鼓励这一点的原因是因为这些图很难解释.

您可以通过一些作弊来获得两种颜色的渐变音阶.在geom_point中,某些形状(21到25)可以同时具有填充和颜色.您可以利用它创建一个具有"填充"比例的图层和另一个具有"颜色"比例的图层.

# 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() +
       geom_point(data=dat1, aes(x=p.value, y=log2, color=p.value), shape=21, size=3) +
       scale_color_gradient(low="red", high="gray50") +
       geom_point(data= dat2, aes(x=p.value, y=log2, shape=shp, fill=p.value), shape=21, size=2) +
       scale_fill_gradient(low="gray90", high="blue")
p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


mas*_*her 16

我知道这是很长一段时间之后,但看看https://github.com/eliocamp/ggnewscale

您可以使用该功能new_colour_scale()开始一个新的色阶,该色阶适用于它之后的所有内容。