使用ggplot中的颜色渐变强调指定的值

时间:2018-03-05 03:31:11

标签: r ggplot2 colors

给出这样的数据集:

TT <- c(23.67, 23.67, 23.68, 23.67, 23.67, 23.67, 23.66, 23.59, 23.54, 23.30, 20.65, 16.13,
       13.39, 12.81, 12.04, 11.70, 11.42, 11.24, 10.86, 10.63,  9.88,  9.19,  8.79,  8.37,
       7.85,  7.36,  7.10,  6.99,  6.88,  6.69,  6.39,  6.35,  6.31,  6.25,  6.18,  6.02,
       6.00,  5.96,  5.93,  5.93,  5.86,  5.85,  5.85,  5.85,  5.82,  5.80,  5.78,  5.75)

x <- rep(1, 48)
D <- seq(1, 48)

DF <- data.frame(D, x, TT)

我的目标是使用从红色到蓝色的颜色托盘来绘制T中的差异。我目前的情节如下:

gg <- ggplot(data = DF, aes(x = x, y=D, height = 1.1, width = 1.3, fill = TT))+
  geom_tile() +  
  scale_fill_gradient(high = "firebrick2", low = 'dodgerblue2', 
                      na.value = 'grey50', space = "Lab",
                      lim = c(min(DF$T), max(DF$T)))
gg

但我想强调频谱下端的变化渐变(比如7到5之间的变化)。在ggplot中是否有一种方法可以使较高的值饱和,因此它们都由单个(或类似的)红色表示,红色和蓝色之间的大部分渐变表示7和5之间的变化?

2 个答案:

答案 0 :(得分:1)

在填充限制之外设置大于7的所有内容(将na.value分配给他们)&amp;为na.value选择稍暗的红色阴影应该可以完成工作:

ggplot(DF,
       aes(x = x, y = D, fill = TT)) +
  geom_tile() +
  scale_fill_gradient(high = "firebrick2",
                      low = "dodgerblue2",
                      na.value = "firebrick3", # red for NA values
                      lim = c(min(DF$TT), 7))  # every TT value larger than 7 will be NA

plot

注意:我将列命名为TT而不是T,因为T是R中TRUE的简写。不那么令人困惑。

答案 1 :(得分:1)

虽然@ Z.lin回答和@Axeman评论解决了关于如何压低更高价值并强调OP要求的较低值差异的问题,但我建议OP采用不同的方法来解决问题。我倾向于不喜欢要求压低高值的方法,因为它在视觉上描绘真实的数据范围时具有欺骗性。

我将提出一种替代解决方案,即记录变换您的值,以便您的梯度刻度仍可准确描述您的数据范围。鉴于您的数据范围,log 2转换似乎已足够,例如:

log2(6)
[1] 2.584963
log2(12)
[1] 3.584963
log2(24)
[1] 4.584963

ggplot(data = DF, aes(x = x, y=D, height = 1.1, width = 1.3, fill = log2(TT)))+
  geom_tile() +  
  scale_fill_gradient(high = "firebrick2", low = 'dodgerblue2', 
                      na.value = 'grey50', space = "Lab",
                      lim = c(log2(min(DF$T)), log2(max(DF$T))))

enter image description here