У меня есть следующие образцы данных:
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()
Поскольку позже я хочу объединить несколько таких графиков (см. ниже), я хотел бы
удалите пустое пространство между осью Y и столбцами (или измените его на значение X
)
чтобы метка fill
отображалась справа
иметь одно значение слева, говорящее «цель: A»
и иметь 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)
Звучит так, как будто вы просто хотите очертить 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())
два предложения_
scale_x_continuous(..., expand = c(0,0))
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. вертикальное расстояние между стержнями в любом случае будет скорректировано с выходными размерами (здесь: высота фигуры)
Огромное спасибо!
Конечно, facet_grid намного проще! Большое спасибо, работает как шарм! Для будущих посетителей:
scale_x_discrete(position = "top")
перемещаетlower_level
и т. д. вправо. (Вставлено передcoord_flip
)