R语言使用基础barplot函数修改柱状图X轴文本格式的方案问询
R基础barplot实现双层X轴刻度方案
你需要的分上下两层的X轴样式(下层标注旬标记、上层居中标注月份)可通过基础绘图的axis()与边距设置实现,无需引入ggplot体系。以下是基于你的代码修改后的可运行版本:
# 加载原始数据 df <- data.frame(DK= c("08-01","08-11","08-21","09-01","09-11","09-21","10-01","10-11","10-21","11-01","11-11","11-21","12-01","12-11","12-21","01-01","01-11","01-21","02-01","02-11","02-21","03-01","03-11","03-21","04-01","04-11","04-21","05-01","05-11","05-21","06-01","06-11","06-21","07-01","07-11","07-21"), value=c(3.9,4.4,5.1,7.1,6.1,7.0,7.8,11.3,13.5,19.6,24.9,27.5,28.0,28.6,41.0,34.3,45.1,43.7,36.0,41.6,27.2,34.3,18.6,24.0,14.0,13.7,12.3,8.5,7.4,6.5,6.2,5.2,5.9,6.3,6.2,7.1)) toplot <- df # 调整底边绘图边距,给两层X轴留出足够显示空间 par(mar = c(6, 4, 2, 2), repr.plot.width=6, repr.plot.height=4) maxv <- max(toplot[,2])+10 # 拆分两层标签:下层是每个柱子对应的旬标签,上层是月份标签 sub_labels <- rep(c("d1","d2","d3"), 12) # 月份顺序和数据中的日期保持一致:从8月到次年7月 month_labels <- c("Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun","Jul") # 绘制柱状图,关闭默认X轴输出 a <- barplot(toplot$value, col='deepskyblue3', xaxt = "n", yaxt = "n", ylim=c(0,maxv), cex.lab=0.75 ) # 绘制第一层X轴:对应每个柱子的旬标签 axis(1, cex.axis=0.55, las=2, at=a, labels=sub_labels, line = 0) # 计算月份标签的居中位置:取每个月3个柱子X坐标的平均值 month_pos <- tapply(a, rep(1:12, each=3), mean) # 绘制第二层X轴:居中显示的月份标签,通过line参数调整到下层标签上方 axis(1, at = month_pos, labels = month_labels, cex.axis = 0.7, line = 2, tick = TRUE, las = 1) # 绘制Y轴 axis(2, las=2, cex.axis=0.6)
核心实现逻辑
- 提前拆分两层标签,避免原始的月份+旬组合标签拥挤重叠
- 通过
line参数控制两层X轴的上下偏移量,保证显示不重叠 - 对每个月3个柱子的X坐标取均值,确保上层月份标签刚好在对应月份柱组的居中位置
- 提前调整
par(mar)参数扩大底边边距,避免标签被画布截断
内容的提问来源于stack exchange,提问作者gianca
相关产品推荐
相关产品推荐

