ggplot手动设置颜色渐变的scale_color_gradientn

15

我有一个像这样的数据框

BP        R2      LOG10
96162057 0.2118000 2.66514431
96162096 0.0124700 0.31749391
96162281 0.0008941 0.07012148
96163560 0.5011000 2.48505399
96163638 0.8702000 3.37778598

我想绘制BP对LOG10的图,并按R2将点着色。 R2是从0到1的连续值。

myplot <- read.cvs("mytable.csv",head=TRUE)
attach(myplot)
ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point() 

到目前为止,一切都很好。然而我希望以手动选择的间隔和颜色来显示R2值,就像这样(如果我有离散值)。

ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point() + 
      scale_color_manual(breaks= c("1","0.8","0.6","0.4","0.2","0"), 
                values = c("red","yellow","green","lightblue","darkblue"))
Error: Continuous value supplied to discrete scale

这看起来很漂亮,但我更喜欢自己设置颜色。

ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point(shape=1) + 
               scale_colour_gradientn(colours = rainbow(10))

那么,我如何手动选择连续值的间隔(1-0.8、0.8-0.6、0.6-0.4、0.4-0.2、0.2-0),并将它们按自己的喜好着色(红色、黄色、绿色、浅蓝色、深蓝色)?颜色之间的平滑渐变很酷,但不是必须的。

2个回答

25

您可以使用scale_colour_gradientn(),然后提供自己的colours=values=。Values将为每种颜色提供间隔。

ggplot(myplot,aes(BP,LOG10, color = R2)) + geom_point() + 
  scale_colour_gradientn(colours = c("red","yellow","green","lightblue","darkblue"),
                         values = c(1.0,0.8,0.6,0.4,0.2,0)) 

渐变图表示例


非常感谢,Didzis,这完全解决了问题!您是否也有一种没有渐变的解决方案,而是所有值从1-0.8 = 红色,0.8-0.6 = 黄色,依此类推? - user2724998
然后,您应该使用cut()函数将数据分成间隔,并将这些间隔用作离散值。 - Didzis Elferts
如何使这个渐变在六个不同的值之间,但只从蓝色到红色?我想提供“低”和“高”的颜色,中间级别会相应地混合。我谈论的是这个离散版本: scale_color_gradient(low="blue", high="red")。我只能通过自定义函数使其正常工作,但一定有更简单的方法: color.gradient.discrete = function(color.low, color.high, n) { scales::seq_gradient_pal(low=color.low, high=color.high)(seq(0, 1, length.out = n)) } - Mario Reutter
预期的结果如此所示:这里展示了离散颜色渐变。 - Mario Reutter

22

回复此帖4年后:需要注意的是,“values”将您的变量值映射在0到1之间,其中0表示最低值,1表示最高值。在此示例中,这巧合地符合了变量的值从0到1。


1
当然可以!我也遇到了这个问题。请看Camille在https://stackoverflow.com/q/51901813/4606130中的建议。 - micstr
@Tjebo非常好的观点!很幸运我向下滚动并阅读了你的评论! - mand3rd

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