ggplot2次坐标轴标题位置调整及全局总计显示需求
解决方案:调整ggplot2图表的次坐标轴标签与添加全局总计
我制作了如下图表,其中次坐标轴展示行总计和列总计。希望实现三个需求:
- 将次坐标轴标注为"Total",且标题与其他坐标轴标签对齐(目前设置
name = NULL只能让标题显示在数值下方/右侧) - 在图表右下角显示全局总计

原代码
library(ggplot2) # 创建示例数据 DATA <- data.frame( "Top" = factor(rep(c("A", "B", "C"), each = 3)), "Side" = factor(rep(c("Blue", "Green", "Red"), times = 3)), "Count" = c(2,13,0,4,1,10,15,0,6)) # 计算行总计和列总计 COL.TOTALS <- aggregate(DATA$Count, by = list(DATA$Top), FUN = sum) ROW.TOTALS <- aggregate(DATA$Count, by = list(DATA$Side), FUN = sum) # 绘图 ggplot(DATA, aes(as.numeric(Top), as.numeric(Side), Count)) + geom_point(aes(size = Count)) + scale_x_continuous(position = "top", breaks = 1:3, labels = levels(DATA$Top), sec.axis = dup_axis(breaks = as.numeric(COL.TOTALS$Group.1), labels = COL.TOTALS$x, name = NULL)) + scale_y_continuous(breaks = 1:3, labels = levels(DATA$Side), sec.axis = dup_axis(breaks = as.numeric(ROW.TOTALS$Group.1), labels = ROW.TOTALS$x, name = NULL))
修改后的代码
library(ggplot2) # 创建示例数据 DATA <- data.frame( "Top" = factor(rep(c("A", "B", "C"), each = 3)), "Side" = factor(rep(c("Blue", "Green", "Red"), times = 3)), "Count" = c(2,13,0,4,1,10,15,0,6)) # 计算行总计、列总计和全局总计 COL.TOTALS <- aggregate(DATA$Count, by = list(DATA$Top), FUN = sum) ROW.TOTALS <- aggregate(DATA$Count, by = list(DATA$Side), FUN = sum) GLOBAL_TOTAL <- sum(DATA$Count) # 绘图 ggplot(DATA, aes(as.numeric(Top), as.numeric(Side), Count)) + geom_point(aes(size = Count)) + # 配置x轴主副轴:副轴添加"Total"标签 scale_x_continuous(position = "top", breaks = 1:3, labels = levels(DATA$Top), sec.axis = dup_axis(breaks = as.numeric(COL.TOTALS$Group.1), labels = COL.TOTALS$x, name = "Total")) + # 配置y轴主副轴:副轴添加"Total"标签 scale_y_continuous(breaks = 1:3, labels = levels(DATA$Side), sec.axis = dup_axis(breaks = as.numeric(ROW.TOTALS$Group.1), labels = ROW.TOTALS$x, name = "Total")) + # 调整主题,让副轴标题与主轴标签对齐 theme( axis.title.x.top = element_text(hjust = 1, margin = margin(t = 0)), axis.title.y.right = element_text(angle = 0, vjust = 1, margin = margin(r = 0)), axis.text = element_text(size = 10) ) + # 在右下角添加全局总计文本 annotate("text", x = max(as.numeric(DATA$Top)) + 0.5, y = min(as.numeric(DATA$Side)) - 0.5, label = paste("全局总计:", GLOBAL_TOTAL), hjust = 1, vjust = 0)
关键修改说明
- 次坐标轴标签与对齐:
- 给
sec.axis的name参数设置为"Total",替代原来的NULL - 通过
theme()调整副轴标题位置:- x轴副标题设置
hjust = 1实现右对齐,去掉顶部边距,和主轴标签对齐 - y轴副标题设置
angle = 0改为水平显示,vjust = 1实现顶部对齐,去掉右侧边距,和主轴标签对齐
- x轴副标题设置
- 给
- 添加全局总计:
- 先计算全局总计
GLOBAL_TOTAL <- sum(DATA$Count) - 使用
annotate("text")将文本定位到图表右下角,通过x和y参数微调位置,确保显示在数据区域外
- 先计算全局总计
内容的提问来源于stack exchange,提问作者EcologyTom
相关产品推荐
相关产品推荐

