首页 > 解决方案 > 使用 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())

我想根据hl标题为 的数据集的列为 y 轴刻度标签的部分着色data。因此,对于与T1.C1T3.C3实验的数据相关的密度图,我希望T1C3被涂成红色,而其他实验没有特殊颜色,因为hlNA

我假设有一些我可以利用的解析参数,但我不确定从哪里开始。任何建议将不胜感激。:)

标签: rggplot2aesthetics

解决方案


我认为这个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"))

在此处输入图像描述


推荐阅读