使用geom_path()时避免因子型颜色分箱值导致的线条间隙
解决geom_path按颜色分段时出现间隙的问题
我使用geom_path()结合十六进制颜色值绘制线条时遇到以下问题:当用数值型变量bins分配颜色分箱时,线条是连续的;但改用存储十六进制颜色的变量bins1时,不同颜色的线段之间出现了明显间隙。
原代码如下:
library(ggplot2) df <- structure(list(x = c(0, 0.57, 0.43, -0.65, -2.27, -3.5, -3.39, -1.5, 1.75, 5.12, 7.01, 6.21, 2.55, -2.87, -7.97, -10.51, -9.02, -3.59, 4, 10.84, 14.01), y = c(0, 0.41, 1.33, 2, 1.64, -0.01, -2.48, -4.67, -5.32, -3.68, 0.03, 4.56, 8.01, 8.64, 5.71, -0.07, -6.66, -11.36, -11.96, -7.73, 0.13), bins = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), bins1 = c("#e2c207", "#e2c207", "#e2c207", "#e2c207", "#e2c207", "#e2c207", "#e2c207", "#ff6915", "#ff6915", "#ff6915", "#ff6915", "#ff6915", "#ff6915", "#ff6915", "#8b0d0d", "#8b0d0d", "#8b0d0d", "#8b0d0d", "#8b0d0d", "#8b0d0d", "#8b0d0d")), row.names = c(NA, 21L), class = "data.frame") ggplot(df, aes(x, y)) + geom_path(aes(colour = bins1)) + scale_colour_identity() + coord_fixed() + theme_void()
绘图效果:
我还尝试了以下方法,但问题仍然存在:
colours <- c("#e2c207", "#ff6915", "#8b0d0d") ggplot(df, aes(x, y, colour = I(colours[bins]))) + geom_path() + coord_fixed() + theme_void()
问题原因
geom_path()会自动根据colour变量进行分组,不同颜色的点会被分成独立的路径组,相邻组的端点之间不会自动连接,因此出现间隙。
解决方法
改用geom_segment()绘制每个线段,确保相邻点之间都被连接:
- 先构造线段数据,为每个点生成下一个点的坐标:
library(dplyr) df_seg <- df %>% mutate( xend = lead(x), # 获取下一个点的x坐标 yend = lead(y) # 获取下一个点的y坐标 ) %>% filter(!is.na(xend)) # 移除最后一行(无下一个点)
- 使用
geom_segment()绘制线段,每个线段使用起始点的颜色:
ggplot(df_seg, aes(x, y, xend = xend, yend = yend)) + geom_segment(aes(colour = bins1), linewidth = 1) + scale_colour_identity() + coord_fixed() + theme_void()
这样绘制出的线条就不会有间隙,同时保持各段的颜色区分。
内容的提问来源于stack exchange,提问作者L Tyrone
相关产品推荐
相关产品推荐

