ggplot绘制时间序列时按状态变量调整线宽出现断点如何解决
问题原因
你将离散型的status变量映射到size属性后,ggplot会默认按status的取值对数据自动分组,不同分组的点不会被折线连接,因此status切换节点前后的点会出现断层。
解决方案
只需显式指定group参数,覆盖ggplot的默认分组规则即可,无需手动拆分数据,可自动适配任意status切换时间点。
方案1:适配当前宽表数据的修改
仅需在每个geom_line的映射中新增group = 1参数,指定同一个y变量的所有点归属同一组:
library(ggplot2) set.seed(1234) data <- data.frame("x" = c(1:10), "y1" = rnorm(10,mean = c(1:10)), "y2" = .5*rnorm(10,mean = c(1:10)), "status" = as.factor(c(rep(FALSE,7),rep(TRUE,3)))) ggplot(data,aes(x=x))+ geom_line(aes(y=y1,linetype = "Y1",size = status, group = 1))+ geom_line(aes(y=y2, linetype = "Y2",size = status, group = 1))+ scale_size_manual(values = c("TRUE" = 1.5, "FALSE" = .5))
方案2:适配多y变量的推荐写法
如果后续y变量数量增加,建议先将数据转为长格式,按y变量名分组,代码更简洁易维护:
library(ggplot2) library(tidyr) set.seed(1234) data <- data.frame("x" = c(1:10), "y1" = rnorm(10,mean = c(1:10)), "y2" = .5*rnorm(10,mean = c(1:10)), "status" = as.factor(c(rep(FALSE,7),rep(TRUE,3)))) # 宽表转长表 data_long <- pivot_longer(data, cols = c(y1,y2), names_to = "variable", values_to = "y") ggplot(data_long,aes(x=x, y=y))+ geom_line(aes(linetype = variable, size = status, group = variable))+ scale_size_manual(values = c("TRUE" = 1.5, "FALSE" = .5))
两种方案运行后都可以得到全程连续、仅在status切换后变更线宽的效果。
内容的提问来源于stack exchange,提问作者thebenjaminp
相关产品推荐
相关产品推荐

