3

我认为,我的问题是这类问题的边缘案例。话虽如此,我在这里有一些可重现的代码,可能会帮助很多有类似问题的人,特别是在 RShiny 中更改 ggplot 的绘图高度(默认设置为 400px)的问题。

这是一个闪亮应用程序的演示,其中 ggplot 的高度设置为等于 ggplot 的宽度:

mydf = data.frame(x = 1:5, y = 1:5)

# User Interface
# =================
ui <- fluidPage(theme = shinytheme('united'),
                fluidRow(
                  column(width = 12, align = 'center',
                         plotOutput('myplot', height = 'auto')
                  )             
))
# ====

# Server Code 
# ==============
server <- shinyServer(function(input, output, session) {

  # 3. Create the chart
  # ===-===-===-===-===-===
  output$myplot <- renderPlot({

    ggplot(mydf, aes(x = x, y = x)) + geom_point()
  }, height = function() { session$clientData$output_myplot_width })
})
# ====

shinyApp(ui, server)

通过启动这个闪亮的应用程序来调整窗口的宽度。通过在 UI 中设置height = 'auto',然后在 Server 中设置height = function() { session$clientData$output_myplot_width },高度会动态更新。确实非常好。

我正在处理类似的事情,但是我有一个重要的限制是我目前需要将高度和宽度的参数传递给我的 plotly() 调用,因为我试图以非常具体的方式显示标记在我的阴谋上。我正在尝试做的一个例子是这样的:

mydf <- data.frame(x = 1:5, y = 1:5)
myplotlyfunction <- function(mydf, myplotheight) {
  plot_ly(mydf, height = myplotheight, width = myplotheight * 1.2) %>%
    add_trace(x = ~x, y = ~y, type = 'scatter', mode = 'markers')
}

# User Interface
# =================
ui <- fluidPage(theme = shinytheme('united'),
                fluidRow(
                  column(width = 12, align = 'center',
                         plotlyOutput('myplotly')
                  )
))
# ====

# Server Code
# ==============
server <- shinyServer(function(input, output, session) {

  # 3. Create the chart
  # ===-===-===-===-===-===
  output$myplotly <- renderPlotly({

    this.height <- 600
    myplotlyfunction(mydf, myplotheight = this.height)

  })
})
# ====

shinyApp(ui, server)

我需要将高度和宽度参数传递给 plot_ly() 调用的具体原因是值得自己发表一篇文章,不幸的是我还没有想到解决方法。这是我的 plot_ly 输出的真实示例-

在此处输入图像描述

在高层次上,plot_ly 散点图的标记大小参数根据像素设置标记大小,我的绘图需要非常特定大小的标记,因此这些标记大小是绘图大小的函数。

尽管最初必须将固定参数传递给 plot_ly 高度,但这是我尝试在 Shiny 中使我的 plot_ly 绘图动态化的尝试。这个想法是基于最初的 ggplot() 动态高度函数:

mydf <- data.frame(x = 1:5, y = 1:5)
myplotlyfunction <- function(mydf, myplotheight) {
  plot_ly(mydf, height = myplotheight, width = myplotheight * 1.2) %>%
    add_trace(x = ~x, y = ~y, type = 'scatter', mode = 'markers')
}

# User Interface
# =================
ui <- fluidPage(theme = shinytheme('united'),
                fluidRow(
                  column(width = 12, align = 'center',
                         plotlyOutput('myplotly', height = 'auto')
                  )
                ))
# ====

# Server Code
# ==============
server <- shinyServer(function(input, output, session) {

  # 3. Create the chart
  # ===-===-===-===-===-===
  output$myplotly <- renderPlotly({

    this.height <- function() { session$clientData$output_myplotly_width }
    myplotlyfunction(mydf, myplotheight = this.height)

  }, height = function() { session$clientData$output_myplotly_width })
})
# ====

shinyApp(ui, server)

这不起作用,实际上应用程序立即崩溃。

非常感谢任何完成这篇文章的人。鉴于 plot_ly 函数本身需要一个高度参数,我可以根据应用程序窗口的高度或宽度在 R Shiny 中动态调整 plot_ly() 图的大小,任何帮助表示赞赏。关于如何解决首先需要高度参数到 plot_ly() 的潜在问题的想法也很受欢迎,但这是一个单独的问题(我已经发布了关于我自己的问题,在这里 -根据坐标值设置标记大小,不是像素,在情节 R和其他帖子中也是如此)。

再次感谢您的帮助!

4

0 回答 0