ggplot2: как создать легенду горизонтального центра в верхней части графика с длинными метками по оси Y?

#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
 

Основной сюжет:
plt0

legend.justification = "left" имитирует то, что я хочу, но не идеально, так как это просто выравнивание легенды по левому краю панели, и так уж получилось, что это примерно совпадает с серединой ширины графика.

 plt1 <- plt0   theme(legend.justification = "left")
plt1
 

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 ): plt2

Я прошу прощения, если это тривиальный вопрос. Я попытался найти соответствующие сообщения 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. Хм, это совсем не похоже на то, что я надеюсь сделать, если только я чего-то не понимаю. Например, в сюжете, изображенном в вашем ответе, я ожидал, что мое ожидаемое решение состояло бы в том, чтобы надпись сверху была размещена ровно посередине по ширине сюжета. Однако я очень ценю ваши усилия.