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

如何修改ggplot图表下方文本面板?含排序、间距等优化需求

解决ggplot下方文本面板的优化需求

需求说明

已实现ggplot图表下方添加文本面板的基础效果,需要完成以下优化:

  • 将面板中的选项顺序调整为Heat: > Needle: > Comb.:
  • 缩小三个处理选项间的垂直间距,以及Y轴相关的空白间距
  • 统一面板内标题与内容的字体样式

优化后完整代码

library(patchwork)
library(tidyverse)
library(ggthemes)

line_size <- 1.2 
base_size <- 20 

d <- tibble(
  Rodent= c(rep("Mouse",11),
            rep("Hamster",7),
            rep("Guinea pig",4),
            rep("Gerbil",12)),
  `Weight (gm)` = rnorm(34,25,10),
  `Heat:` = c(rep("+",11),rep("-",7),rep("+",4),rep("+",12)),
  `Needle:` = c(rep("+",11),rep("+",7),rep("+",4),rep("+",12)),
  `Comb.:` = c(rep("Phen",11),rep("-",7),rep("-",4),rep("Met",12)),
)

p1 <- d %>% 
  ggplot(aes(Rodent,`Weight (gm)`)) +
  geom_boxplot(lwd=1.3,colour="black")+ 
  scale_y_continuous(expand = expansion(mult = c(0, 0.05)))+ 
  labs(y = "Percentage") +
  theme_foundation(base_size = base_size, base_family = "sans")+ 
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank(),
    text = element_text(colour = "black"),
    plot.title = element_text(face = "bold", 
                              size = rel(1), hjust = 0.5),
    axis.line = element_line(colour="black", size = line_size),
    axis.ticks = element_line(colour="black", size = line_size),
    axis.title = element_text(face = "bold", size = rel(1)),
    axis.title.y = element_text(angle = 90, vjust = 2),
    axis.title.x = element_blank(),
    axis.text = element_text(face = "bold", size = rel(1)),
    axis.text.x = element_blank(),
    plot.background = element_blank(),
    legend.title=element_blank(),
    legend.position = "none"
  )

# 调整选项顺序
d1 <- d %>% 
  select(-`Weight (gm)`) %>%
  pivot_longer(-Rodent) %>%
  mutate(name = fct_relevel(name, "Heat:", "Needle:", "Comb.:"))

p2 <- d1 %>% 
  ggplot(aes(Rodent, name, label = value)) +
  # 统一字体样式:匹配主题的字体、加粗和大小
  geom_text(size = rel(1)*base_size/10, family = "sans", face = "bold") +
  # 去掉Y轴上下的默认空白间距,缩小选项整体范围
  scale_y_discrete(expand = expansion(mult = c(0, 0))) +
  labs(x = NULL, y = NULL)+ 
  theme_foundation(base_size = base_size, base_family = "sans")+ 
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank(),
    # 统一所有文本的加粗和字体
    text = element_text(colour = "black", face = "bold"),
    # 缩小Y轴文本右侧边距,减少选项间的垂直间距(可调整r值)
    axis.text.y = element_text(margin = margin(r = -15)),
    axis.text.x = element_blank(),
    axis.ticks=element_blank(),
    plot.background = element_blank()
  )

p1 / p2

优化细节说明

  1. 调整选项顺序:
    使用fct_relevel函数手动指定name列的顺序,确保文本面板的Y轴选项严格按照Heat: > Needle: > Comb.:排列。

  2. 缩小间距:

    • 处理选项间的垂直间距:通过axis.text.y = element_text(margin = margin(r = -15))缩小Y轴文本的右侧边距,减少选项之间的空白;
    • 去掉Y轴默认扩展间距:添加scale_y_discrete(expand = expansion(mult = c(0, 0)))移除Y轴上下的默认空白,让选项更紧凑。
  3. 统一字体:

    • 在geom_text中设置family = "sans"、face = "bold",并通过rel(1)*base_size/10计算字体大小,确保和主题中的文本参数完全匹配;
    • 主题中text元素统一设置face = "bold",确保所有文本(包括Y轴选项)的样式一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:13:13