ggplot2技术需求:调整Y轴刻度样式及添加stat_summary点图例
解决ggplot2的两个需求:Y轴标签居中显示 + stat_summary点添加图例
问题1:Y轴标签位于两个刻度之间
离散型Y轴默认不生成次要刻度,因此axis.minor.ticks.length.y参数不会生效。我们可以将Y轴转换为连续型,手动控制刻度和标签位置:
- 将分类变量
ca转换为连续数值,作为Y轴的映射值 - 通过
scale_y_continuous设置标签在每个分类的中心位置,次要刻度放在分类的上下边界 - 隐藏主刻度,只显示次要刻度并调整长度
问题2:为stat_summary的点添加图例
stat_summary的点默认没有图例,因为未将颜色/填充属性映射到变量。只需给点添加自定义映射项,再统一设置颜色即可:
- 在
stat_summary的aes中加入fill = "Total",定义图例中的项名称 - 通过
scale_fill_manual同时设置条形(A/B/C)和汇总点(Total)的颜色,生成完整图例
完整代码:
library("ggplot2") dt <- data.frame( ca = rep(c("Oesophageal cancer", "Gastric cancer", "Colorectal cancer"), 3), var1 = c(1:3, -4:-6, 7:9), var2 = rep(LETTERS[1:3], 3) ) # 把分类变量转换为连续数值,用于Y轴映射 dt$ca_num <- as.numeric(factor(dt$ca)) ca_labels <- unique(dt$ca) ca_values <- unique(dt$ca_num) dt %>% ggplot(aes(var1, ca_num, fill = var2)) + geom_bar(stat = "identity", width = 0.8) + # 为汇总点添加图例映射 stat_summary(aes(fill = "Total"), fun = sum, geom = "point", colour = "grey40", shape = 20, size = 2) + geom_vline(xintercept = 0, colour = "grey30", linetype = "dotted") + # 设置Y轴:标签居中,次要刻度在分类上下 scale_y_continuous( breaks = ca_values, labels = ca_labels, minor_breaks = unlist(lapply(ca_values, function(x) c(x - 0.5, x + 0.5))), expand = c(0.1, 0) ) + # 统一设置填充颜色,包含条形和汇总点 scale_fill_manual( name = "", values = c( "A" = "#F8766D", "B" = "#00BA38", "C" = "#619CFF", "Total" = "grey40" ) ) + theme( # 隐藏主Y轴刻度,显示次要刻度 axis.ticks.y = element_blank(), axis.minor.ticks.y = element_line(color = "black"), axis.minor.ticks.length.y = unit(5, "pt"), # 调整Y轴标签的左右边距,让位置更居中 axis.text.y = element_text(margin = margin(r = 10)) )
内容的提问来源于stack exchange,提问作者tengy
相关产品推荐
相关产品推荐

