数据结构::假设您有两组变量,每组三个子级别。我们将它们命名为A1,A2,A3(A组),B1,B2,B3(B组)。所有整数类型都在5-25之间。每个变量的描述形式均为“ A1Lower / A1Upper”,等等。
数据集和软件包:您可以使用以下代码生成数据集:
library(dplyr)
library(ggplot2)
# We will need subscales later
subscales <- paste0(rep(c('A', 'B'), each = 3), 1:3)
# Dataset
data <- replicate(6, sample(5:25, 500, replace = T)) %>%
as_tibble() %>%
setNames(subscales)
我已根据描述使用facet_wrap
和标签(自定义标签制作器)创建了geom_violion
的{{1}},并使用以下代码:
geom_boxplot()
目标:问题在于整个标签都放在首位。我想要小提琴上方的上方描述和下方的下方描述。到目前为止,我设法将x标度设置为具有“下描述”的字符和带有“上限”描述的标签。这并不完美,因为它会使我复杂化许多事情(例如,我想使用subscales_labeller <- paste0(subscales, 'Lower / ', subscales, 'Upper') %>%
setNames(subscales) %>% #as a named vector
as_labeller() #as a ggplot2 labeller
data %>%
gather(subscale, value, factor_key = T) %>%
ggplot(aes(x = '', y = value)) +
geom_violin() +
geom_boxplot(width = 0.1) +
facet_wrap(~subscale, ncol = 3, labeller = subscales_labeller) +
theme_minimal() +
labs(x = '', y = '')
美观性),这就是为什么我希望立即设置底部和顶部标签之类的原因。更不用说带有“ A组”和“ B组”描述的边军(这就像天堂,但对于这篇文章不是必须的)
答案 0 :(得分:2)
此答案是对OP对使用geom_text()
标记上下限的多面图版本的评论的回应。
我制作了两个版本,一个是静态代码,另一个是自适应代码。我还自由地切换到facet_grid()
来容纳OP表示感兴趣的侧面标签。下面是静态版本,假设data
来自您发布的代码:
df <- data %>% gather(subscale, value, factor_key = T) %>%
mutate(letter = paste("Group", substr(subscale, 1, 1)),
number = substr(subscale, 2, 2))
ggplot(df, aes(x = '', y = value)) +
geom_violin() +
geom_boxplot(width = 0.1) +
geom_text(data = data.frame(value = c(max(df$value), min(df$value)),
label = c("Upper", "Lower")),
aes(label = label),
nudge_y = c(1, -1)) +
facet_grid(letter ~ number) +
labs(x = "", y = "") +
theme_minimal()
在这种情况下,“上”和“下”将始终是整个数据极端值上下的一个y轴单位。您可能需要调整nudge_y
使其适合您的绘图大小。
以下代码段将根据组的最大/最小值自适应地放置标签。为了说明这一点,我抛出了一些观察结果,表明标签放置正确。
df <- df[!(df$subscale == "A2" & df$value > 15),]
ggplot(df, aes(x = '', y = value)) +
geom_violin() +
geom_boxplot(width = 0.1) +
geom_text(aes(label = "Upper"), stat = "summary", fun.y = "max",
position = position_nudge(y = 1)) +
geom_text(aes(label = "Lower"), stat = "summary", fun.y = "min",
position = position_nudge(y = -1)) +
facet_grid(letter ~ number) +
labs(x = "", y = "") +
theme_minimal()
编辑:每个方面,性别和年龄均带有自定义标签:
labs <- expand.grid(value = range(df$value),
letter = unique(df$letter),
number = unique(df$number))
labs$label <- c("Sweet", "Sour", "Introvert", "Extrovert",
"Idiot", "Genius", "Dark", "Light",
"Small", "Big", "Tom-eh-to", "Tom-ah-to")
df$sex <- sample(c("F", "M"), size = nrow(df), replace = TRUE)
df$age <- sample(c("<20", "20-30", ">30"), size = nrow(df), replace = TRUE)
ggplot(df, aes(x = sex, y = value)) +
geom_violin(aes(fill = age)) +
geom_boxplot(aes(fill = age), width = 0.1,
position = position_dodge(0.9)) +
geom_text(data = labs,
aes(x = 1.5, label = label),
nudge_y = c(-1, 1)) +
facet_grid(letter ~ number) +
labs(x = "", y = "") +
theme_minimal()