在同一类别标签中使用斜体和非斜体字

6
对于我的ggplot图,我想在条形图上标记类别,并使第一个单词成为斜体,而后面的单词不是斜体。我希望类别标签看起来像下面这样: Staphylococcacae(OTU 1) Streptococcus(OTU 300)
我找到了使用expression()的示例,可以将一些类别标签变为斜体,但我希望能够对许多不同的类别进行此操作。
制作图表的代码如下(但我的数据有更多的条形要绘制)。
library(ggplot2)

data <- data.frame(
  bactname = c("Staphylococcaceae", "Moraxella", "Streptococcus", "Acinetobacter"),
  OTUname = c("OTU_1", "OTU_2", "OTU_3", "OTU_4"),
  value = c(-0.5, 0.5, 2, 3)
)

data$name <- paste0(
  data$bactname, " (", data$OTUname, ")"
)
data$name <- factor(
  data$name,
  levels = data$name[order(data$value)], ordered = TRUE
)

ggplot(data, aes(name, value)) + 
  geom_col() + coord_flip()

reprex包 (v0.3.0) 于2020年1月28日创建

2个回答

8

我会使用glue和ggtext包。

library(tidyverse)
library(ggtext)
library(glue)

data <- data.frame(
  bactname = c("Staphylococcaceae", "Moraxella", "Streptococcus", "Acinetobacter"),
  OTUname = c("OTU_1", "OTU_2", "OTU_3", "OTU_4"),
  value = c(-0.5, 0.5, 2, 3)
)

data %>% mutate(
  name = glue("*{bactname}* ({OTUname})"),
  name = fct_reorder(name, value)
) %>%
  ggplot(aes(name, value)) + 
  geom_col() + coord_flip() +
  theme(axis.text.y = element_markdown())

此内容创建于2020年01月29日,使用reprex包(v0.3.0)


3

您可以创建一个expression向量,并将其应用于scale_x_discrete中的labels参数:

labs <- sapply(
  strsplit(as.character(data$name), " "), 
  function(x) parse(text = paste0("italic('", x[1], "')~", x[2]))
)

ggplot(data, aes(name, value)) + 
  geom_col() + coord_flip() +
  scale_x_discrete(labels = labs)

如果您的标签中有空格,例如OTU 100,您可能希望用波浪号替换空格,例如OTU~100


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接