如何在ggpacket函数中为变量设置数据框占位符?
问题解决方法
你的问题出在scale_x_date的breaks参数不属于aes映射范畴:ggpacket定义时还没传入数据,直接写min(edtriage)或min(.$edtriage)会提前执行,自然找不到对应变量;而geom_text_repel的aes是映射规则,会等到传入数据后才解析变量,所以能正常工作。
修改方案很简单,把breaks改成匿名函数形式,让ggplot在传入数据后再动态计算断点:
geom_gradient <- ggpacket() + geom_link2(aes(group = 1), size = 3, show.legend = FALSE) + # Gradient line geom_point(size = 5) + # 这部分保持不变,aes会延迟解析变量 geom_text_repel(aes(label = if_else(edtriage == max(edtriage), sprintf("%1.1f%%", Percent), "")) , size = 15) + scale_x_date( date_labels="%b\n%y", # 用函数接收x轴数据(后续传入的edtriage列),动态生成断点 breaks = function(x) seq(min(x), max(x), by = "3 months"), date_minor_breaks = "1 month" ) + theme_minimal()
补充说明
- 这里
by = "3 months"对应你原来的by = 0.25(0.25年=3个月),如果需要更精确的时间间隔,可以用by = "90 days"这类格式,符合seq.Date的参数要求。 - 确保后续传入数据框中的
edtriage列是日期类型(需用as.Date()转换),否则scale_x_date会报错。
内容的提问来源于stack exchange,提问作者Cassandra
相关产品推荐
相关产品推荐

