使用两个色阶渐变的ggplot2

26

如果有的话,我认为这个问题一定有一个非常简单的解决方案。我有两个大型数据框,基本上看起来像这样:

> 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设置另一个颜色渐变?我在之前的帖子中读到,不可能使用两种不同的颜色比例(例如第一个的“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") 

相关帖子 使用 scale_colour_identity() 来为每个点定义自己的颜色。 - zx8754
2个回答

28

虽然时间有些久远,不过可以看看这个链接:https://github.com/eliocamp/ggnewscale

你可以使用函数new_colour_scale()来创建一个新的颜色刻度,它会应用于其后的所有内容。


26

首先要注意的是,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

在此输入图片描述


啊哈,我遇到了同样的问题,只不过我没有将scale_colour_gradient应用于两组点,而是应用于一组点,并且我想为一个叠加的geom_path添加另一个scale_colour_gradient.....这两个都有不同的分布,但我仍然希望在同一张图表中看到它们。有什么提示吗?我应该补充说,我的渐变使用scale_colour_gradientn进行了大量定制。 - Thomas Browne
1
@ThomasBrowne 如果您能提出一个新问题,并提供一个简单的可重现示例,这里有许多ggplot专家用户会跳进来回答。 - Ram Narasimhan
抱歉打扰你,Ram!你介意帮我看看这个问题的答案吗:http://stackoverflow.com/a/25588144/2872891?当我将这种方法集成到我的实际代码库中时,我还遇到了另一个问题。如果我将其记录为一个问题,我可以请你帮忙吗?谢谢! - Aleksandr Blekh
更一般的方法是在调用ggplot2之前将数据重新缩放到一个公共比例。请参阅https://dev59.com/sFbTa4cB1Zd3GeqP-mwn#5738083。 - CoderGuy123
1
这里的 shp 是什么?在 shape = shp 中。 - AnilGoyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接