geom_vline() dateRangeInput()

Я настроил линейный график в блестящем. Ось X имеет даты от 2014 до текущей даты.

Я установил различные вертикальные линии, используя geom_vline(), чтобы выделить точки в данных.

Я использую dateRangeInput(), чтобы пользователь мог выбрать диапазон дат начала / окончания для просмотра на графике.

Одна из моих вертикальных линий - в феврале 2014 года. Если пользователь использует dateRangeInput() для просмотра дат, скажем, января 2016 года, вертикальная линия для февраля 2014 года все еще отображается на графике. Это также приводит к тому, что ось x перемещается с 2014 года, хотя строка данных идет с января 2016 года до текущей даты.

Есть ли способ остановить показ этой вертикальной линии на графике, когда он находится за пределами dataRangeInput()? Может быть, в geom_vline() есть аргумент для решения этой проблемы?

library(shiny)
library(tidyr)
library(dplyr)
library(ggplot2)

d <- seq(as.Date("2014-01-01"),Sys.Date(),by="day")

df <- data.frame(date = d , number = seq(1,length(d),by=1))

lines <- data.frame(x = as.Date(c("2014-02-07","2017-10-31", "2017-08-01")),
                y = c(2500,5000,7500),
                lbl = c("label 1", "label 2", "label 3"))

#UI
ui <- fluidPage(

#date range select:
dateRangeInput(inputId = "date", label = "choose date range",
             start = min(df$date), end = max(df$date),
             min = min(df$date), max = max(df$date)),


#graph:
plotOutput("line") 

)



#SERVER: 
server <- function(input, output) {
data <- reactive({ subset(df, date >= input$date[1] & date <= input$date[2]) 
})

#graph:
output$line <- renderPlot({

my_graph <- ggplot(data(), aes(date, number )) + geom_line() +
  geom_vline(data = lines, aes(xintercept = x, color = factor(x)  )) +
  geom_label(data = lines, aes(x = x, y = y,
                               label = lbl, colour = factor(x),
                               fontface = "bold" )) +
  scale_color_manual(values=c("#CC0000", "#6699FF", "#99FF66")) +
  guides(colour = "none", size = "none")


 return(my_graph)

 })

}

shinyApp(ui = ui, server = server)

рис графика

1 ответ

Как упомянуто Эми в другой теме:

В двух словах, ggplot2 всегда будет отображать все данные, которые вы предоставляете, и пределы осей основаны на этом, если вы не укажете иное. Таким образом, поскольку вы говорите, чтобы они наносили линию и метку, они будут отображаться на графике, даже если остальные данные не распространяются так далеко. Вы можете решить эту проблему, сообщив ggplot2, какими должны быть пределы оси x, используя функцию ord_cartesian.

# Set the upper and lower limit for the x axis
dateRange <- c(input$date[1], input$date[2])

my_graph <- ggplot(df, aes(date, number)) + geom_line() +
  geom_vline(data = lines, aes(xintercept = x, color = factor(x)  )) +
  geom_label(data = lines, aes(x = x, y = y,
                               label = lbl, colour = factor(x),
                               fontface = "bold" )) +
  scale_color_manual(values=c("#CC0000", "#6699FF", "#99FF66")) +
  guides(colour = "none", size = "none") +
  coord_cartesian(xlim = dateRange)
Другие вопросы по тегам