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

使用ggplot2::geom_area()填充曲线区域时,两区域边界出现空白

问题原因分析

你的代码存在两个核心问题,导致pct=85处出现填充空白:

  1. 错误使用离散型x轴尺度
    pct是连续数值类型(1到90的整数),但你用scale_x_discrete()设置x轴,同时指定limits = c(1, 44, 86)。这会让ggplot将连续的pct值当作离散类别处理,并且只保留你指定的三个x值,pct=85的数据点被排除在x轴显示范围之外,对应填充区域自然无法显示。

  2. 分组填充的衔接失效
    my_fill在pct=85(B组)和pct=86(C组)处切换分组,但因x轴被错误设置为离散尺度,B组填充会在pct=44后截止到被过滤的85之前,视觉上呈现空白。

修复方案

将x轴改为连续型尺度,调整breaks和limits以包含关键数据点:

library(dplyr)
library(ggplot2)

my_df <- structure(list(pct = 1:90, value = c(1169, 1221, 1276, 1324, 
                                     1375, 1429, 1487.76, 1557, 1638, 1722, 1815, 1910, 1996, 2099, 
                                     2183, 2258, 2335, 2415, 2492, 2578, 2665, 2767, 2886, 3046, 3266, 
                                     3601.85, 4177, 5665.56, 69903.38, 90771.45, 106208.8, 120299.04, 
                                     135166.06, 150344.65, 167729.92, 188525.15, 213467.44, 245582.4, 
                                     291334.84, 364050.75, 513903.5, 1128914.58, 7816368.00000001, 
                                     41104774.86, 47947469.24, 54209175.2, 59851221.76, 65688467.7, 
                                     71559563.96, 77981826.05, 86998181.8, 106239490.88, 122193369.58, 
                                     151889642.13, 176958452.24, 206981422.15, 247329791.92, 266069046.55, 
                                     291213938.16, 330950339.58, 348310803.2, 365222833.82, 400510785.48, 
                                     425404324.16, 438221019.24, 457370633.75, 494181336.4, 514636464.46, 
                                     528620039.58, 553030448.06, 592935005.4, 607385156.58, 627329445.94, 
                                     675674400.259999, 699811981.52, 755630100.25, 801576337.94, 875804545.479999, 
                                     964945467.160001, 1070663697.17, 1203097325.6, 1296094399, 1477237728.04, 
                                     1652506972.57, 1818977179.62, 2170959782.6, 2881501337.19999, 
                                     4319009925.36, 6457753872.32, 11012727859.78)), class = c("tbl_df", 
                                                                                               "tbl", "data.frame"), row.names = c(NA, -90L))

my_df |>
  mutate(my_fill = case_when(pct <= 44 ~ "A",
                             pct > 44 & pct <= 85 ~ "B",
                             pct > 85 ~ "C")) |>
  ggplot(aes(x = pct , y = value)) +
  geom_line() +
  geom_area(aes(fill = my_fill)) +
  # 改用连续型x轴,设置关键断点和合理范围
  scale_x_continuous(breaks = c(1, 44, 85, 86),
                     limits = c(1, 90))
额外说明
  • 改用scale_x_continuous()后,ggplot会正确识别pct的连续属性,不会过滤pct=85的数据点,B组填充会覆盖到该位置,空白问题即可解决。
  • 若需将x轴范围截止到pct=86,可将limits设为c(1,86),仍能保留pct=85的显示。

内容的提问来源于stack exchange,提问作者Emman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:32:09