You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现顶部对齐,去掉右侧边距,和主轴标签对齐
  • 添加全局总计:
    • 先计算全局总计GLOBAL_TOTAL <- sum(DATA$Count)
    • 使用annotate("text")将文本定位到图表右下角,通过x和y参数微调位置,确保显示在数据区域外

内容的提问来源于stack exchange,提问作者EcologyTom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:35:07