底部和顶部图标签刻面ggplot2

时间:2019-08-11 13:47:56

标签: r ggplot2 facet-wrap

数据结构::假设您有两组变量,每组三个子级别。我们将它们命名为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组”描述的边军(这就像天堂,但对于这篇文章不是必须的)

1 个答案:

答案 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()

enter image description here

在这种情况下,“上”和“下”将始终是整个数据极端值上下的一个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()

enter image description here

编辑:每个方面,性别和年龄均带有自定义标签:

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()

enter image description here