如何在保留中点的前提下用scale_color_gradient2()缩小中间区域
解决方案:缩小scale_color_gradient2的中间白色区域
要让红色和蓝色在x=±0.5时达到完全饱和,缩小中间白色区域,你可以用以下两种简单方法:
方法1:用scale_color_gradient2结合limits和squish函数
通过指定颜色映射的范围,再把超出范围的值压缩到极限颜色,就能让±0.5的位置直接达到饱和色,自然缩小中间白色区域:
library(ggplot2) library(scales) set.seed(123) x <- rnorm(100) y <- density(x, n = 2^12) mydf <- data.frame(x = y$x, y = y$y) ggplot(mydf, aes(x, y)) + geom_line() + geom_segment(aes(xend = x, yend = 0, color = x)) + scale_color_gradient2( low = "red", mid = "white", high = "blue", midpoint = 0, limits = c(-0.5, 0.5), # 设置颜色饱和的x边界 oob = squish # 把超出边界的x值映射为对应极限色 )
方法2:用scale_color_gradientn精确控制颜色位置
如果你倾向于用scale_color_gradientn,可以通过values参数指定每个颜色对应的x位置,精准控制中点和饱和点:
library(ggplot2) library(scales) set.seed(123) x <- rnorm(100) y <- density(x, n = 2^12) mydf <- data.frame(x = y$x, y = y$y) ggplot(mydf, aes(x, y)) + geom_line() + geom_segment(aes(xend = x, yend = 0, color = x)) + scale_color_gradientn( colors = c("red", "white", "blue"), # 将指定的x值转换为0-1的归一化比例,对应颜色位置 values = scales::rescale(c(-0.5, 0, 0.5)) )
两种方法都能实现目标:红色在x≤-0.5时完全饱和,蓝色在x≥0.5时完全饱和,中间白色区域仅在0附近的小范围过渡。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

