Хобрук: Ваш путь к мастерству в программировании

Расположение легенды в комбинированном ggplot

Я новичок в R, не говоря уже о ggplot, поэтому заранее извиняюсь за любые проблемы с моим примером ниже.

Используя примеры из существующих вопросов, я попытался собрать код для объединения двух отдельных ggplots. Мне интересно, как я могу переместить легенду финального сюжета, чтобы она располагалась над графиком. Я попытался изменить legend.postion на «top» для отдельных ggplots, но, похоже, это не сработало.

(Обратите внимание, что я не упомянул создание второй оси Y, чтобы свести код в примере к минимуму того, что, по моему мнению, необходимо для иллюстрации моей проблемы)

    library(ggplot2)
    library(gtable)
    library(reshape2)
    library(grid)
    library(scales)

    df.test <- data.frame(
        x_cat = factor(c(1, 2, 3, 4)),
        count = seq(1:4),
        line1 = seq(from = 1, to = 4, length.out = 4),
        line2 = seq(from = 0, to = 3, length.out = 4)
    )

    p1 <- ggplot( data = df.test , aes(x=x_cat, y=count) ) +
          geom_bar( stat="identity" ) +
          xlab( "X Label" ) +
          ylab( "Y Label 1" ) +
          theme(panel.background = element_rect(colour = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                legend.position = "bottom")
    g1 <- ggplotGrob( p1 )

    df.test2 <- melt( df.test[-2] )
    p2 <- ggplot( data = df.test2 , aes(x=x_cat, y=value, colour=variable ) ) +
          geom_line( aes(group=variable) ) +
          ylab( "Y Label 2" ) +
          theme(panel.background = element_rect(fill = NA, colour = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                legend.position = "bottom") 
    g2 <- ggplotGrob(p2)

    pp <- c(subset(g1$layout, name == "panel", se = t:r))
    g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, pp$l, pp$b, pp$l)

    pp <- c(subset(g2$layout, name == "guide-box", se = t:r))
    g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "guide-box")]], t=pp$t, l=pp$l, b=pp$b, r=pp$r)

    grid.draw(g)
29.09.2016


Ответы:


1

Вам не нужно объединять два отдельных участка. Подход ggplot состоит в том, чтобы думать об этом как об одном графике с двумя слоями, слоем столбцов и слоем линий. Так что нам просто нужно выяснить, как разместить эти слои на одном графике. Например:

library(ggplot2)
library(reshape2)

df.test <- data.frame(
  x_cat = factor(c(1, 2, 3, 4)),
  count = seq(1:4),
  line1 = seq(from = 1, to = 4, length.out = 4),
  line2 = seq(from = 0, to = 3, length.out = 4)
)

df.test2 = melt(df.test, id.var=c("x_cat", "count"))

ggplot() +
  geom_bar(data=subset(df.test2, variable=="line1"), aes(x=x_cat, y=count), 
           stat="identity" ) +
  geom_line(data=df.test2, aes(x=x_cat, y=value, colour=variable, group=variable)) +
  xlab( "X Label" ) +
  ylab( "Y Label 1" ) +
  theme(panel.background = element_rect(colour = "white"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top")

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

Оказалось, что никакая легендарная гимнастика здесь не нужна. Однако, если вам когда-нибудь понадобится объединить отдельные графики с одной легендой, здесь, здесь и здесь — несколько примеров.

29.09.2016
  • Спасибо за примеры. Причина, по которой я хотел объединить два отдельных графика, заключалась в том, что в конечном итоге я хочу использовать как левую, так и правую ось Y. Таким образом, гистограммы будут отображаться на значения y слева, а линии будут отображаться на значения y справа. (Я оставил этот код вне своего исходного поста, чтобы попытаться уменьшить размер) Интересно, могу ли я перейти по одной из ваших ссылок и извлечь легенду в виде гроба из графика p2, а затем использовать grid.arrange() для комбинированного сюжет и добавить легенду обратно? 30.09.2016
  • Да, вы можете сделать именно так, как вы описываете. 30.09.2016
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..