【问题标题】:How to automatically "right-size" ggplot in Shiny?如何在 Shiny 中自动“调整大小”ggplot?
【发布时间】:2014-11-03 08:11:46
【问题描述】:

我将 Shiny 与输出 ggplot2 对象的 likert-library 一起使用,以交互方式显示答案分布。用户可以选择要绘制的问题组(每个组有不同数量的问题),以及要分组的问题。这意味着总体上出现的“酒吧”数量差异很大。

如果我将高度设置保留为自动(默认),图表将变得非常拥挤。

似乎有两种调整高度的方法——在ui.R中,我可以调整“视口”的大小,在对renderPlot的调用中,我可以指定图形的高度(如果高于视口,有一个滚动条)。如果我指定一个更宽敞的图表,上面的图表看起来很棒:

但是,当我回到一个备选方案较少的问题时,它们会变得看起来很荒谬:

有没有办法让条形图具有恒定的宽度,无论它们有多少,并且让图表动态调整大小而无需我根据元素的数量计算特定的高度?

【问题讨论】:

  • 你说的是R还是Rstudio中的图形设备窗口?还是您以某种方式将这些保存到光盘? “情节”实际上没有任何高度,它只是填充了您渲染它的设备。因此,您需要共享用于实际绘制绘图的代码。你在使用renderPlot 还是什么?
  • 在 Shiny 中,我使用的是 renderPlot,没有特定的高度,或者 height=900。

标签: r ggplot2 shiny


【解决方案1】:

据我目前所知,它们不是让renderPlot({})“自动”为您的 ggplot 对象(或任何其他 R 绘图对象)“找到”正确高度的默认方式。 “正确”高度有些主观,因此您必须自己手动计算高度。可能有一些包试图做到这一点,但即使存在这样的事情,我认为你更喜欢创建自己的自定义“算法”来找到合适的高度。对于许多情况,此算法仅取决于在您的情节中产生狭窄感觉的方面分组的数量。只需这样做:

output$myPlotOutput <- renderPlot({
  myGGPlotCode
}, height = myHeightAlgorithm())

myHeightAlgorithm() 返回一个以像素为单位的高度数字(请参阅?renderPlot() height 参数。

但是,您可以在 Shiny 文档中轻松找到上述解决方案。根据我的经验,您应该做的是使用以下“算法”

set_shiny_plot_height <- function(session, output_width_name){
   function() { 
     session$clientData[[output_width_name]] 
   }
}

其中sessionshinyServer(function(input, output, session)) 中的session 参数,output_width_nameoutput$myPlotOutput 宽度的名称。 output$myPlotOutput的宽度会话名称为:output_myPlotOutput_width

即你应该使用set_shiny_plot_height(session, "output_myPlotOutput_width") 代替myHeightAlgorithm()

最终,上面的代码将创建一个正方形图(因为我的高度等于宽度)。但是,我建议提取宽度并结合您的高度算法以考虑绘图输出的宽度。您应该始终让您的对象响应 Web 应用程序的宽度变化。

set_shiny_plot_height_with_respects_to_width <- function(session, output_width_name){
   width <- function() { 
     session$clientData[[output_width_name]] 
   }
   # Do something with the width
   width / 2
}

【讨论】:

  • 这太棒了,谢谢!我如何应对宽度的变化?
  • 答案:session$clientData$output_myPlotOutput_width 可以用作反应变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多