Динамически раскрашивайте часть меток осей с помощью ggplot

Я пытаюсь раскрасить часть меток галочки по оси Y на графике гребней. Мои данные похожи на следующие:

library(tidyverse)

set.seed(10)
dt <- data.frame("T1.C1" = rnorm(10, mean = -10),
                 "T2.C2" = rnorm(10, mean = -5),
                 "T3.C3" = rnorm(10, mean = 5),
                 "T4.C4" = rnorm(10, mean = 10))
data <- dt %>%
  gather(.) %>%
  mutate(., hl = case_when(key == "T1.C1" ~ "T1",
                           key == "T3.C3" ~ "C3"))

В этом случае график гребней выглядит следующим образом:

ggplot(data, aes(x = value, y = key)) +
  geom_density_ridges() +
  theme_ridges() +
  theme(axis.title.y = element_blank())

Я хотел бы раскрасить часть меток галочки оси Y на основе столбца hl набора данных, озаглавленного data. Итак, для графика плотности, связанного с данными для экспериментов T1.C1 и T3.C3, я хотел бы, чтобы T1 и C3 были окрашены в красный цвет там, где нет специальной окраски для других экспериментов, учитывая, что hl равно NA.

Я предполагаю, что есть аргумент в пользу синтаксического анализа, которым я могу воспользоваться, но я не уверен, с чего начать. Любые предложения будут ценны. :)


person StatGuy45    schedule 29.12.2019    source источник


Ответы (1)


Я думаю, что пакет ggtext - наш друг здесь. Я читал страницу пакета на github (https://github.com/clauswilke/ggtext) и этот вопрос. Это ручная работа, но вы можете назначить определенные цвета конкретным словам. В вашем случае вы хотите настроить метки по оси Y. Следовательно, я использовал scale_y_discrete(). Я надеюсь, что это поможет вам.

library(ggplot2)
library(ggridges)
library(ggtext)

ggplot(data, aes(x = value, y = key)) +
geom_density_ridges() +
theme_ridges() +
scale_y_discrete(labels = c("<b style='color:#ff0000'>T1</b>.C1",
                            "<b style='color:#000000'>T2</b>.C2",
                            "<b style='color:#ff0000'>T3</b>.C3",
                            "<b style='color:#000000'>T4</b>.C4")) +
theme(axis.text.y = element_markdown(color = "black"))

Если вы хотите избежать жесткого кодирования, вы тоже можете это сделать. Следующее - это один из способов для вас.

library(dplyr)

mutate(data,
       mylabel = if_else(complete.cases(hl),
                         gsub(x = key, pattern = "^([A-Z][0-9])(\\.[A-Z][0-9]$)",
                         replacement = "<b style='color:#ff0000'>\\1</b>\\2"),
                         key)) %>% 
  distinct(key, .keep_all = TRUE) %>% 
  pull(mylabel) -> mylabel 


ggplot(data, aes(x = value, y = key)) +
geom_density_ridges() +
theme_ridges() +
scale_y_discrete(labels = mylabel) +
theme(axis.text.y = element_markdown(color = "black"))

введите здесь описание изображения

person jazzurro    schedule 29.12.2019
comment
Это решение не кажется надежным. Я ищу способ использовать вспомогательный столбец hl. Ваше решение жестко запрограммировано и предполагает, что нам нужно будет только раскрасить процедуры, а это не так. Я обновил формулировку своего вопроса, чтобы прояснить это. - person StatGuy45; 29.12.2019
comment
@ StatGuy45 Я думаю, дело в том, хотите ли вы манипулировать исходными данными или нет. Если вы предпочитаете использовать hl, см. Дополнительную информацию по манипулированию данными выше. - person jazzurro; 29.12.2019