使用R / ggplot2使用scale_colour_continuous控制中间值颜色

时间:2014-02-06 06:27:44

标签: r colors ggplot2

我有一组数据,希望将colour美学映射到某种“参考值”,如下所示:

  • 以下值为红色
  • 附近的值是蓝色
  • 以上值为绿色

我仍然希望显示值是连续的,所以简单地使用像cut()这样的函数并使用scale_colour_discrete并不是我想要的。这是一些示例数据:

set.seed(123)
x <- runif(100, min = 1, max = 10)
y <- runif(100, min = 1, max = 10)
test <- data.frame(x = x, y = y)
test$colour <- runif(100, min = 1, max = 10)
ggplot(test, aes(x = x, y = y, colour = colour)) + geom_point(size = 3)

产生以下内容:

enter image description here

我熟悉scale_colour_gradient(low = "red", high = "green"),但我希望更有意识地将我的颜色转换为所需的值映射,以使区域“流行”更具视觉效果。间距不一定是线性的。换句话说,对于参考值3,映射将是这样的:

value:  1     3      10
colour: red   blue   green

这可能吗?我还会采用其他解决方案来实现良好的可视化,以便在各点之间轻松突出“理想”值。例如,我考虑替换引用附近的值(ref - tol < colour < ref + tol) <- NA,然后使用scale_colour_gradient的{​​{1}}选项。

或者我应该真正考虑na.value选项,只需要一个非常小的切割尺寸,然后弄清楚如何逐渐改变颜色沿着合成的断裂?

2 个答案:

答案 0 :(得分:5)

来自http://docs.ggplot2.org/0.9.2.1/scale_gradient2.html

scale_color_gradient2(low = "red", midpoint = 3, mid = "blue", high = "green")

更新:

关于OP的评论 - 玩中点和space="Lab"有助于:

# Using the Lab colour space also improves perceptual properties
# at the price of slightly slower operation
d + scale_colour_gradient2(space="Lab")

从墓地回来 - 鉴于最新的评论,我意识到应该把两行代码放在一起:

scale_color_gradient2(low = "red",
midpoint = 3,
mid = "blue",
high = "green",
space="Lab")

答案 1 :(得分:2)

可以定义三种或更多颜色,并指定数据值如何使用scale_colour_gradientn()映射到色阶。您想要定义颜色并使用values=选项定义从数据到颜色的映射。

以下内容将实施您建议的三色方案:

set.seed(123)
x <- runif(100, min = 1, max = 10)
y <- runif(100, min = 1, max = 10)
test <- data.frame(x = x, y = y)
test$colour <- runif(100, min = 1, max = 10)
test.plot <- ggplot(test, aes(x = x, y = y, colour = colour)) + 
  geom_point(size = 3) +
  scale_colour_gradientn(colours=c("red","blue","green"),
                         values=rescale(c(1,3,10)), 
                         space = "Lab")
test.plot

这会生成图表as illustrated here(对不起;我没有嵌入图片的声誉点)。

关于问题的第二部分,要突出显示特定值,一个选项是以不同的颜色重新绘制。回到原始的情节,使用深蓝色到浅蓝色渐变,我们可以用红色重新绘制颜色值为3的点。为了避免来自重叠点的任何视觉瑕疵,我们可以使用不同大小的点,通过指定size =或通过shape =使用更大的形状(如在qcc包中所做的那样)。

test2 <- test[test$colour > 2.5 & test$colour < 3.5,]
test2.plot <- ggplot(test, aes(x = x, y = y, colour = colour)) + 
  geom_point(size = 3, shape = 20) +
  geom_point(data = test2, aes(x = x, y = y), 
             colour = "red", size = 3, shape = 19)
test2.plot

此处the sample graph

由于此过度绘图并未显示在图例上,因此需要进行一些额外的工作来标记突出显示的点。