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
相关产品推荐
相关产品推荐

