Почему мой график масштабирования блестит от пустого ggplot2

У меня есть график временных рядов, созданный в ggplot2 и идущий на панель в Shinydashbaord. Мне нужно, чтобы нижняя панель была графиком масштабирования для графика временных рядов. По какой-то причине мой график масштабирования не отображает данные или значения оси из графика временных рядов. Любая помощь здесь очень ценится.

В приведенном ниже примере используется диапазон дат, заданный на боковой панели. Если в этом примере изменить диапазон дат, график не будет работать. Моя реальная работа не так чувствительна к датам, это просто для демонстрации.

library (shiny)
library (shinydashboard)
library (ggplot2)

header <- dashboardHeader(title = "Example")

sidebar <- dashboardSidebar(
 sidebarMenu(
   menuItem("Data Estimation", tabName = "tabset1",
      dateRangeInput("dates", 
                    "Date range for regression",
                    start = as.character(Sys.Date() - 495), 
                    end = as.character(Sys.Date() - 396))
)))

body <- dashboardBody(
 fluidRow(
  tabBox(id = "tabset1", height = "450px", width = "900px",
   tabPanel("Time Series Est", 
     plotOutput ("plot1", height = 400,
                 brush = brushOpts(
                   id = "plot1Brush",
                   resetOnNew = TRUE)))
)),
 fluidRow(
  tabBox(id = "tabset1", height = "450px", width = "900px",
   tabPanel("Zoom", 
     plotOutput ("plot2", height = 400)
))))

ui <- dashboardPage(skin = "blue", header, sidebar, body)

server <- function(input, output) ({

output$plot1 <- renderPlot({

dat <- data.frame(x = seq(1,100,1), y = seq(1,2000,20), z = seq(1,3000,30), dateTime = seq(input$dates[1], input$dates[2], 1))

p <- ggplot() +
 geom_line(data = dat, aes(x = dateTime, y = x, color = "x")) +
 geom_line(data = dat, aes(x = dateTime, y = y, color = "y")) +
 geom_line(data = dat, aes(x = dateTime, y = z, color = "z")) +
 scale_y_log10() +
 theme_bw()

print(p)

})

ranges2 <- reactiveValues(x = NULL, y = NULL)

observe({
 brush <- input$plot1Brush
 if (!is.null(brush)) {
  ranges2$x <- c(brush$xmin, brush$xmax)
  ranges2$y <- c(brush$ymin, brush$ymax)
}
else {
 ranges2$x <- NULL
 ranges2$y <- NULL
}
})


output$plot2 <- renderPlot({

if (!is.null(ranges2$x)) {
ranges2$x <- as.Date(ranges2$x, origin = "1970-01-01")
}

dat <- data.frame(x = seq(1,100,1), y = seq(1,2000,20), z = seq(1,3000,30), dateTime = seq(input$dates[1], input$dates[2], 1))

p <- ggplot() +
 geom_line(data = dat, aes(x = dateTime, y = x, color = "x")) +
 geom_line(data = dat, aes(x = dateTime, y = y, color = "y")) +
 geom_line(data = dat, aes(x = dateTime, y = z, color = "z")) +
 coord_cartesian(xlim = ranges2$x, ylim = ranges2$y) +
 scale_y_log10() +
 theme_bw()

print(p)

})

})

shinyApp(ui, server)

person Breaker    schedule 08.01.2016    source источник


Ответы (2)


в ваших выражениях renderPlot() вместо использования print(p) замените на p

это сработало для меня.

person MLavoie    schedule 08.01.2016
comment
Я думаю, что нет никакой разницы между использованием print(p) и p. Вы видели один? Я не знал, но я никогда не был уверен в этих вещах. - person Mike Wise; 09.01.2016
comment
на самом деле да, есть. посмотрите на этот stackoverflow.com/ вопросы/31445367/ - person MLavoie; 09.01.2016
comment
Интересный. Рассмотрю это. Тем не менее, я думаю, что он просто не заметил, что, когда он меняет дату, его вектор даты больше не имеет длины 100, что приводит к сбою графика и его возвращению пустым. - person Mike Wise; 09.01.2016
comment
Я разместил в своем первоначальном вопросе, что я знаю, что если вы измените дату, сюжет полностью потерпит неудачу для этого примера. Попробуйте не менять дату. - person Breaker; 09.01.2016

Ваши векторы последовательности данных имеют разную длину.

Замените определения вашего фрейма данных (оба) следующим:

n <- 100
dat <- data.frame(x = seq(1,to=100,length.out=n), 
                  y = seq(1,to=2000,length.out=n), 
                  z = seq(1,to=3000,length.out=n), 
                  dateTime = seq(input$dates[1], to=input$dates[2],length.out=n)) 

Я проверил это, и это сработало нормально. До того, как он ошибся и выдал пустой график, когда я изменил дату, а график был пустым. Что я считаю проблемой?

Вот полный код:

library (shiny)
library (shinydashboard)
library (ggplot2)

header <- dashboardHeader(title = "Example")

sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Data Estimation", tabName = "tabset1",
             dateRangeInput("dates", 
                            "Date range for regression",
                            start = as.character(Sys.Date() - 495), 
                            end = as.character(Sys.Date() - 396))
    )))

body <- dashboardBody(
  fluidRow(
    tabBox(id = "tabset1", height = "450px", width = "900px",
           tabPanel("Time Series Est", 
                    plotOutput ("plot1", height = 400,
                                brush = brushOpts(
                                  id = "plot1Brush",
                                  resetOnNew = TRUE)))
    )),
  fluidRow(
    tabBox(id = "tabset1", height = "450px", width = "900px",
           tabPanel("Zoom", 
                    plotOutput ("plot2", height = 400)
           ))))

ui <- dashboardPage(skin = "blue", header, sidebar, body)

server <- function(input, output) ({

  output$plot1 <- renderPlot({

   # dat <- data.frame(x = seq(1,100,1), y = seq(1,2000,20), z = seq(1,3000,30), dateTime = seq(input$dates[1], input$dates[2], 1))
    n <- 100
    dat <- data.frame(x = seq(1,to=100,length.out=n), 
                      y = seq(1,to=2000,length.out=n), 
                      z = seq(1,to=3000,length.out=n), 
                      dateTime = seq(input$dates[1], to=input$dates[2],length.out=n))   
    p <- ggplot() +
      geom_line(data = dat, aes(x = dateTime, y = x, color = "x")) +
      geom_line(data = dat, aes(x = dateTime, y = y, color = "y")) +
      geom_line(data = dat, aes(x = dateTime, y = z, color = "z")) +
      scale_y_log10() +
      theme_bw()
    p

  })

  ranges2 <- reactiveValues(x = NULL, y = NULL)

  observe({
    brush <- input$plot1Brush
    if (!is.null(brush)) {
      ranges2$x <- c(brush$xmin, brush$xmax)
      ranges2$y <- c(brush$ymin, brush$ymax)
    }
    else {
      ranges2$x <- NULL
      ranges2$y <- NULL
    }
  })


  output$plot2 <- renderPlot({

    if (!is.null(ranges2$x)) {
      ranges2$x <- as.Date(ranges2$x, origin = "1970-01-01")
    }
    n <- 100
    dat <- data.frame(x = seq(1,to=100,length.out=n), 
                      y = seq(1,to=2000,length.out=n), 
                      z = seq(1,to=3000,length.out=n), 
                      dateTime = seq(input$dates[1], to=input$dates[2],length.out=n))

    p <- ggplot() +
      geom_line(data = dat, aes(x = dateTime, y = x, color = "x")) +
      geom_line(data = dat, aes(x = dateTime, y = y, color = "y")) +
      geom_line(data = dat, aes(x = dateTime, y = z, color = "z")) +
      coord_cartesian(xlim = ranges2$x, ylim = ranges2$y) +
      scale_y_log10() +
      theme_bw()

    p

  })

})

shinyApp(ui, server)

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

person Mike Wise    schedule 08.01.2016
comment
100/1=100, 2000/20=100, 3000/30=100, а диапазон дат составляет 100 дней. Вы не ответили на вопрос, и все векторы имеют одинаковую длину. Я проверил этот код, прежде чем опубликовать его. В любом случае спасибо. - person Breaker; 09.01.2016
comment
Не после того, как ты его поменяешь. Он выдал ошибку, и тогда график был пуст. Не в этом ли была проблема? Попробуйте и вы увидите. - person Mike Wise; 09.01.2016
comment
Я попробовал ваше решение, и когда я увеличиваю график вверху, у меня все еще есть пустой график внизу. Я никогда не получал сообщения об ошибке, просто пустой график. Это была изначальная проблема. Ответ ниже устранил проблему. На скриншоте не видно, что вы пытались увеличить график сверху. Проблема заключалась в том, что после увеличения вверху график внизу был пустым. Тем не менее, я ценю попытку. Спасибо. - person Breaker; 09.01.2016
comment
Но вы получили сообщение об ошибке на консоли, поэтому у вас пустой график. - person Mike Wise; 09.01.2016
comment
Я опубликую весь свой код. Но я не слишком заморачиваюсь. Удачи тебе с твоим проектом :) - person Mike Wise; 09.01.2016
comment
Обратите внимание, что у меня нет проблем с изменением даты, и я никогда не получаю пустой график. - person Mike Wise; 09.01.2016
comment
В первоначальном вопросе говорилось, что я знаю, что если вы измените дату для этого примера, графики потерпят неудачу. Вы до сих пор не решили проблему. Попробуйте использовать исходный код и на самом деле использовать масштабирование на верхнем графике (не связываясь с датой). Затем попробуйте это с решением ниже (не связываясь с датой). Спасибо хоть. - person Breaker; 09.01.2016
comment
Я понимаю. Меня смутил тот факт, что изменение даты также приводит к тому, что график становится пустым, потому что ваш диапазон дат становится неправильной длины. Исправление этого приводит к тому, что он застревает. Так что это звучало как корень вашей проблемы. - person Mike Wise; 09.01.2016
comment
Я даже не заметил функцию зума :). Хорошая идея. - person Mike Wise; 09.01.2016