繁体   English   中英

在 ggplot 中修剪 scale_color_gradient() 图例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM