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

时间:2016-09-01 23:30:43

标签: r ggplot2 format italic

对于我的ggplot图,我想在条形图上标记类别,第一个单词是斜体,而下面的单词是非斜体。我希望类别标签如下所示:

Staphylococcacae (OTU 1)

链球菌(OTU 300)

我找到了使用表达式()的示例,其中我可以将几个类别标签用于斜体,但我希望能够为许多不同的类别执行此操作。 制作情节的代码如下(但我的数据还有更多的条形图)。

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

tmp.data$bactnames2 <- paste0(tmp.data$bactnames," (",tmp.data$OTUname,")")
tmp.data$finalnames <- factor(tmp.data$bactnames2,levels=tmp.data$bactnames2[order(tmp.data$value)],ordered=TRUE)
ggplot(tmp.data, aes(finalnames,value)) + geom_bar(stat="identity") + coord_flip()

任何想法都会受到赞赏,如果我能澄清任何事情,请告诉我。

2 个答案:

答案 0 :(得分:5)

我会使用胶和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())

reprex package(v0.3.0)于2020-01-29创建

答案 1 :(得分:2)

您可以制作expression s的向量,并将其应用于labels中的scale_x_discrete参数:

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

ggplot(tmp.data, aes(finalnames,value)) + geom_bar(stat="identity") + 
  coord_flip() +
  scale_x_discrete(labels = labs)

输出:

enter image description here

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