如何在ggplot2中制作具有急剧过渡的色标

时间:2015-07-19 08:08:03

标签: r ggplot2

我正在尝试创建一个色彩过渡到一点的色标。我目前正在做的是:

test <- data.frame(x = c(1:20), y = seq(0.01, 0.2, by = 0.01))

cutoff <- 0.10

ggplot(data = test,
       aes(x = as.factor(x), y = y, fill = log(y), width = 1, binwidth = 0)) + 
 geom_bar(stat = "identity") +
 scale_fill_gradientn(colours = c("red", "red", "yellow", "green"), 
                      values = rescale(log(c(0.01, cutoff - 0.0000000000000001, cutoff, 0.2))), 
                      breaks = c(log(cutoff)), label = c(cutoff))

正在制作我想要的情节。但是,颜色条中断的位置在某种程度上取决于截止值。有时低于价值,有时高于,有时在线。以下是一些具有不同截止值(0.05,0.06,0.1)的图:

cut off at 0.05 cut off at 0.06 cut off at 0.10

我做错了什么?或者,是否有更好的方法来创建这样的色标?

3 个答案:

答案 0 :(得分:1)

如果您仍然对此解决方案感兴趣,可以将guide = guide_colourbar(nbin = <some arbitrarily large number>)添加到scale_fill_gradientn()。这会增加颜色条图例使用的纸槽数量,从而使过渡看起来更加清晰。

# illustration using nbin = 1000, & weighted colours below the cutoff
plot.cutoff <- function(cutoff){
  p <- ggplot(data = test,
              aes(x = as.factor(x), y = y, fill = log(y))) + 
    geom_col(width = 1) +
    scale_fill_gradientn(colours = c("red4", "red", "yellow", "green"), 
                         values = scales::rescale(log(c(0.01, cutoff - 0.0000000000000001, 
                                                        cutoff, 0.2))), 
                         breaks = c(log(cutoff)), 
                         label = c(cutoff),
                         guide = guide_colourbar(nbin = 1000))
  return(p)
}

cowplot::plot_grid(plot.cutoff(0.05),
                   plot.cutoff(0.06),
                   plot.cutoff(0.08),
                   plot.cutoff(0.1),
                   ncol = 2)

illustration

(如果您在高分辨率下发现上述内容不够清晰,也可以在raster = FALSE中设置guide_colourbar(),这将关闭插值并改为绘制矩形。)

答案 1 :(得分:1)

您是否看过scale_colour_stepsscale_colour_stepsn

使用n.break中的选项scale_colour_stepsn,您应该能够区分出想要的休息点的数量,并具有惊人的过渡效果。

请务必使用ggplot2> 3.3.2

答案 2 :(得分:0)

认为使用scale_fill_gradientn在连续色标中获得精确的离散截止点有点棘手。一个快速的替代方法是使用scale_fill_gradient,使用limits设置截止值,并使用na.value设置“越界”值的颜色。

这是一个比你的问题更简单的例子:

# some data
df <- data.frame(x = factor(1:10), y = 1, z = 1:10)

# a cutoff point
lo <- 4 

ggplot(df, aes(x = x, y = y, fill = z)) + 
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "yellow", high = "green",
                      limits = c(lo, max(df$z)), na.value = "red")

enter image description here

如您所见,切点下方的值不会出现在图例中,但可以考虑包括大块红色,无论如何都浪费了“图例带宽”。您可以在图标题中添加红色条的口头描述。

您可能还希望区分低于低切点和高于高切点的值。例如,将“太低”值设置为蓝色,将“太高值”设置为红色。在这里,我使用findInterval来区分低,中和高值。

# some data
set.seed(2)
df <- data.frame(x = factor(1:10), y = 1, z = sample(1:10))

# lower and upper limits
lo <- 3
hi <- 8

# create a grouping variable based on the the break points
df$grp <- findInterval(df$z, c(lo, hi), rightmost.closed = TRUE)

ggplot(df, aes(x = x, y = y, fill = z)) + 
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "yellow", high = "green", limits = c(lo, hi), na.value = "red") +
  geom_bar(data = df[df$grp == 0, ], fill = "blue", stat = "identity")

enter image description here