64

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


我正在创建一个闪亮的网络应用程序,并想设置绘图的大小比例。我的意思是我正在寻找一种方法来为我的绘图设置一个有限的高度/宽度,然后将该设置大小的图像缩放到该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 像素笔记本电脑上的全宽屏幕截图。

小的 小图片

大的 大图

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

有什么建议么?到目前为止,我已经尝试过玩以下游戏,但没有运气:

用户界面

shinyUI(pageWithSidebar(

headerPanel("Title"),

  sidebarPanel(),

  mainPanel(

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

  ))

服务器.R

shinyServer(function(input, output) {

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

  output$main_plot <- renderPlot({

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

似乎在中指定的高度/宽度选项server.R覆盖了我plotOutputui.R.

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

4

2 回答 2

43

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

中指定的选项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 )
} )

在此处输入图像描述

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

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

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

希望有帮助。

于 2013-07-24T17:59:38.633 回答
19

@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)

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

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


根据@Ram 的跟进,我进一步玩了一些游戏,并认为我了解如何设置不同的选项ui.Rserver.R进行交互,并查看Inspect elementChromium 中的内容。

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

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

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

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

于 2013-07-24T19:24:33.357 回答