Как добавить легенду для двух слоев geom на одном графике ggplot2?

У меня есть фрейм данных, который выглядит следующим образом:

glimpse(spottingIntensityByMonth)
# Observations: 27
# Variables: 3
# $ yearMonth <dttm> 2015-05-01, 2015-06-01, 2015-07-01, 2015-08-01, 2015-09-01, 2015-10-01, 2...
# $ nClassificationsPerDayPerSpotter <dbl> 3.322581, 13.212500, 13.621701,
    6.194700, 18.127778, 12.539589, 8.659722, ...
# $ nSpotters <int> 8, 8, 22, 28, 24, 22, 24, 27, 25, 29, 32, 32, 21, 14, 18, 13, 20, 19, 15, ...

Я пытаюсь построить его с помощью ggplot2 так:

ggplot() + 
    geom_col(data = spottingIntensityByMonth, 
             mapping = aes(x = yearMonth, 
                           y = nClassificationsPerDayPerSpotter)
             ) + 
    xlab("Month of year") + 
    scale_y_continuous(name = "Daily classifications per Spotter") + 
    geom_line(data = spottingIntensityByMonth, 
              mapping = aes(x = yearMonth,
                            y = nSpotters)
              ) +
    theme_bw()

Это создает сюжет примерно так:

Теперь я хочу добавить легенду, которая говорит, что означают строка и столбцы. Как мне это сделать? Спасибо!

1 ответ

Решение

В ggplot автоматически создаются легенды для сопоставленной эстетики. Вы можете добавить такие отображения следующим образом:

ggplot(data = df, 
       mapping = aes(x = x)) + 

  # specify fill for bar / color for line inside aes(); you can use
  # whatever label you wish to appear in the legend
  geom_col(aes(y = y.bar, fill = "bar.label")) +
  geom_line(aes(y = y.line, color = "line.label")) +

  xlab("Month of year") + 
  scale_y_continuous(name = "Daily classifications per Spotter") + 

  # the labels must match what you specified above
  scale_fill_manual(name = "", values = c("bar.label" = "grey")) +
  scale_color_manual(name = "", values = c("line.label" = "black")) +

  theme_bw()

В приведенном выше примере я также переместил данные и общее эстетическое отображение (x) в ggplot(),

сюжет

Примерный набор данных:

set.seed(7)
df <- data.frame(
  x = 1:20,
  y.bar = rpois(20, lambda = 5),
  y.line = rpois(20, lambda = 10)
)

Это решение направлено на построение 2 кривых из 1 кадра данных. Данные одного столбца отображаются в виде линейного графика относительно оси X (Дата наблюдения), а другие - в виде графика площади относительно той же оси X (Дата наблюдения). Кривая области будет на вторичной оси Y. Чертеж и форматирование легенды также показаны на прилагаемых изображениях. Надеюсь, вам понравится решение.

Структура фрейма данных будет выглядеть следующим образом: это образец всего набора данных, я выберу 2 столбца, устаревший, доход и стоимость

Я использую библиотеку Shiny для размещения ее на сервере; если вы не знаете о сиянии, вы можете проигнорировать, это всего лишь макет ~HTML.

библиотека (xlsx) # Библиотека для импорта библиотеки Excel (ggplot2) # Библиотека для библиотеки графиков (openxlsx) #FOR Запуск библиотеки файлов xlsx (блестящая) # Библиотека USERVER UI LIBRARY IN R (lubridate) # Для преобразования импортированных дат в формат даты

file <- "C:/Users/Nikhil Asati/Desktop/Office/Bicurve_data.xlsx"
data1<- read.xlsx( file ,1)
data1$obsdate <- dmy(data1$obsdate)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      plotOutput("Plot")
    )
  )
)
server <- function(input, output) {
  output$Plot <- renderPlot({
    #plot value
    p <- ggplot(data1, aes(x=obsdate))
        p <- p + geom_line(aes(y=revenue, colour ="revenue"))
    #plot revenue
        p <- p + geom_ribbon(aes(ymin = 0, ymax=value/16, fill = 'value'),  
                             linetype=1,     
                             #solid, dashed or other line types
                             colour="grey70",
                             #border line color
                             size=1
                             # ,show.legend= TRUE
        )
         p <- p + scale_y_continuous(sec.axis = sec_axis(~.*16, name = "value"))

         p<- p + scale_colour_manual("", values=c("revenue" = "Grey" ))
         p<- p +scale_fill_manual(name = "", values = c("value" = "green"))
         p<- p +theme(legend.position = "top") 
         p
  })

}


shinyApp(ui = ui, server = server) 

Выход будет

Выходная кривая

Другие вопросы по тегам