Наложенный ggplot2 Barchart с 2 группами - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу нарисовать диаграмму ggplot2 с наложенными столбцами (проценты).У меня есть 2 группы, и каждая из групп состоит из 2 подгрупп.

Рассмотрим следующий воспроизводимый пример:

# Create data for ggplot
data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
                       values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
                       group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))

Это то, что я получил до сих пор:

library("ggplot2")

# Draw barchart (not overlayed)
ggplot(data_ggp, aes(category, values)) + 
  geom_bar(stat = "identity", aes(fill = group), position = "dodge")

enter image description here

В этом примере красные и зеленые столбцы должны перекрывать друг друга, а синие и фиолетовые столбцы должны перекрывать друг друга.

Я уверендолжно быть простое решение, и я нашел следующие 2 темы:

Тем не менее, оба потока описывают немного разные проблемы, и я, к сожалению, не смог изменить коды для своих конкретныхситуация.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете сделать это с небольшим изменением формы заранее.Вам нужно немного логики, чтобы связать красные полосы (group1a) с зелеными полосами (group1b), и то же самое для синих и фиолетовых полос.В этом случае общностью является номер группы.Самый простой способ создать переменную с номером группы, по крайней мере, с данными, которые у вас есть, это просто подгруппировать группу для всех, кроме последнего символа.Если группы становятся более сложными, вы можете вместо этого использовать регулярное выражение.

Затем, когда position = "identity" находится внутри geom_col, вы размещаете бары независимо от того, будут ли они перекрывать друг друга.

library(tidyverse)

data_split <- data_ggp %>%
  mutate(group_num = str_sub(group, 1, -2))

head(data_split)
#>   category values   group group_num
#> 1     cat1  0.664 group1a    group1
#> 2     cat2  0.045 group1a    group1
#> 3     cat3  0.291 group1a    group1
#> 4     cat1  0.482 group1b    group1
#> 5     cat2  0.029 group1b    group1
#> 6     cat3  0.489 group1b    group1

Теперь вы можете использовать group_num для размещения баров на оси X.Одним из способов является использование взаимодействия между этими группами и категориями:

ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) +
  geom_col(position = "identity", alpha = 0.4)

Другой способ заключается в размещении только номера группы на оси X, затем фасет по категории,Вы можете настроить элементы темы так, чтобы фасеты выглядели не так, как фасеты, а больше как большие группы по оси x, но я оставлю это советам из других вопросов SO.

ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
  geom_col(position = "identity", alpha = 0.4) +
  facet_wrap(~ category)

Обратите внимание, что geom_col эквивалентно geom_bar(stat = "identity"), и что я перевернул альфа-путь вниз, чтобы показать перекрытия.

Создано в 2018-11-26 при представлении пакета (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...