【问题标题】:Scale and size of plot in RStudio shinyRStudio闪亮中绘图的比例和大小
【发布时间】:2013-07-24 04:57:04
【问题描述】:

相关,但只讨论一般分配的绘图空间,而不是如何直接设置绘图图像大小并然后将其缩放以填充所需空间


我正在创建一个闪亮的网络应用程序,并想设置绘图的大小比例。我的意思是我正在寻找一种方法来为我的绘图设置有限的高度/宽度,然后然后将设置大小的图像缩放到mainPanel( plotOutput ()) 区域。

以此作为shiny之外的示例/类似情况。

x <- 1:10
y <- x^2
png("~/Desktop/small.png", width = 600, height = 400)
plot(x, y)
dev.off()

png("~/Desktop/big.png", width = 1200, height = 800)
plot(x, y)
dev.off()

我无法将图像上传到 SO 并设置大小,因此我将使用以下 html 包含每个浏览器的屏幕截图:

<img src="file:///home/jwhendy/Desktop/file.png" width = "800px" />

这是我的 1600 x 900 像素笔记本电脑上的全宽屏幕截图。

我想控制图像本身的大小,因为在使用 colour = varsize = var 等选项时,我发现 ggplot2 图例非常小。还要注意从大局中读取轴标签的难度。我意识到由于像素有限,我可能会遇到图像尺寸无法很好缩放的情况,但我认为在遇到这种情况之前我至少有一些空间可以移动。

有什么建议吗?到目前为止,我已经尝试过使用以下内容,但没有运气:

ui.R

shinyUI(pageWithSidebar(

headerPanel("Title"),

  sidebarPanel(),

  mainPanel(

     plotOutput(outputId = "main_plot", width = "100%"))

  ))

server.R

shinyServer(function(input, output) {

  x <- 1:10
  y <- x^2

  output$main_plot <- renderPlot({

    plot(x, y) }, height = 400, width = 600 )
} )

似乎server.R 中指定的高度/宽度选项覆盖了我在ui.RplotOutput 部分中设置的任何内容。

有没有办法使绘图图像的大小保持较小以保持可读性,同时仍然填充所需的mainPanel 区域?

【问题讨论】:

  • 更好的方法是控制绘制点和文本的大小,而不是试图通过图像大小来实现。您是否尝试过设置 cex 选项?

标签: r size rstudio shiny


【解决方案1】:

不确定这是否能完全满足您的需求,但这对我有用。

Server.R 中指定的选项确实生效了。 (我只是分别绘制了两张不同大小的图表。)我还采纳了@Manetheran 的建议,并将 cex 和 cex.axis 设为参数。他们似乎在工作。

以下是完整应用的代码,以及一张屏幕截图。

###UI.R
shinyUI(pageWithSidebar(


  headerPanel("Title"),
  
  sidebarPanel(
    sliderInput(inputId = "opt.cex",
            label = "Point Size (cex)",                            
                min = 0, max = 2, step = 0.25, value = 1),
  sliderInput(inputId = "opt.cexaxis",
              label = "Axis Text Size (cex.axis)",                            
              min = 0, max = 2, step = 0.25, value = 1) 
),
        
  mainPanel(
    plotOutput(outputId = "main_plot",  width = "100%"),
    plotOutput(outputId = "main_plot2", width = "100%")
  )
))
        

###Server.R
shinyServer(function(input, output) {


  x <- 1:10
  y <- x^2
    
  output$main_plot <- renderPlot({    
    plot(x, y)}, height = 200, width = 300)


  output$main_plot2 <- renderPlot({
    plot(x, y, cex=input$opt.cex, cex.lab=input$opt.cexaxis) }, height = 400, width = 600 )
} )

更新重新。 UI.R 中的 Width=100% 选项

是的,就我而言,这肯定会有所作为。在下面的两行中,new_main_plot 和 new_main_plot2 是相同的,但是它们以不同的大小呈现。所以width 选项确实生效了。

 mainPanel(
    plotOutput(outputId = "new_main_plot",  width = "100%"),
    plotOutput(outputId = "new_main_plot2", width = "25%")
  )

希望对您有所帮助。

【讨论】:

  • 您认为width = 100% 选项对ui.R 有什么作用吗?看起来它只是renderPlot() 中指定的大小,无论如何?不管怎样,我认为这会奏效。我使用来自baseplot() 命令,但实际上使用ggplot2(没想到plot 特定的解决方案。我认为THIS 将允许我做同样的事情。多打字。 ..但我认为它应该工作。谢谢!
  • @Hendy 更新了我的回复。是的,宽度确实有所不同。
  • 感谢您试用(我应该这样做)。我做了一堆快速组合并使用检查元素来查看他们在生成的 html 中做了什么。我用结果编辑了我的答案,以帮助其他人对此进行调查。再次感谢!
  • 绘图的宽度或高度是否可以自动调整为窗口大小?
【解决方案2】:

@Ram 的回答非常适合 base 绘图实用程序。

只是为了扩展其他路人,用ggplot来做这个:

p <- ggplot(data, aes(x = x, y = y)) + geom_point()
p <- p + theme(axis.text = element_text(size = 20)) # tweak size = n until content
print(p)

至少有这样的效果,这取决于你想要什么。基本思想见this question,但请参考当前ggplot2 0.9.3 文档中关于设置文本选项的信息——您可以指定轴文本、图例文本、facet_grid 条形文本等。

自上一个 SO 问题以来,规范已从 opts([option] = theme_text(size = n)) 更改为 theme([option] = element_text(size = n))。它可能会再次改变......所以只需找到ggplot2 的当前测试/主题/选项页面。


根据@Ram 的后续行动,我进一步玩了一些游戏,并认为我了解ui.Rserver.R 如何交互设置不同的选项并查看Chromium 中的Inspect element

ui.R 设置可以填充的可用绘图区域,server.R 定义绘图大小。

  • ui.R: 宽度 = 100%,server.R:没有设置选项

  • ui.R: 宽度 = 100%,server.R:宽度 = 800,高度 = 600

  • ui.R: 宽度 = 50%,server.R:宽度 = 800,高度 = 600

  • ui.R: 宽度 = 200%,server.R:宽度 = 800,高度 = 600

为了明确回答这个问题,我只需要看到最后一个。如果您复制设置,您将看到绘图区域&lt;div&gt; 确实是屏幕宽度的 200%,并在浏览器中创建了一个水平滚动条......但是图像仍然是固定大小。

但是,您可以生成大于绘图区域(以像素为单位)的图像,然后通过ui.R 将其缩小并指定width = n % 选项。

所以...我不能以像素为单位创建更小的图像(这会创建相对于整体图更大的文本大小),然后使其更大以具有更大的文本。确实,需要创建一个绘图区域大小(或更大)的图形,并通过绘图(或 ggplot)命令本身将文本缩放至满意。

至少目前还不能为server.R 中的宽度指定百分比,大概是因为它将高度/宽度选项传递给png() 命令来生成图像。尝试这样做会出错(但值得一试)。

我不同意指定文本大小选项比我所寻找的更简单的方法,但至少我有一些可行的方法。我一直在使用pdf("file.pdf", width = 8, height = 6) 对 LaTeX 文档进行“作弊”,创建我的绘图,然后在将其包含在 .tex 文件中时按我想要的方式缩放它。在我看来,这比在每个情节上都使用theme(axis.text = element_text(size = x)) 要简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2019-02-12
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2021-12-24
    相关资源
    最近更新 更多