r - 如何在 Shiny 中自动显示 "right-size"ggplot?

标签 r ggplot2 shiny

我将 Shiny 与 Likert-library 结合使用,该库输出 ggplot2 对象,以交互方式显示答案分布。用户可以选择要绘制哪组问题(每组有不同数量的问题)以及按哪个问题进行分组。这意味着出现的“条”的数量总体上存在很大差异。

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

enter image description here

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

enter image description here

但是,当我回到一个选项较少的问题时,它们就会变得很拉长,看起来很可笑:

enter image description here

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

最佳答案

据我目前所知,它们并不是让 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))output_width_name 中的 session 参数> 是 output$myPlotOutput 宽度的名称。 output$myPlotOutput 的宽度 session 名称为: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
}

关于r - 如何在 Shiny 中自动显示 "right-size"ggplot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25752529/

相关文章:

从ggplot2中删除某些图例变量和图例值?

r - 如何更改 R 中 ggplot2 中 geom_text 的字体颜色?

R Shiny map 搜索输入框

css - 通过选项卡使侧栏中的输入持久化

r - 使用 ggplot 创建 float 饼图

r - 组 id 内的 data.table

r - 如何使情节标题部分加粗?

r - R中使用marrangeGrob和ggsave的页码位置

r - 更改 ggplot2 中刻度的位置(在绘图内)

javascript - R/Shiny selectInput 小部件大小