[英]Trim scale_color_gradient() legend in ggplot
我正在尝试“修剪”下面 plot 的图例:
df <- data.frame(x = seq(0, 15 , 0.001),
y = seq(0, 15, 0.001))
ggplot(df, aes(x=x, y=y, col = y)) +
geom_line() +
scale_color_gradientn(colours = c("green", "black", "red", "red"),
values = rescale(x = c(0, 2, 4, 15), to = c(0,1), from = c(0, 15) ))
我可以通过添加breaks = c(0,2,4), labels = c("0", "2", "4+")
来设置所需的中断和值:
但是当我添加limits=c(0,4)
时,渐变变得混乱。
题
是否可以“修剪”图例,使其显示从 0 到 4+ 的值(即,并省略上面的所有值)?
以下是您可能想要的。
library(ggplot2)
library(scales)
df <- data.frame(x = seq(0, 15 , 0.001),
y = seq(0, 15, 0.001))
ggplot(df, aes(x=x, y=y, col = y)) +
geom_line() +
scale_color_gradientn(colours = c("green", "black", "red", "red"),
values = rescale(x = c(0, 2, 4, 15), from = c(0, 4)),
oob = squish,
limits = c(0, 4))
发生的事情如下。 假设我们在数据空间中有一些值(意味着它们还没有被重新缩放)。
# Colour positions in data space
print(col_pos_data <- c(0, 2, 4, 15))
#> [1] 0 2 4 15
默认情况下, scales::rescale()
function 将所有内容带入 [0,1] 区间。 但是,当您设置自定义范围时,任何超出范围的值都将与范围内的值成线性比例。 您会注意到在本例中 15 变为 3.75。
# Colour positions in [0,1] interval
col_pos_scaled <- rescale(col_pos_data, from = c(0, 4))
print(col_pos_scaled)
#> [1] 0.00 0.50 1.00 3.75
但是,ggplot 强制执行连续比例限制的默认方式是将超出限制的任何内容设置为NA
,这通常会在以后删除。
# Default ggplot limit enforcing
print(censor(col_pos_scaled))
#> [1] 0.0 0.5 1.0 NA
现在这对于您的扩展目的来说有点太糟糕了,但是其中一种选择是“压缩”数据。 这会将任何(有限的)超出范围的值带到最近的限制。 请注意,最后一个值不再是NA
,而是设置为 [0,1] 区间中的最大限制。
print(scaled_squish <- squish(col_pos_scaled))
#> [1] 0.0 0.5 1.0 1.0
如果相应地调整范围,同样的事情也适用于数据空间中的值。
print(censor(col_pos_data, range = c(0, 4)))
#> [1] 0 2 4 NA
print(data_squish <- squish(col_pos_data, range = c(0, 4)))
#> [1] 0 2 4 4
在内部,ggplot 将所有数据重新缩放到极限,并且操作顺序对于压缩/重新缩放无关紧要,因此 [0,1] 中的数据值和颜色位置很好地对齐。
# So when data values are rescaled, they match up the colours
identical(rescale(data_squish), scaled_squish)
#> [1] TRUE
由reprex package (v0.3.0) 创建于 2020-04-24
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.