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) я хочу один заказ, для 2) другой и т. д.
Есть ли какая-то логика в расположении различных уровней факторов?
В этом сюжете нет. В моем реальном, более сложном коде у меня есть три пропорции, сумма которых равна 100 %, и я хочу показать их в другом, определенном порядке.
Затем предоставьте нам тестовые данные и (простой) код, который более точно отражает ваш вариант использования. Нам не нужен сложный код — только фрейм данных, который вы хотите построить, конвейер ggplot, который приближает вас к тому, что вы хотите, и описание того, чего не хватает.
@Limey Хорошо, я добавил текст, чтобы было понятнее, что я хочу сделать. Я хочу иметь возможность вручную корректировать порядок года по четырем периодам времени.





Довольно хакерское решение, заключающееся в создании нового столбца факторов, который вы можете вручную упорядочить для каждого 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").
Я не вижу более простого способа изменить порядок type внутри разных time, чем этот.
Это хак, но да, он работает. Спасибо.
Одна вещь: как я могу использовать scale_fill_identity вместо scale_fill_manual с помощью этого хака?
Если вы хотите использовать scale_fill_identity, вам нужно будет добавить цвета в виде столбца в наборе данных и сопоставить fill с этим столбцом внутри aes().
Пробовали ли вы установить уровни в
fill = factor(type, levels = c(1984, 1987, 1985, 1986)), чтобы проверить, работает ли это?