Изменение порядка заливки между разными группами ggplot2

 library(ggplot2)
 library(dplyr)

 series <- data.frame(
      time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
      type = c(1984:1987),
      value = rpois(16, 10)
    )
    
    
    series %>%
      ggplot(aes(time, value, group=factor(type, levels=1987:1984)))+
      geom_col(aes(fill= factor(type)))+
      guides(fill=guide_legend(title = "type"))

Я хочу изменить порядок заливки между различными группами, как показано на рисунке ниже, который я отредактировал в Paint. Как мне это сделать?

редактировать:

  • Для времени 1 я хочу иметь порядок 1984, 1985, 1986 и 1987 годов.
  • Для времени 2 я хочу иметь порядок 1984, 1986, 1985 и 1987 годов.
  • Для времени 3 я хочу иметь порядок 1984, 1985, 1987 и 1986 годов.
  • Для времени 3 я хочу иметь порядок 1987, 1986, 1985 и 1984.

Пробовали ли вы установить уровни в fill = factor(type, levels = c(1984, 1987, 1985, 1986)), чтобы проверить, работает ли это?

Ifeanyi Idiaye 27.05.2024 18:54

Я хочу иметь разные факторы для разных групп. Итак, для 1) я хочу один заказ, для 2) другой и т. д.

KGB91 27.05.2024 19:02

Есть ли какая-то логика в расположении различных уровней факторов?

Seth 27.05.2024 19:13

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

KGB91 27.05.2024 19:18

Затем предоставьте нам тестовые данные и (простой) код, который более точно отражает ваш вариант использования. Нам не нужен сложный код — только фрейм данных, который вы хотите построить, конвейер ggplot, который приближает вас к тому, что вы хотите, и описание того, чего не хватает.

Limey 27.05.2024 20:33

@Limey Хорошо, я добавил текст, чтобы было понятнее, что я хочу сделать. Я хочу иметь возможность вручную корректировать порядок года по четырем периодам времени.

KGB91 27.05.2024 23:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
6
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Довольно хакерское решение, заключающееся в создании нового столбца факторов, который вы можете вручную упорядочить для каждого time и type в зависимости от порядка, в котором вы хотите, чтобы они отображались. Затем вы используете это для раскрашивания столбцов, определяете все уровни в новом факторе с помощью то же type, чтобы иметь тот же цвет, а затем удалите лишние элементы из легенды:

library(ggplot2)
library(dplyr)

set.seed(1234)
series <- data.frame(
  time = c(rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4)),
  type = c(1984:1987),
  value = rpois(16, 10)
)

# set order of variables for each time point
plot_data <- series |>
  mutate(
    type = factor(type),
    lvl = paste0(time, "-", type),
    lvl = factor(lvl, levels = c(
      c(
        "1-1984", "1-1985", "1-1986", "1-1987",
        "2-1984", "2-1986", "2-1985", "2-1987",
        "3-1984", "3-1985", "3-1987", "3-1986",
        "4-1987", "4-1986", "4-1985", "4-1984"
      )
    ))
  )

# set colours to use
col_palette <- RColorBrewer::brewer.pal(
  n = length(unique(plot_data$type)),
  name = "Dark2"
)
names(col_palette) <- unique(plot_data$type)
cols_to_plot <- plot_data |>
  select(lvl, type) |>
  left_join(tibble::enframe(col_palette),
    by = c("type" = "name")
  ) |>
  select(lvl, value) |>
  tibble::deframe()

# plot
plot_data |>
  ggplot(aes(x = time, y = value)) +
  geom_col(aes(fill = lvl)) +
  scale_fill_manual(
    values = cols_to_plot,
    breaks = c("1-1984", "1-1985", "1-1986", "1-1987"),
    labels = c("1984", "1985", "1986", "1987"),
    name = "type"
  )

Вы можете упростить, сопоставив lvl с group aes: ... + geom_col(aes(fill = type, group = lvl)) + scale_fill_brewer(palette = "Dark2").

stefan 28.05.2024 06:52

Я не вижу более простого способа изменить порядок type внутри разных time, чем этот.

Limey 28.05.2024 11:06

Это хак, но да, он работает. Спасибо.

KGB91 29.05.2024 00:01

Одна вещь: как я могу использовать scale_fill_identity вместо scale_fill_manual с помощью этого хака?

KGB91 29.05.2024 00:06

Если вы хотите использовать scale_fill_identity, вам нужно будет добавить цвета в виде столбца в наборе данных и сопоставить fill с этим столбцом внутри aes().

nrennie 29.05.2024 10:17

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