R ggplot2, используя курсив и не курсив в одной и той же метке категории.

Для моего рисунка ggplot я хочу пометить категории на столбчатой ​​диаграмме, чтобы первое слово было выделено курсивом, а следующие слова не были выделены курсивом. Я хочу, чтобы ярлыки категорий выглядели следующим образом:

Staphylococcacae (OTU 1)

Стрептококк (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()

Создано 28 января 2020 г. пакетом REPEX (v0.3.0)


person ktmbiome    schedule 01.09.2016    source источник


Ответы (2)


Вы можете создать вектор из expressions и применить его к аргументу labels в scale_x_discrete:

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.

person Weihuang Wong    schedule 02.09.2016

Я бы использовал пакеты 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())

Создано 29 января 2020 г. пакетом REPEX (v0.3.0)

person Claus Wilke    schedule 29.01.2020