我正在尝试创建一个色彩过渡到一点的色标。我目前正在做的是:
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)的图:
我做错了什么?或者,是否有更好的方法来创建这样的色标?
答案 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)
(如果您在高分辨率下发现上述内容不够清晰,也可以在raster = FALSE
中设置guide_colourbar()
,这将关闭插值并改为绘制矩形。)
答案 1 :(得分:1)
您是否看过scale_colour_steps或scale_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")
如您所见,切点下方的值不会出现在图例中,但可以考虑包括大块红色,无论如何都浪费了“图例带宽”。您可以在图标题中添加红色条的口头描述。
您可能还希望区分低于低切点和高于高切点的值。例如,将“太低”值设置为蓝色,将“太高值”设置为红色。在这里,我使用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")