我试图使用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。我检查过基础数据不是问题。这是错误情节的屏幕截图:
这一个显示了在完全独立的图上正确绘制的相同数据:
我一直无法弄清楚为什么内部子图没有正确显示。最后一个子图(9999)填充在与内部子图相同的循环中,但它是正确的。我已经确认last.upper.bound
,这与最后一个子图不同,不是问题。