You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2绘制双分面组合图时geom_line无报错但不显示线条求助

问题根因

你遇到的折线不显示问题由两个核心原因导致:

  • 原数据拼接后,rate_20y分面下的每个group分组在每个location x轴位置仅存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:24:03