Рассмотрим следующий сюжет:
library(ggplot2)
p <- ggplot(diamonds,
aes(x = carat, fill = cut)) +
geom_density(position = "stack") +
facet_wrap(~ color)
facet_wrap
функция обертывание последовательности граненых панелей примерно в прямоугольный дисплей nrow
строк и ncol
столбцов. Тем не менее, в зависимости от данных, фактическое количество панелей часто составляет несколько панелей, если не nrow * ncol
, что оставляет часть nrow * ncol
пространства на графике.
Если сюжет включает в себя легенду (ы), ситуация усугубляется, потому что теперь у нас есть еще больше потерянного пространства из-за легенды, будь то справа (положение легенды по умолчанию) или в одном из трех других направлений.
Чтобы сэкономить место, я хотел бы переместить легенду (и) в пространство, созданное незаполненными гранями.
Следующее работает в качестве меры экономии места, но легенда привязана к углу области графика, с потенциально большим количеством места, оставленного на одной стороне, создавая несбалансированный вид:
p +
theme(legend.position = c(1, 0),
legend.justification = c(1, 0))
Сдвиг легенды к центру области пустого пространства путем ручной настройки legend.position
/legend.justification
является legend.justification
проб и ошибок, и его трудно масштабировать, если у вас есть много граненых графиков для работы.
Итак, я хочу метод, который:
- Смещает легенду (и) граненого сюжета в пространство, созданное из-за пустых граней.
- В результате получается довольно симпатичный сюжет.
- Легко автоматизируется для обработки множества участков.
Это повторяющийся вариант использования для меня, и я решил опубликовать его вместе со своим рабочим решением здесь на тот случай, если кто-то еще посчитает его полезным. Я не видел, чтобы этот сценарий спрашивали/отвечали в другом месте на переполнении стека. Если у кого-то есть, пожалуйста, оставьте комментарий, и я буду рад ответить там вместо этого или пометить это как дубликат, в зависимости от обстоятельств.