如何使用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
相关产品推荐
相关产品推荐

