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

ggplot实现geom_point周边留白及曲线直线混合绘制问题

R ggplot2 双需求实现方案

核心实现思路

  • 部分线条平滑:拆分分组分别绘制,需平滑的分组使用ggalt::geom_xspline生成贴合数据点的平滑曲线
  • 点边留白:分层绘制点,先画大尺寸白色底点,再叠加常规彩色点,即可制造连线和数据点之间的间隙效果

完整可运行代码

首先安装所需依赖包(已安装可跳过):

install.packages(c("ggplot2", "ggthemr", "ggalt", "dplyr"))

绘图代码:

library(ggplot2)
library(ggthemr)
library(ggalt)
library(dplyr)

# 加载测试数据
df <- structure(list(type = c("Group1", "Group3", "Group2", "Group1", 
"Group3", "Group2", "Group1", "Group3", "Group2", "Group1", "Group3", 
"Group2", "Group1", "Group3", "Group2", "Group1", "Group3", "Group2", 
"Group1", "Group3", "Group2", "Group1", "Group3", "Group2", "Group1", 
"Group3", "Group2", "Group1", "Group3", "Group2", "Group1", "Group3", 
"Group2", "Group1", "Group3", "Group2"), month = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 9L, 10L, 10L, 10L, 11L, 11L, 
11L, 12L, 12L, 12L), .Label = c("January", "February", "March", 
"April", "May", "June", "July", "August", "September", "October", 
"November", "December"), class = "factor"), unit = c(160.294407837043, 
256.471052539269, 405.791621951561, 93.7033481198376, 149.92535699174, 
394.453657583648, 512.563348094638, 820.101356951421, 586.017227590648, 
320.748004278314, 513.196806845303, 798.144144659107, 364.518771412572, 
583.230034260115, 561.946577331653, 338.618410043399, 541.789456069438, 
623.973070608988, 561.319198098838, 898.110716958141, 550.000251812964, 
339.53675851603, 543.258813625647, 792.931412417752, 968.459890522189, 
1549.5358248355, NA, 421.603176847263, 674.565082955621, NA, 
429.64394748425, 687.430315974801, NA, 516.598236578468, 826.557178525549, 
NA)), class = "data.frame", row.names = c(NA, -36L))

ggthemr("dust")

ggplot(df, aes(x = month, y = unit, group = type, color = type)) +
  # 绘制直线分组
  geom_line(data = ~filter(.x, type != "Group3"),
            aes(linetype = type, size = type)) +
  # 绘制平滑曲线分组,spline_shape调整弯曲度,取值范围-1~1,数值越大弯曲度越高
  geom_xspline(data = ~filter(.x, type == "Group3"),
               aes(linetype = type, size = type),
               spline_shape = -0.3,
               lineend = "round") +
  scale_size_manual(values=c(1.5, 1.5, 1)) +
  # 绘制白色底层点制造留白,尺寸比顶层点大1左右即可,可调整大小控制留白宽度
  geom_point(aes(shape = type), color = "white", size = 3) +
  # 绘制顶层彩色数据点
  geom_point(aes(shape = type), size = 2) +
  scale_colour_ggthemr_d()

参数调整说明

  • 若需要调整曲线的弯曲程度,修改spline_shape参数即可,设为0时和普通直线完全一致
  • 若不想额外安装ggalt包,可将geom_xspline替换为以下代码实现近似平滑效果:
geom_smooth(data = ~filter(.x, type == "Group3"),
            aes(linetype = type, size = type),
            method = "gam",
            formula = y ~ s(as.numeric(x), k = 8),
            se = FALSE)
  • 若需要修改留白大小,调整白色底层点的size参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:54:00