R объединяет geom_linerange() с ручной легендой
Я пытаюсь вручную объединить график ggplot2::geom_pointrange() с полосой, которая реализуется через ggplot2::geom_linerange(), и легендой, основанной на ggplot2::geom_text(). В конце я хотел бы иметь сюжет без каких-либо ярлыков для бара и легенды. Извините за очень длинный вопрос, но я не видел пути дальнейшего сокращения.
Это код, который я уже опробовал
library(dplyr)
library(ggplot2)
data(mpg)
# calculate average fuel consumption based on arbitrary assumption of equal
# city/highway share
mpg <- mutate(mpg, avg = (cty + hwy)/2)
# compute quantils
mpg_by_class <- group_by(mpg, class) %>%
summarise(q10 = quantile(avg, 0.1),
q90 = quantile(avg, 0.9),
med = median(avg))
# compute some cross-class values
mpg_median <- median(mpg$avg)
# plotting ----
# base plot
the_plot <- ggplot() +
geom_pointrange(data = mpg_by_class,
aes(x = class, ymin = q10, ymax = q90, y = med)) +
theme_classic() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
# add a bar on the right
the_plot <- the_plot +
# build the bar
geom_linerange(aes(x = "Y",
ymin = min(mpg_by_class$q10),
ymax = mpg_median), size = 5, colour = "green",
show.legend = FALSE) +
geom_linerange(aes(x = "Y",
ymin = mpg_median,
ymax = max(mpg_by_class$q90), size = 5, colour = "red"),
show.legend = FALSE) +
labs(x = "", y = "mpg") +
# # add labels
geom_text(aes(x = "Z", y = mean(c(min(mpg_by_class$q10), mpg_median)),
label = "shitty"), hjust = 0) +
geom_text(aes(x = "Z", y = mean(c(max(mpg_by_class$q90), mpg_median)),
label = "less shitty"), hjust = 0)
print(the_plot)
"Классы" могут изменяться вместе с данными, так же как и количество отдельных элементов в цветной полосе справа.
Здесь на самом деле есть две проблемы:
- Тот факт, что цветная полоса находится в дальней правой части графика, обусловлен исключительно тем, что я ввел "Y" в качестве x эстетики в geom_linerange() (и "Z" для легенды). Если есть пустое значение, то панель будет размещена где-то еще, как правило, слева. Не существует простого способа объединить данные для точечных диапазонов и линейной диаграммы, поскольку классы и количество вспомогательных панелей основаны на конкретных данных под рукой (я делаю это для более 100 графиков). Есть ли способ на самом деле убедиться, что панель находится на правой стороне, независимо от фактических классов по оси X?
- Кроме того, легенда также может быть добавлена в тот же "класс", что и панель, и немного убрана с помощью аргумента nudge_x в geom_text(), но я не нашел способа удержать ggplot от
вырезание правой части текста, который находится вне холста? Любое решение по-прежнему будет опираться на планку справа
добавив "Z" в качестве категории. Можно ли сделать эту одну метку оси X
невидимый?