Мой вопрос близок к этому Легенды для нескольких заливок в ggplot и все же не совпадает. Позволь мне объяснить.
У меня есть фрейм данных, который выглядит так:
df <- data.frame(
'sf'=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'),
'totalsf'=c(28, NA, NA, 32, NA, NA, 40, NA, NA),
'sl' = c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'),
'totalsl' = c(35, NA, NA, 40, NA, NA, 25, NA, NA),
'min' = c('aa', 'bb', 'cc', 'aa', 'bb','cc', 'aa', 'bb', 'cc'),
'totalmin' = c(30, 4, 0, 8, 0, 25, 8, 9, 16),
'id' = c(1,2,3,4,5,6,7,8,9))
Я в основном хочу построить totalsf с sf в качестве заполнения, totalsl с sl в качестве заполнения и totalmin с min в качестве заполнения, все с geom_bar, следующим образом:
g <- ggplot(df %>% mutate(id = id), aes(group=id))
g <- g + geom_bar(aes(x=0, y=totalsf, fill=sf), width=.05, stat = "identity")
g <- g + geom_bar(aes(x= 0.05, y=totalsl, fill=sl), width=.05, stat = "identity")
g <- g + geom_bar(aes(x=0.1, y=totalmin, fill=min), width=.05, stat = "identity")
g <- g + theme_light()
g <- g + theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
legend.position = "bottom")
g <- g + labs(x = "Variable", y = "y", fill = "x")
g <- g + scale_y_continuous(breaks=seq(0, 100, by=10))
print(g)
Это дает следующий график:
Имейте в виду, это то, что я хочу (и я также знаю, как менять цвета, но давайте не будем перегружать код). Вот суть моей проблемы: легенда ужасна, в идеале я хотел бы, чтобы у трех переменных была своя легенда, а не в алфавитном порядке, как сейчас. Кто-нибудь знает, как настроить легенду, чтобы у каждой переменной была своя легенда? (в основном «sf» как заголовок с цветами a, b, c, «sl» как заголовок с цветами A, B, C и «min» как заголовок с цветами aa, bb, cc).
Заранее спасибо за ваши ответы!
Лучший,
Натали





Я не знаю простого трюка, но этот ggnewscale пакет позволяет вам сопоставлять несколько переменных с несколькими шкалами одновременно, что приведет к тому, что легенды будут иметь несколько названий. Вам нужно будет указать масштаб, а затем указать, что вы хотите переопределить масштаб. Пример на основе вашего кода:
library(ggnewscale)
g <- ggplot(df %>% mutate(id = id), aes(group = id)) +
# Note geom_col is shorthand for geom_bar(stat = "identity")
geom_col(aes(x = 0, y = totalsf, fill = sf), width = 0.05) +
# Scale has to be specified, not giving colour values will
# result in all scales being red blue and green.
# guide_legend(order = 1) ensures that the legends appear in your
# order instead of alphanumerically
scale_fill_manual(values = c("red", "green", "blue"),
guide = guide_legend(order = 1)) +
new_scale_fill() +
geom_col(aes(x = 0.05, y = totalsl, fill = sl), width = 0.05) +
scale_fill_manual(values = c("yellow", "magenta", "cyan"),
guide = guide_legend(order = 2)) +
new_scale_fill() +
geom_col(aes(x = 0.1, y = totalmin, fill = min), width = 0.05) +
scale_fill_manual(values = c("black", "grey50", "white"), name = "min") +
theme_light() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
legend.position = "bottom") +
labs(x = "Variable", y = "y", fill = "x") +
scale_y_continuous(breaks=seq(0, 100, by=10))
Это отлично сработало, спасибо! Поскольку у меня было больше категорий, мне пришлось немного изменить легенду, чтобы R представил ее должным образом (особенно используйте direction = «vertical», чтобы она не была горизонтальной, как вы). А в остальном идеально!
Можете ли вы нарисовать ожидаемый результат в Paint, Word или Powerpoint? Легче визуализировать то, что вы хотите