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
相关产品推荐
相关产品推荐

