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

如何在ggplot分面图的X轴文本中斜体显示部分词汇

在ggplot2轴文本中实现部分内容斜体的方法

需求说明

需要将X轴文本中的细菌物种名(如Escherichia coli)设置为斜体,菌株名(如Strain 1)保持常规字体,现有数据和初始绘图代码如下:

数据框定义

MyDF <- data.frame(Activity=rep(c("Activity 1", "Activity 2", "Activity 3"), each = 6), 
                   Bacteria = rep(c("Escherichia coli Strain 1", "Escherichia coli Strain 2",
                                "Escherichia coli Strain 3", "Escherichia coli Strain 4",
                                "Escherichia coli Strain 5", "Escherichia coli Strain 6"), each=3),
                   Facet=rep(c("Facet 1", "Facet 1","Facet 2","Facet 2","Facet 2","Facet 2"), each=3),
                   Production=rep(1:18))

初始绘图代码

MyPlot<- ggplot(MyDF, aes(x=Bacteria, y=Production, fill= Activity)) + 
  geom_bar(stat="identity", 
           position=position_dodge()) +
  facet_grid(Activity ~ Facet, drop=FALSE, scales="free", space = "free_x")+ 
  theme(axis.text.x = element_text(angle = 55, hjust = 1))

MyPlot

实现步骤

核心思路是将X轴标签转换为ggplot可识别的表达式(expression),以此实现混合字体样式:

1. 拆分文本并生成表达式向量

先拆分物种名和菌株名,再用italic()函数标记斜体部分,最后转换为表达式:

# 拆分每个细菌条目为物种名和菌株编号
split_bact <- strsplit(MyDF$Bacteria, " Strain ")
species <- sapply(split_bact, "[", 1)
strain_num <- sapply(split_bact, "[", 2)

# 创建带格式的表达式文本,再转换为表达式向量
bact_labels <- paste0("italic('", species, "') ~ 'Strain ", strain_num, "'")
bact_expr <- parse(text = bact_labels)

2. 修改绘图代码替换X轴标签

在原绘图代码中添加scale_x_discrete(),将X轴标签替换为生成的表达式:

MyPlot <- ggplot(MyDF, aes(x=Bacteria, y=Production, fill= Activity)) + 
  geom_bar(stat="identity", position=position_dodge()) +
  facet_grid(Activity ~ Facet, drop=FALSE, scales="free", space = "free_x")+
  # 替换X轴标签为带格式的表达式
  scale_x_discrete(labels = bact_expr) +
  theme(axis.text.x = element_text(angle = 55, hjust = 1))

MyPlot

简化版(无需单独拆分变量)

可以直接在scale_x_discrete的labels参数中定义匿名函数,一步完成文本处理:

MyPlot <- ggplot(MyDF, aes(x=Bacteria, y=Production, fill= Activity)) + 
  geom_bar(stat="identity", position=position_dodge()) +
  facet_grid(Activity ~ Facet, drop=FALSE, scales="free", space = "free_x")+
  scale_x_discrete(labels = function(x) {
    split_x <- strsplit(x, " Strain ")
    parse(text = paste0("italic('", sapply(split_x, "[", 1), "') ~ 'Strain ", sapply(split_x, "[", 2), "'"))
  }) +
  theme(axis.text.x = element_text(angle = 55, hjust = 1))

MyPlot

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:25:50