ggplot2中scale_fill_gradient2未显示low颜色,如何呈现三色渐变?
如何让ggplot2的scale_fill_gradient2显示全部low、mid、high颜色?
我遇到的问题类似相关场景,但使用scale_fill_gradient2()时能看到mid颜色(橙色),却完全看不到low颜色(绿色)。
绿色缺失的图表:

所用代码:
library(tidyverse) library(forcats) df %>% ggplot(aes(y = prop, x = fct_rev(var), fill = as.integer(df$var))) + ## 把离散变量转成连续变量的临时办法 geom_bar(stat = "identity", width = 0.3) + scale_fill_gradient2(name = "category", low = "green", mid= "orange", high = "purple", space = "Lab", # midpoint = 0, guide= 'legend', # limits = c(-7, 7), ## 试过其他帖子的解决方案,但没用 ) + coord_flip(clip = "off")
核心问题:为什么绿色完全看不到?
- 数据结构:
structure(list(var = structure(1:7, .Label = c("VAR_A", "VAR_B", "VAR_C", "VAR_D", "VAR_E", "VAR_F", "VAR_G"), class = "factor"), x = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("no", "yes"), class = "factor"), n = c(7L, 30L, 49L, 48L, 47L, 39L, 21L), prop = c(13.73, 58.82, 96.08, 94.12, 92.16, 76.47, 41.18)), class = c("grouped_df", "tbl_df", "tbl", "data.frame" ), row.names = c(NA, -7L), groups = structure(list(var = structure(1:7, .Label = c("VAR_A", "VAR_B", "VAR_C", "VAR_D", "VAR_E", "VAR_F", "VAR_G"), class = "factor"), .rows = structure(list(1L, 2L, 3L, 4L, 5L, 6L, 7L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -7L), .drop = TRUE))
问题原因及解决办法
原因分析
- 你用来映射填充色的
as.integer(df$var)取值范围是1到7,scale_fill_gradient2()默认midpoint为该范围的中点(即4),绿色对应最小值1,橙色对应4,紫色对应7。 - 你设置了
guide='legend',ggplot对连续颜色生成离散图例时,默认断点可能未包含最小值1,导致绿色未在图例和可视化中显现。 - 之前尝试
limits=c(-7,7)但未调整midpoint,默认midpoint=0时,所有数据(1-7)都落在midpoint到high区间,绿色自然不会显示。
解决办法
方案1:改用颜色条图例(推荐)
把guide='legend'改为默认的guide='colorbar',完整显示连续颜色过渡:
library(tidyverse) library(forcats) df %>% ggplot(aes(y = prop, x = fct_rev(var), fill = as.integer(var))) + # 无需df$,直接引用变量即可 geom_bar(stat = "identity", width = 0.3) + scale_fill_gradient2(name = "category", low = "green", mid = "orange", high = "purple", space = "Lab") + # 默认guide为colorbar,可省略 coord_flip(clip = "off")
方案2:保留图例并手动指定断点
如果需要用离散图例,手动指定包含最小值1的断点:
df %>% ggplot(aes(y = prop, x = fct_rev(var), fill = as.integer(var))) + geom_bar(stat = "identity", width = 0.3) + scale_fill_gradient2(name = "category", low = "green", mid = "orange", high = "purple", space = "Lab", guide = guide_legend(breaks = c(1,4,7))) + # 指定包含绿色对应的1 coord_flip(clip = "off")
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

