#r #ggplot2
Вопрос:
Я пытаюсь построить некоторые данные с очень длинными метками по оси Y. Я хочу расположить легенду в верхней части графика и расположить ее горизонтально по всей ширине графика (как указано шириной панели метками по оси Y). Я, кажется, не могу понять, как это сделать.
Вот данные об игрушках, с которыми я работал:
library(magrittr)
library(dplyr)
library(ggplot2)
iris_new <- iris
iris_new %<>%
mutate(Sepal.Width = paste0(Sepal.Width,
paste0(sample(letters, size = 100, replace = TRUE),
collapse = "")))
plt0 <- ggplot(iris_new, aes(Sepal.Length, Sepal.Width, color = Species))
geom_point() theme(legend.position = "top", legend.direction = "horizontal")
plt0
legend.justification = "left"
имитирует то, что я хочу, но не идеально, так как это просто выравнивание легенды по левому краю панели, и так уж получилось, что это примерно совпадает с серединой ширины графика.
plt1 <- plt0 theme(legend.justification = "left")
plt1
Но это решение на самом деле неудовлетворительно, так как я не могу гарантировать, что метки по оси Y не станут длиннее (или короче). Конечно, я мог stringr::str_wrap()
бы ограничить ширину метки, скажем, 40 символами, но я действительно хочу знать, есть ли простое ggplot2
решение проблемы выравнивания. Это также не учитывало бы тот факт, что построенные на графике данные могут заставить ось X меняться в зависимости от графика.
guides(fill = guide_legend(title.position = "left", label.position = "left"))
и guides(fill = guide_legend(title.hjust = 0, label.hjust = 0))
тоже не сработало.
Ожидаемый результат будет примерно таким (смоделировано с использованием LibreOffice Impress
):
Я прошу прощения, если это тривиальный вопрос. Я попытался найти соответствующие сообщения stackoverflow
, но не смог найти решение.
Ответ №1:
Это близко к тому, что вам нужно
p1 <-ggplot(iris_new, aes(Sepal.Length, Sepal.Width, color = Species))
geom_point()
p2 <- p1 theme(legend.position = "top")
le1 <- cowplot::get_legend(p1)
le1
cowplot::plot_grid(p2, le1, nrow = 2, rel_heights = c(1, 0.2))
Хотя я вижу еще одну легенду внизу, не знаю, как ее удалить, но горизонтальный центр ее закрывает
Комментарии:
1. Хм, это совсем не похоже на то, что я надеюсь сделать, если только я чего-то не понимаю. Например, в сюжете, изображенном в вашем ответе, я ожидал, что мое ожидаемое решение состояло бы в том, чтобы надпись сверху была размещена ровно посередине по ширине сюжета. Однако я очень ценю ваши усилия.