ggplot2同一坐标轴设置不同长度刻度线的实现方法咨询
方案1:使用ggh4x包实现(最简便)
ggh4x包扩展了ggplot2的坐标轴功能,支持直接给刻度长度传向量,适配示例数据的代码如下:
library("ggplot2") library("ggh4x") set.seed(5) df <- data.frame(x = rnorm(500, mean = 12.5, sd = 3)) breaks <- seq(2.5, 25, .5) # 给每一个断点分配对应的刻度长度,主刻度(2.5倍数)长度0.2cm,次刻度0.1cm tick_len <- ifelse(breaks %% 2.5 == 0, unit(0.2, "cm"), unit(0.1, "cm")) ggplot(df, aes(x = x)) + geom_histogram(breaks = breaks, fill = "gray66", color = "black") + scale_x_continuous( breaks = breaks, # 仅主刻度显示标签,次刻度标签为空 labels = ifelse(breaks %% 2.5 == 0, breaks, "") ) + guides( x = guide_axis( ticks_length = tick_len, # 对应设置刻度线粗细,和base R效果对齐 ticks_linewidth = ifelse(breaks %% 2.5 == 0, 2, 1) ) ) + theme_bw()
方案2:原生ggplot2实现(无需额外依赖)
如果不想安装第三方包,可以通过自定义坐标轴grobs的方式修改,代码如下:
library("ggplot2") library("grid") set.seed(5) df <- data.frame(x = rnorm(500, mean = 12.5, sd = 3)) breaks <- seq(2.5, 25, .5) p <- ggplot(df, aes(x = x)) + geom_histogram(breaks = breaks, fill = "gray66", color = "black") + scale_x_continuous( breaks = breaks, labels = ifelse(breaks %% 2.5 == 0, breaks, "") ) + theme_bw() + theme(axis.ticks.length.x = unit(0.2, "cm")) # 提取坐标轴grob修改刻度长度 g <- ggplotGrob(p) axis_idx <- which(g$layout$name == "axis-b") ticks <- g$grobs[[axis_idx]]$children[[2]] # 修改刻度y坐标,次刻度长度减半 ticks$y <- unit.c( unit(rep(0, sum(breaks %% 2.5 == 0)), "npc"), unit(rep(0.5, sum(breaks %% 2.5 != 0)), "npc"), rep(unit(1, "npc"), length(breaks)) ) ticks$x <- rep(ticks$x, each = 2) ticks$id.lengths <- rep(2, length(breaks)) # 修改刻度粗细 ticks$gp$lwd <- rep(ifelse(breaks %% 2.5 == 0, 2, 1), each = 2) g$grobs[[axis_idx]]$children[[2]] <- ticks # 绘制最终图形 grid.draw(g)
两种方案都可以实现和base R示例完全一致的长短刻度效果。核心原因是原生ggplot2的theme参数全局控制刻度长度,不支持向量化赋值,所以要么用扩展包的增强坐标轴功能,要么手动修改底层grid图形对象的属性。
内容的提问来源于stack exchange,提问作者Jun Jiang
相关产品推荐
相关产品推荐

