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

如何使用ggplot2设置X轴标签非大写字母为斜体

实现方法

要实现X轴基因名部分斜体、末尾大写字母正体的混合排版,不能靠theme里的全局字体设置,需要用R的plotmath表达式语法自定义刻度标签,操作如下:

  • 首先编写基因名转换函数,自动识别基因结构、生成符合排版要求的表达式:
format_gene_label <- function(gene_names) {
  lapply(gene_names, function(gene) {
    # 按斜杠拆分多基因组合的名称
    single_genes <- unlist(strsplit(gene, "/"))
    # 逐个处理单个基因名
    formatted <- sapply(single_genes, function(sg) {
      # 正则拆分:前缀部分 + 末尾大写字母(贪婪匹配保证只取最后一个大写字母作为正体部分)
      match_part <- regmatches(sg, regexec("^(.*)([A-Z])$", sg))[[1]]
      if (length(match_part) == 3) {
        # 前缀设斜体,拼接正体的末尾大写字母
        parse(text = paste0("italic(", match_part[2], ")*", match_part[3]))[[1]]
      } else {
        # 不符合命名规则的条目兜底全斜体,避免报错
        parse(text = paste0("italic(", sg, ")"))[[1]]
      }
    })
    # 拼接斜杠分隔的多基因,斜杠保持正体
    if (length(formatted) > 1) {
      combined <- paste0(sapply(formatted, deparse), collapse = "*\"/\"*")
      parse(text = combined)[[1]]
    } else {
      formatted[[1]]
    }
  })
}
  • 修改原ggplot代码:删除axis.text.x中的face = "italic"配置,新增scale_x_discrete层调用上述函数生成标签,修改后的完整绘图代码如下:
ggplot(mydf, aes(x=Gene, y=Strain, fill = Type, alpha = value)) + 
  scale_fill_manual(values = c("#336666", "#006699")) +
  geom_tile(colour = "grey79") +
  scale_alpha_identity(guide = "none") +
  # 新增X轴刻度标签自定义配置
  scale_x_discrete(labels = format_gene_label) +
  coord_fixed(ratio = 2.4) +
  theme_bw() +
  theme(text = element_text(family = "Times New Roman"),
        legend.position="bottom", 
        legend.title = element_text(size = 14),
        legend.text  = element_text(size = 14),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        # 已删除原代码中的face = "italic",避免全局斜体覆盖自定义格式
        axis.text.x = element_text(angle = 90, size = 18, hjust =1, vjust = 0.5),
        axis.title.x = element_text(size = 15, face = "bold"),
        axis.text.y = element_text(angle = 0, hjust = 1, size = 12, face = "bold"),
        axis.title.y = element_text(size = 15, face = "bold")
  )

说明

  • 上述代码会自动匹配你需要的排版效果:motY渲染为motY、wbjD/wecB渲染为wbjD/wecB、GeneA渲染为GeneA,即使基因名中间存在大写字母,也只会将最末尾的大写字母设为正体。
  • 函数自带容错逻辑,如果遇到末尾不是大写字母的特殊基因名,会自动渲染为全斜体,不会中断绘图流程。
  • 全局设置的Times New Roman字体对plotmath表达式同样生效,不会出现字体不统一的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:03:28