ggplot2绘制双分面组合图时geom_line无报错但不显示线条求助
问题根因
你遇到的折线不显示问题由两个核心原因导致:
- 原数据拼接后,
rate_20y分面下的每个group分组在每个locationx轴位置仅存在1个观测值,折线图至少需要2个点才能绘制连线,因此无内容输出 - 你未对两类数据的分组命名做统一处理,
rate_20y对应的分组名带_change_rate2018_2001后缀,和面积的分组名完全不匹配,无法按同一土地覆盖类型完成分组映射
解决方案
先统一两类数据的分组命名,再给geom_line明确指定分组映射即可:
# 补充加载tidyr包,pivot_longer函数依赖该包 library(lubridate) library(dplyr) library(ggplot2) library(tidyr) zone <- structure(list(location = c("rm", "jj", "jsy", "hyh"), cropland_2018 = c(0.92330383480826, 0.887755102040816, 0.813559322033898, 0.771653543307087), urban_2018 = c(0.0176991150442478, 0.0283446712018141, 0, 0.00393700787401575), nature_2018 = c(0.0589970501474926, 0.0839002267573696, 0.186440677966102, 0.224409448818898), cropland_change_rate2018_2001 = c(0, 0, 0, -0.069620253164557), urban_change_rate2018_2001 = c(0.0526315789473684, -0.281553398058252, 0, 0), nature_change_rate2018_2001 = c(-0.00294117647058824, -0.00898876404494382, -0.0833333333333333, 0.0363636363636364 )), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame" )) # 处理数据时统一分组命名,去掉冗余后缀 z <- zone %>% pivot_longer(cols = cropland_2018:nature_2018, names_to = "landcover", values_to = "area_percent") %>% mutate(landcover = gsub("_2018", "", landcover)) df <- z %>% pivot_longer(cols = cropland_change_rate2018_2001:nature_change_rate2018_2001, names_to = "change", values_to = "rate_20y") %>% mutate(change = gsub("_change_rate2018_2001", "", change)) dfF <- rbind( data.frame( location = df$location, num = df$rate_20y, group = df$change, what = "rate_20y"), data.frame( location = df$location, num = df$area_percent, group = df$landcover, what = "area_percent" ) ) # 固定location的顺序,避免x轴自动排序不符合预期 dfF$location <- factor(dfF$location, levels = c("rm", "jj", "jsy", "hyh")) secondFacet <- FALSE ggplot(data = dfF, mapping = aes(x = location, y = num, fill = group, color = group)) + facet_grid(what~., scale = "free") + # 明确指定按group列分组绘制折线,额外加点位方便观测数值 geom_line(data = dfF[dfF$what == "rate_20y",], aes(group = group), size = 2) + geom_point(data = dfF[dfF$what == "rate_20y",], size = 3) + # 按统一后的分组名映射颜色,逻辑更清晰 scale_color_manual(values = c("cropland" = "#999999", "urban" = "#E69F00", "nature" = "#56B4E9")) + geom_bar(data = dfF[dfF$what == "area_percent",], position = "dodge", stat = "identity") + scale_fill_manual(values = c("cropland" = "#999999", "urban" = "#E69F00", "nature" = "#56B4E9")) + theme_bw() + scale_y_continuous(name = NULL, labels = function(b) { if(!secondFacet) { secondFacet <<- TRUE return(paste0(round(b * 100, 0), "%")) } else { return(b) } })
内容的提问来源于stack exchange,提问作者vivian998
相关产品推荐
相关产品推荐

