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
相关产品推荐
相关产品推荐

