使用R Shiny中的Plotly动态创建子图

时间:2016-06-26 18:26:47

标签: r shiny plotly

我试图使用Plotly创建一个R Shiny应用程序,该应用程序动态填充共享x轴的一组子图。每个子图对应于数据UserID列中的唯一值。有问题的代码:

valid.directories <- get.valid.directories()
num.ids <- length(valid.directories)
# for subplot domain scaling
fraction <- 100 / num.ids

output[["plot1"]] <- renderPlotly({
    # populate first subplot
    p <- plot_ly(selected.data(), x = Timestamp[which(as.integer(valid.directories[1]) == as.integer(UserID))], y = Name[which(as.integer(valid.directories[1]) == as.integer(UserID))], xaxis = "x1", yaxis = "y1", mode = "markers")
    # accumulate arguments for layout call
    args.names <- c("showlegend", "xaxis", "yaxis")
    for (i in 2:num.ids) {
        args.names <- c(args.names, paste0("yaxis", i))
    }
    args <- vector("list", length(args.names))
    names(args) <- args.names
    args[["showlegend"]] <- FALSE
    args[["xaxis"]] <- list(title = "")
    args[["yaxis"]] <- list(anchor = 'x', domain = c(0, (fraction - (fraction / 10)) / 100), title = valid.directories[1])
    for (j in 2:num.ids) {
        p <- add_trace(p, x = Timestamp[which(as.integer(valid.directories[j]) == as.integer(UserID))], y = Name[which(as.integer(valid.directories[j]) == as.integer(UserID))], xaxis = "x1", yaxis = paste0("y", j), mode = "markers")
        if (j == num.ids) {
            last.upper.bound <- 1
        } else {
            last.upper.bound <- (fraction * j - (fraction / 10)) / 100
        }
        args[[paste0("yaxis", j)]] <- list(anchor = 'x', domain = c((fraction * (j - 1) + (fraction / 10)) / 100, last.upper.bound), title = valid.directories[j])
    }
    # populate additional subplots
    p <- do.call(layout, c(p, args))
    p
})

它几乎可以工作,但只有第一个和最后一个子图正确填充。出现内部子图,但不显示任何数据,其y轴域为0-4而不是正确的值,AC,EOD和RT。我检查过基础数据不是问题。这是错误情节的屏幕截图:

incorrect

这一个显示了在完全独立的图上正确绘制的相同数据:

correct

我一直无法弄清楚为什么内部子图没有正确显示。最后一个子图(9999)填充在与内部子图相同的循环中,但它是正确的。我已经确认last.upper.bound,这与最后一个子图不同,不是问题。

0 个答案:

没有答案