我将 Shiny 与 Likert-library 结合使用,该库输出 ggplot2 对象,以交互方式显示答案分布。用户可以选择要绘制哪组问题(每组有不同数量的问题)以及按哪个问题进行分组。这意味着出现的“条”的数量总体上存在很大差异。
如果我将高度设置保留为自动(默认),图表将变得异常拥挤。
似乎有两种调整高度的方法 - 在 ui.R 中,我可以调整“视口(viewport)”的大小,并且在调用 renderPlot 时,我可以指定图形的高度(如果它高于视口(viewport),有一个滚动条)。如果我指定一个更宽敞的图表,上面的图表看起来很棒:
但是,当我回到一个选项较少的问题时,它们就会变得很拉长,看起来很可笑:
有没有办法让条形具有恒定的宽度,无论有多少条形,并且使图形动态调整大小,而无需我根据元素数量计算具体高度?
最佳答案
据我目前所知,它们并不是让 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]]
}
}
其中 session
是 shinyServer(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/