在一个图中为不同范围的数据使用多个scale_colour_gradient标度

时间:2012-04-13 13:55:07

标签: r ggplot2

我对R很新,所以如果我的问题不明确,请耐心等待。

我有一个data.frame“蛋白质”,有5列,即

1.protein_name,2.protein_FC,3.protein_pval,4.mRNA_FC,5.mRNA_pval和6.freq。

我试图绘制一个火山图,其中x = log2(protein_FC),y = -log10(protein_pval)。然后将点的大小映射到频率和颜色到mRNA_FC。这一切都很好,这是我用过的代码:

ggplot( protein [ which ( protein$freq <= 0.05 ),] , aes( x = log2( protein_FC ) ,
       y = -log10 ( protein_pval ) , size = freq , colour = mRNA_FC , 
       label = paste(protein_name,",",mRNA_pval), alpha=1/1000)) + 
  geom_point() + geom_text( hjust = 0 , vjust = 0 , colour = "black" , size = 2.5 ) + 
  geom_abline( intercept = 1.3 , slope = 0) + 
  scale_colour_gradient(limits=c(-3,3))
直到这里一切都很好。但由于实验的性质,数据在mRNA_FC = 0附近非常密集。在那里,ggplot应用的默认配色方案在区分不同点时效果不佳。

我使用low="colour1"high="colour2"尝试了各种色阶。但是我认为最好在mRNA_FC的范围内使用多个颜色标度,例如。 -3<mRNA<-0.2为蓝色至白色,-0.2<mRNA_FC<0为红色至白色,0<mRNA_FC<0.2为绿色至白色,0.2<mRNA_FC<3为绿色至白色。

但我还没有找到任何办法。

任何帮助将不胜感激。 干杯!

1 个答案:

答案 0 :(得分:10)

对于此类事情,您要使用scale_gradientn。例如:

library(ggplot2)

x = seq(-0.1, 0.1, len=100)
y = 0:10
dat = expand.grid(x=x, y=y)

ggplot(data=dat, aes(x=x, y=y, fill=x)) +
  geom_raster() +
  scale_fill_gradientn(colours=c('red', 'yellow', 'cyan', 'blue'),
    values   = c(-0.05,-1e-32,1e-32,0.05),
    breaks   = c(-0.05,-0.005,0.005,0.05),
    rescaler = function(x,...) x,
    oob      = identity)

enter image description here