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

ggplot杠铃图分层Y轴标签优化及gt-table可视化方案问询

解决方法

一、用ggplot实现两级分层Y轴标签

要实现Class为上层、Country为下层的Y轴分层标签,推荐用ggtext包的element_markdown()渲染带格式的多行标签,同时调整主题样式让分层更清晰:

library(tidyverse)
library(ggtext)

# 构造并整理数据
df <- tibble(
  Class = c("A","A","B","B"),
  Country = c("UK","US","UK","US"),
  PRE = c(0,1,2,3),
  POST = c(4,5,6,7)
) %>%
  # 构造带格式的分层标签:Class加粗在上,Country在下
  mutate(y_label = str_c("<span style='font-weight:bold'>", Class, "</span><br>", Country)) %>%
  # 按Class排序,确保同一Class的国家相邻
  arrange(Class, Country) %>%
  mutate(y_label = fct_inorder(y_label)) # 保持排序顺序

# 绘制杠铃图
ggplot(df) +
  geom_segment(aes(x=PRE, xend=POST, y=y_label, yend=y_label), color="green", linewidth=1) +
  geom_point(aes(x=POST, y=y_label), color="navy", size=3) +
  geom_point(aes(x=PRE, y=y_label), color="salmon", size=3) +
  xlab("shift") +
  ylab(NULL) +
  theme(
    axis.text.y = element_markdown(), # 启用markdown渲染Y轴文本
    axis.ticks.y = element_blank(), # 移除Y轴刻度,突出分层
    panel.grid.major.y = element_blank() # 移除Y方向网格线
  )

这个方法直接在Y轴标签中嵌入换行和格式,让Class作为上层标题、Country作为下层明细,完美解决重复Class信息的问题。

二、用gt表格实现带杠铃图的结构化展示

可以通过自定义函数生成单个杠铃小图,再结合gt的分组和图片嵌入功能,实现按Class分层、每个Country对应独立杠铃图的表格:

library(gt)
library(ggplot2)
library(purrr)

# 构造数据
df <- tibble(
  Class = c("A","A","B","B"),
  Country = c("UK","US","UK","US"),
  PRE = c(0,1,2,3),
  POST = c(4,5,6,7)
)

# 定义生成单个杠铃图的函数(极简样式,只保留核心元素)
create_barbell <- function(pre_val, post_val) {
  ggplot() +
    geom_segment(aes(x=pre_val, xend=post_val, y=1, yend=1), color="green", linewidth=1) +
    geom_point(aes(x=post_val, y=1), color="navy", size=3) +
    geom_point(aes(x=pre_val, y=1), color="salmon", size=3) +
    xlim(min(df$PRE)-0.5, max(df$POST)+0.5) + # 统一所有图的X轴范围
    theme_void() # 移除所有冗余元素
}

# 生成结构化表格
gt(df) %>%
  # 按Class添加分组
  tab_row_group(
    group = "Class A",
    rows = Class == "A"
  ) %>%
  tab_row_group(
    group = "Class B",
    rows = Class == "B"
  ) %>%
  # 新增杠铃图列并填充内容
  mutate(Barbell_Plot = NA) %>%
  text_transform(
    locations = cells_body(columns = Barbell_Plot),
    fn = function(x) {
      map2(df$PRE, df$POST, ~ggplot_image(create_barbell(.x, .y), height = px(50)))
    }
  ) %>%
  # 调整样式和标签
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_row_groups()
  ) %>%
  cols_label(
    Class = "Class",
    Country = "Country",
    PRE = "PRE Value",
    POST = "POST Value",
    Barbell_Plot = "Shift Comparison"
  )

这个表格会自动按Class分组展示,每个分组下是对应的Country数据和杠铃图,既保留了结构化对比,又直观展示了PRE到POST的变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:15