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

ggplot如何将x轴和图例中鱼类学名设为斜体其余保持常规字体

ggplot2 实现x轴/图例鱼类学名斜体、俗名常规的混合字体方案

完全可以实现该效果,核心是通过R的plotmath表达式语法,拆分每个物种标签的学名、俗名部分,分别指定字体样式即可,不需要修改原始数据集。

具体实现步骤

  • 先写标签转换函数,自动识别学名 (俗名)格式的文本,拼接成「斜体学名+常规俗名」的可解析表达式
# 物种标签格式化函数
parse_species_label <- function(species_vec) {
  lapply(species_vec, function(sp) {
    # 定位左括号位置,拆分学名和俗名
    bracket_pos <- regexpr("\\(", sp)
    sci_part <- trimws(substr(sp, 1, bracket_pos - 1))
    common_part <- trimws(substr(sp, bracket_pos, nchar(sp)))
    # 生成plotmath可识别的混合样式表达式
    parse(text = paste0("italic('", sci_part, "')~'", common_part, "'"))[[1]]
  })
}
  • 修改原有绘图代码,在x轴、填充图例的刻度设置中调用上述函数,替换默认标签即可。完整可运行代码如下:
library(ggplot2)
library(forcats)

ggplot(R_Sandbach, aes(x = fct_infreq(Species), fill = Species))+
  geom_bar()+
  theme_minimal()+
  # 计数标签用after_stat是ggplot新语法,兼容性优于老版本的..count..
  geom_text(aes(label = after_stat(count)), stat = "count", vjust = -.1, colour = "black")+
  # 应用混合格式到x轴标签
  scale_x_discrete(labels = parse_species_label(levels(fct_infreq(R_Sandbach$Species)))) +
  # 应用混合格式到填充图例标签
  scale_fill_discrete(labels = parse_species_label(levels(fct_infreq(R_Sandbach$Species)))) +
  theme(axis.text.x = element_text(angle = 90, size = 5))+
  xlab("Fischarten")+
  ylab("Individuenanzahl")

渲染效果说明:以Barbatula barbatula (Bachschmerle)为例,最终会显示为 Barbatula barbatula (Bachschmerle),仅学名部分为斜体,括号内俗名、坐标轴标题、柱顶计数数字等其余文本全部保持常规字体。

可选补充说明

  • 如果更熟悉HTML语法,可以加载ggtext包,将标签转换为<i>Barbatula barbatula</i> (Bachschmerle)格式的HTML字符串,再把theme()里对应文本元素从element_text()替换为element_markdown(),可以实现完全一致的效果,适合需要更复杂文本格式(比如上标、下标、多颜色文本)的场景。
  • 如果数据里存在不带俗名的纯学名字段,只需要在转换函数里加个判断分支,没有检测到括号时直接返回斜体包裹的学名即可,不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:12:23