ggplot搭配ggrepel使用平滑标签连线时出现断点如何解决
断点出现的核心原因
- 你设置的
segment.angle = 178.975数值过于接近180度平角,结合segment.curvature = -1和单控制点(segment.ncp = 1)的配置,会导致曲线控制点计算出现衔接异常 coord_flip()坐标翻转逻辑和ggrepel的曲线线段计算逻辑存在适配冲突,也是出现断点的主要诱因
最优解决方案:直接交换x、y映射,移除coord_flip()
直接把原代码里的x、y aes映射互换,完全避免坐标翻转带来的适配问题,调整对应nudge参数和角度参数即可,修改后代码如下:
library(ggplot2) library(ggrepel) # 示例数据 df<-structure(list(year = c(1984, 1984), team = c("Australia", "Brazil" ), continent = c("Oceania", "Americas"), medal = structure(c(3L, 3L), .Label = c("Bronze", "Silver", "Gold"), class = "factor"), n = c(84L, 12L)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame")) ggplot(data = df)+ geom_point(aes(x = n, y = year)) + geom_text_repel(aes(x = n, y = year, label = team), size = 3, color = 'black', seed = 10, nudge_y = -0.03, nudge_x = 35, segment.size = 0.65, segment.curvature = -1, segment.angle = 20, segment.ncp = 1)
备选方案:保留coord_flip()的调整方法
如果一定要保留原坐标翻转写法,调整以下两个参数即可消除断点:
- 把
segment.angle调整为20~60之间的非极端值,不要接近0或180 - 新增参数
segment.square = FALSE关闭线段直角衔接逻辑
对应修改后的geom_text_repel代码片段:
geom_text_repel(aes(x = year, y = n, label = team), size = 3, color = 'black', seed = 10, nudge_x = -.029, nudge_y = 35, segment.size = .65, segment.curvature = -1, segment.angle = 20, segment.ncp = 1, segment.square = FALSE)
如果调整后仍存在异常,可升级ggrepel到最新版本修复已知计算bug,升级命令:install.packages("ggrepel")
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

