ggplot图例中[2,3]区间未着色求助(数据最大值为2.55)
问题原因及解决方案
你遇到的问题核心是手动cut生成的因子水平与图例标签、颜色的匹配出现偏差,导致[2,3]区间没有正确关联到对应的颜色,最终显示为na.value设置的白色。
具体来说,你通过cut(break_values, ...)生成break_labels作为图例标签,但break_values的步长(0.2)设置导致部分区间的标签生成逻辑和实际数据分组的区间表示不完全一致,再加上手动指定labels后,ggplot无法正确将最后一个颜色分配给[2,3]区间。
解决方案1:改用scale_fill_stepsn(推荐)
直接使用ggplot内置的分阶颜色映射函数,无需手动cut,自动处理区间与颜色的对应关系:
# 定义断点 my_breaks <- c(-3, -2, -1, -0.5, -0.1, 0.1, 0.5, 1, 2, 3) # 定义对应颜色(9个颜色对应9个区间) my_colors <- c( "#67001f", "#b2182b", "#d6604d", "#f4a582", "#bdbdbd", "#4393c3", "#2166ac", "#084594", "#053061" ) # 绘图 map1 <- ggplot(data = sif_min_sm2) + geom_tile(aes(x = lon, y = lat, fill = SIF_SM)) + coord_equal() + labs(x = "经度", y = "纬度") + scale_fill_stepsn( breaks = my_breaks, colors = my_colors, include.lowest = TRUE, na.value = "white", name = "SIF异常值", labels = c( "[-3,-2]", "(-2,-1]", "(-1,-0.5]", "(-0.5,-0.1]", "(-0.1,0.1]", "(0.1,0.5]", "(0.5,1]", "(1,2]", "(2,3]" ) ) + ggtitle("SM最干旱月份对应的SIF") + theme_minimal() + theme( panel.background = element_blank(), plot.title = element_text(size = 14, face = "bold"), legend.position = "right", legend.key.size = unit(1, "lines"), legend.text = element_text(size = 8), legend.key.height = unit(1, "cm"), legend.margin = margin(t = 0, r = 5, b = 0, l = 0) )
解决方案2:修正手动cut的匹配逻辑
如果坚持使用手动cut,提前生成分组变量并确保颜色与因子水平完全对应:
# 定义断点 my_breaks <- c(-3, -2, -1, -0.5, -0.1, 0.1, 0.5, 1, 2, 3) # 定义对应颜色 my_colors <- c( "#67001f", "#b2182b", "#d6604d", "#f4a582", "#bdbdbd", "#4393c3", "#2166ac", "#084594", "#053061" ) # 提前生成分组变量并检查水平 sif_min_sm2$SIF_group <- cut(sif_min_sm2$SIF_SM, breaks = my_breaks, include.lowest = TRUE) # 可运行levels(sif_min_sm2$SIF_group)确认包含(2,3]区间 # 绘图 map1 <- ggplot(data = sif_min_sm2) + geom_tile(aes(x = lon, y = lat, fill = SIF_group)) + coord_equal() + labs(x = "经度", y = "纬度") + scale_fill_manual( values = my_colors, na.value = "white", name = "SIF异常值" ) + ggtitle("SM最干旱月份对应的SIF") + theme_minimal() + theme( panel.background = element_blank(), plot.title = element_text(size = 14, face = "bold"), legend.position = "right", legend.key.size = unit(1, "lines"), legend.text = element_text(size = 8), legend.key.height = unit(1, "cm"), legend.margin = margin(t = 0, r = 5, b = 0, l = 0) )
这两种方法都能解决[2,3]区间色块显示白色的问题,第一种方法更简洁且不易出错。
内容的提问来源于stack exchange,提问作者herakles_1950
相关产品推荐
相关产品推荐

