使用 ggplot 为轴刻度标签的一部分动态着色
Dynamically color a portion of axis tick labels with 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())
我想根据名为 data
的数据集的 hl
列为 y 轴刻度标签的部分着色。因此,对于与 T1.C1
和 T3.C3
实验数据相关的密度图,我希望 T1
和 C3
在没有特殊着色的地方涂成红色对于其他实验,假设 hl
是 NA
。
我假设有一些我可以利用的解析参数,但我不确定从哪里开始。任何建议将不胜感激。 :)
我认为 ggtext
包是我们的朋友。我正在阅读包的 github 页面(https://github.com/clauswilke/ggtext) and this question。这是手动工作,但您可以为特定单词分配特定颜色。在您的情况下,您想调整 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"))
我正在尝试为山脊图中的部分 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())
我想根据名为 data
的数据集的 hl
列为 y 轴刻度标签的部分着色。因此,对于与 T1.C1
和 T3.C3
实验数据相关的密度图,我希望 T1
和 C3
在没有特殊着色的地方涂成红色对于其他实验,假设 hl
是 NA
。
我假设有一些我可以利用的解析参数,但我不确定从哪里开始。任何建议将不胜感激。 :)
我认为 ggtext
包是我们的朋友。我正在阅读包的 github 页面(https://github.com/clauswilke/ggtext) and this question。这是手动工作,但您可以为特定单词分配特定颜色。在您的情况下,您想调整 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"))