我有一组数据,希望将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)
产生以下内容:
我熟悉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
选项,只需要一个非常小的切割尺寸,然后弄清楚如何逐渐改变颜色沿着合成的断裂?
答案 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
由于此过度绘图并未显示在图例上,因此需要进行一些额外的工作来标记突出显示的点。