饱和颜色时如何调整ggplot图例的比例

How to adjust scale of ggplot legend when saturating color

创建光栅图时,我想在最小和最大级别使颜色条饱和以强调特定范围。在这种情况下,我想强调中间范围(19-30),即使实际范围是 6-56。

x<-c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
y<-c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)
z<-c(20,21,22,23,40,23,6,23,25,24,56,23,20,23,25,20)

DF<-data.frame(x,y,z)


ggplot(DF,aes(x=x, y=y)) +
  geom_raster(aes(fill = z)) +
  scale_fill_gradientn(limits = c(19, 30), 
                       colors = c('blue', "red"), oob = scales::squish)

这是我想要的情节,但我希望图例中的数字代表“z”值范围内的真实比例。理想情况下,结果将是相同的图,但图例文本中的数字将从 6 到 56(“z”的最小值和最大值)不等。 图例中的颜色渐变应该在 30 以上和 19 以下饱和。向查看者指示所有高于 30 的值都是相同的颜色,所有低于 19 的值都是相同的颜色。因此,虽然图例的刻度为 30-56,但图例颜色条不会在 30 以上发生变化。

你可以试试这个:

ggplot(DF,aes(x=x, y=y)) +
    geom_raster(aes(fill = z)) +
    scale_fill_gradientn(values = scales::rescale(x=c(min(DF$z),19,30, max(DF$z)), to = c(0,1), from = c(min(DF$z), max(DF$z))),  colors = c('blue','blue', "red", "red"))