Добавить легенду вручную в ggplot2 не работает

Я искал не только stackoverflow, но и многие другие сайты. К сожалению, мне пока не удалось найти никакой помощи. Я собираюсь объяснить свою проблему так явно, как я могу. Поскольку это мой первый вопрос здесь, в stackoverflow, будьте осторожны, я новичок в R. Моя цель — вручную добавить легенду к моему уже созданному объекту ggplot2.

Это набор данных, с которым я работаю:

structure(list(Values = 0:5, Count = c(213L, 128L, 37L, 18L, 
3L, 1L), rel_freq = c(0.5325, 0.32, 0.0925, 0.045, 0.0075, 0.0025
), pois_distr = c(0.505352031744286, 0.344902761665475, 0.117698067418343, 
0.0267763103376731, 0.00456870795136548, 0.000623628635361388
)), class = "data.frame", row.names = c(NA, -6L))

который выглядит как

  Values Count rel_freq   pois_distr
1      0   213   0.5325 0.5053520317
2      1   128   0.3200 0.3449027617
3      2    37   0.0925 0.1176980674
4      3    18   0.0450 0.0267763103
5      4     3   0.0075 0.0045687080
6      5     1   0.0025 0.0006236286

Затем мне уже удалось создать ggplot, который в порядке, и код:

cols <- c('Beob. Häufigkeiten' = 'lightblue', 'Theor. Häufigkeiten' = 'darkblue')
plot_yeast1 <- ggplot(data.frame(data1_plot), aes(x=Values)) + 
  geom_col(aes(y=rel_freq, fill = 'Beob. Häufigkeiten'), col = 'lightblue4', alpha = 0.8) + 
  geom_point(aes(y=pois_distr, colour = 'Theor. Häufigkeiten'), alpha = 0.9, size = 4) +
  scale_fill_manual(name = 'Legende', values = cols) +
  scale_colour_manual(name ='Legende', values = cols) + 
  scale_y_continuous(breaks = seq(0, 0.6, 0.05)) +
  labs(title = 'Gegenüberstellung der beobachteten Häufigkeiten mit den theoretischen \nHäufigkeiten aus dem geschätzten Poissonmodell', x = 'Auftretende Fehler von Hefezellen', y = 'Relative Häufigkeit', subtitle = 'Konzentration 1') +
  theme_bw()
plot_yeast1

и вывод:

График 1 с обоими заголовками

Моя цель — объединить обе вручную созданные легенды в правой части графика в одну. Я уже пробовал пропускать второй заголовок легенды, тогда похоже

График без второго заголовка.

Но широкое пространство некрасиво, и должна быть возможность слить эти две легенды в одну, где две записи расположены близко друг к другу. Я уже провел на нем более 9 часов и перерыл множество постов, которые не решили мою проблему. Если что-то неясно, пожалуйста, дайте мне знать. Как я уже писал, первый раз задаю вопрос. Спасибо


person mzerobin    schedule 21.04.2020    source источник
comment
также связанные ggplot2 как разделить полигон геометрии и линию геометрии в ключах легенды"> stackoverflow.com/questions/50826229/   -  person tjebo    schedule 21.04.2020
comment
Кстати, некоторые отзывы: Очень красиво сформулированный вопрос. Благодарим вас за предоставление деталей, кода и данных в формате, который легко импортировать и с которым легко работать. Эти детали очень ценятся и, безусловно, дадут вам наилучшие шансы получить полезный ответ!   -  person chemdork123    schedule 21.04.2020


Ответы (2)


Если речь идет в первую очередь о визуальном создании "одной" легенды из двух, этот подход может помочь - подробности см. в комментариях к theme(...) - call в конце:

cols <- c('Beob. Häufigkeiten' = 'lightblue', 'Theor. Häufigkeiten' = 'darkblue')
plot_yeast1 <- ggplot(data.frame(data1_plot), aes(x=Values)) + 
  geom_col(aes(y=rel_freq, fill = 'Beob. Häufigkeiten'), col = 'lightblue4', alpha = 0.8) + 
  geom_point(aes(y=pois_distr, colour = 'Theor. Häufigkeiten'), alpha = 0.9, size = 4) +
  scale_fill_manual(name = 'Legende', values = cols) +
  scale_colour_manual(name ='', values = cols) + 
  scale_y_continuous(breaks = seq(0, 0.6, 0.05)) +
  labs(title = 'Gegenüberstellung der beobachteten Häufigkeiten mit den theoretischen \nHäufigkeiten aus dem geschätzten Poissonmodell', x = 'Auftretende Fehler von Hefezellen', y = 'Relative Häufigkeit', subtitle = 'Konzentration 1') +
  theme_bw() +
  theme(legend.box.background = element_rect(colour = "grey", fill = "white"), # create a box around all legends
        legend.box.margin = margin(0.1, 0.1, 0.1, 0.1, "cm"),                  # specify the margin of that box
        legend.background = element_blank(),                                   # remove boxes around legends (redundant here, as theme_bw() seems to do that already)
        legend.spacing = unit(-0.5, "cm"),                                     # move legends closer together
        legend.margin = margin(0, 0.2, 0, 0.2, "cm"))                          # specify margins of each legend: top and bottom 0 to move them closer
plot_yeast1

введите здесь описание изображения

person Wolfgang Arnold    schedule 21.04.2020
comment
Может быть, добавить еще и вывод для улучшения качества, чтобы людям даже не нужно было запускать коды на первый взгляд? - person massisenergy; 21.04.2020
comment
Большое спасибо! - person mzerobin; 21.04.2020

Вы можете перемещать легенды близко друг к другу с помощью theme(legend.margin) вот так

cols <- c('Beob. Häufigkeiten' = 'lightblue', 'Theor. Häufigkeiten' = 'darkblue')
plot_yeast1 <- ggplot(data.frame(data1_plot), aes(x=Values)) + 
  geom_col(aes(y=rel_freq, fill = 'Beob. Häufigkeiten'), col = 'lightblue4', alpha = 0.8) + 
  geom_point(aes(y=pois_distr, colour = 'Theor. Häufigkeiten'), alpha = 0.9, size = 4) +
  scale_fill_manual(name = 'Legende', values = cols) +
  scale_colour_manual(name =NULL, values = cols) + 
  scale_y_continuous(breaks = seq(0, 0.6, 0.05)) +
  labs(title = 'Gegenüberstellung der beobachteten Häufigkeiten mit den theoretischen \nHäufigkeiten aus dem geschätzten Poissonmodell', x = 'Auftretende Fehler von Hefezellen', y = 'Relative Häufigkeit', subtitle = 'Konzentration 1') +
  theme_bw() +
  theme(
    # legend.position = c(.95, .95),
    # legend.justification = c("right", "top"),
    legend.box.just = "right",
    legend.margin = margin(-10)
  )
plot_yeast1

введите здесь описание изображения

person Greg    schedule 21.04.2020
comment
Большое спасибо! - person mzerobin; 21.04.2020