如何在ggplot2极坐标图中延伸刻度线至主网格线实现标注?
在ggplot2极坐标图中让y轴刻度线衔接主网格线的解决方案
问题描述
我想在ggplot2的极坐标图中,通过延伸y轴刻度线使其与主网格线相交来添加标注。已经设置了axis.ticks.length.y参数延长刻度线,但刻度线没能和图中的主网格线衔接上。
现有代码:
library(ggplot2) scn = c(1, 2, 3, 2, 5) data_test = structure(list(s = c("1.0", "1.1", "1.2", "1.3", "1.4"), scn = scn, vv = scn), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) ggplot(data = data_test, mapping = aes(x = s, y = vv, fill = s, color = s)) + geom_col(width = 1) + coord_radial(expand = FALSE) + expand_limits(y = -2) + theme( panel.grid.major.x = element_blank() , panel.ontop = TRUE, panel.background = element_blank(), strip.background = element_blank(), axis.ticks.x = element_line(linetype = "blank"), axis.ticks.length.y = unit(0.5, "cm"), axis.text.x = element_blank(), axis.text.y = element_text(size = 10, colour = 'grey30', face = 'bold'), panel.grid.major.y = element_line( linewidth=.1, color="grey10" , linetype = 'dotted') ) + scale_y_continuous(breaks= c(1:5))
当前效果:
期望效果:
解决方案
在coord_radial极坐标下,原生的axis.ticks.length.y参数无法直接让刻度线精准对齐主网格线,原因是极坐标的刻度线长度计算逻辑和笛卡尔坐标不同。可以通过手动绘制刻度线的方式实现需求:
修改后的完整代码
library(ggplot2) scn = c(1, 2, 3, 2, 5) data_test = structure(list(s = c("1.0", "1.1", "1.2", "1.3", "1.4"), scn = scn, vv = scn), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) # 准备刻度线数据:基于y轴breaks值生成刻度位置 tick_data <- data.frame(y = 1:5) ggplot(data = data_test, mapping = aes(x = s, y = vv, fill = s, color = s)) + geom_col(width = 1) + # 手动绘制径向刻度线,覆盖所有x类别对应的圆周范围 geom_segment(data = tick_data, aes(x = 0.5, xend = 5.5, y = y, yend = y), color = "grey30", linewidth = 0.5) + coord_radial(expand = FALSE) + expand_limits(y = -2) + theme( panel.grid.major.x = element_blank() , panel.ontop = TRUE, panel.background = element_blank(), strip.background = element_blank(), axis.ticks.x = element_blank(), # 关闭原生y轴刻度线避免重复 axis.ticks.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_text(size = 10, colour = 'grey30', face = 'bold'), panel.grid.major.y = element_line( linewidth=.1, color="grey10" , linetype = 'dotted') ) + scale_y_continuous(breaks= c(1:5))
关键说明
tick_data包含所有y轴刻度的位置,对应主网格线的径向坐标geom_segment的x=0.5到x=5.5覆盖了数据中5个x类别(s的取值)的范围,确保刻度线完整环绕圆周- 关闭原生
axis.ticks.y,避免和手动绘制的刻度线重复 - 手动绘制的刻度线会和主网格线完全重合,实现你想要的衔接效果
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

