Изменить горизонтальные гистограммы для комбинации (жесткий дизайн)

У меня есть следующие образцы данных:

library(tidyverse)

df <- data.frame(col=rep(c("A_B", "A_C", "A_D", 
                           "B_A", "C_A", "D_A",
                           "B_C", "B_D", 
                           "C_B", "D_B",
                           "C_D", "D_C"), 2),
                 level=c(rep("lower_level", 12), rep("higher_level", 12)),
                 value=abs(rnorm(24, mean=5, sd=2)))%>% tibble()
df[c('origin', 'target')] <- str_split_fixed(df$col, '_', 2)
df <- df %>% select(c(origin, target, level, value))

Теперь я хочу создать горизонтальные гистограммы для каждой цели (df %>% filter(target= = "A")). Я делаю это, используя следующий код:

# plot
p1 <- ggplot(data = df %>% filter(target= = "A"), 
            aes(x = factor(level), y = value, fill = factor(origin)))+
  geom_bar(stat = "identity", position = "fill", width = .1) + 
  scale_fill_manual(values = c("A" = "yellow", "B" = "green", "C" = "red", "D" = "blue")) +
  coord_flip()

Поскольку позже я хочу объединить несколько таких графиков (см. ниже), я хотел бы

  1. удалите пустое пространство между осью Y и столбцами (или измените его на значение X)

  2. чтобы метка fill отображалась справа

  3. иметь одно значение слева, говорящее «цель: A»

  4. и иметь fill легенду и ось Y, общие для всех графиков.

См. аннотированный сюжет:

Изменить горизонтальные гистограммы для комбинации (жесткий дизайн)

Для справки я создаю дополнительные графики с помощью этого кода:

p2 <- ggplot(data = df %>% filter(target= = "B"), 
       aes(x = factor(level), y = value, fill = factor(origin)))+
  geom_bar(stat = "identity", position = "fill", width = .1) +
  scale_fill_manual(values = c("A" = "yellow", "B" = "green", "C" = "red", "D" = "blue")) +
  coord_flip()

p3 <- ggplot(data = df %>% filter(target= = "C"), 
             aes(x = factor(level), y = value, fill = factor(origin)))+
  geom_bar(stat = "identity", position = "fill", width = .1) +
  scale_fill_manual(values = c("A" = "yellow", "B" = "green", "C" = "red", "D" = "blue")) +
  coord_flip()

p4 <- ggplot(data = df %>% filter(target= = "D"), 
             aes(x = factor(level), y = value, fill = factor(origin)))+
  geom_bar(stat = "identity", position = "fill", width = .1) +
  scale_fill_manual(values = c("A" = "yellow", "B" = "green", "C" = "red", "D" = "blue")) +
  coord_flip()

И объедините их с этим кодом (но с удовольствием воспользуемся другими способами их объединения, если это необходимо).

library("gridExtra")
grid.arrange(p1, p2, p3, p4, ncol = 1, nrow = 4)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
17
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Звучит так, как будто вы просто хотите очертить target. Здесь нет необходимости сшивать несколько участков.

ggplot(data = df %>% mutate(target = paste('Target:', target)), 
             aes(x = factor(level), y = value, fill = factor(origin)))+
  geom_col(position = "fill", width = 0.9) + 
  scale_fill_manual(values = c("A" = "yellow", "B" = "green", 
                               "C" = "red", "D" = "blue"), name = 'origin') +
  facet_grid(target~., switch = 'y') +
  coord_flip() +
  theme(strip.placement = 'outside',
        strip.background = element_blank(),
        axis.title.y = element_blank())

Конечно, facet_grid намного проще! Большое спасибо, работает как шарм! Для будущих посетителей: scale_x_discrete(position = "top") перемещает lower_level и т. д. вправо. (Вставлено перед coord_flip)

Ivo 23.03.2022 14:58

два предложения_

  1. чтобы удалить смещение между осью и стержнем, установите расширение оси на ноль scale_x_continuous(..., expand = c(0,0))
  2. вместо утомительного подмножества фрейма данных используйте опцию facet_wrap или facet_grid ggplot:
ggplot(data = df, 
             aes(x = factor(level), y = value, fill = factor(origin))) +
       ## other plot instructions
       facet_wrap( ~target)

см. ?facet_wrap для различных вариантов макета, таких как количество столбцов графика 3. вертикальное расстояние между стержнями в любом случае будет скорректировано с выходными размерами (здесь: высота фигуры)

Огромное спасибо!

Ivo 23.03.2022 14:58

Другие вопросы по теме