如何在ggplot中控制画布的大小?

12

考虑这个简单的ggplot:

enter image description here

我在它周围画了一个黑边,这样更容易想象它有多大。

我不明白为什么这个图这么大。我在我的代码中没有告诉ggplot我想要任何在图形上方或下方的区域。

每次看到这都会让我很困扰。我如何控制ggplot中的画布大小?

library(ggplot2)

hex=c("#CC0000", "#90BD31", "#178CCB")    

q <- ggplot(data=NULL)
    q <- q + geom_rect(data=NULL, aes(xmin=0, xmax=1, ymin=0.5, ymax=1.5), fill=hex[1])
    q <- q + geom_rect(data=NULL, aes(xmin=1.5, xmax=2.5, ymin=0.5, ymax=1.5), fill=hex[2])
    q <- q + geom_rect(data=NULL, aes(xmin=3, xmax=4, ymin=0.5, ymax=1.5), fill=hex[3])
    q <- q + annotate("text", x=.5, y=0.1, label='Impaired', size=4)
    q <- q + annotate("text", x=2, y=0.1, label='Normal', size=4)
    q <- q + annotate("text", x=3.5, y=0.1, label='Optimal', size=4)
    q <- q + coord_fixed()
    q <- q + theme_classic()
    q <- q + theme(axis.line=element_blank(),
                   axis.text.x=element_blank(),
                   axis.text.y=element_blank(),
                   axis.ticks=element_blank(),
                   axis.title.x=element_blank(),
                   axis.title.y=element_blank(),
                   panel.background=element_blank(),
                   panel.border=element_blank(),
                   panel.grid.major=element_blank(),
                   panel.grid.minor=element_blank(),
                   plot.background=element_blank())
    q

我一直认为获得一致的画布和所有其他尺寸的关键是直接控制图形输出设备。使用png(),pdf()或其他偏好的工具打开它,并明确将其尺寸设置为像素、厘米或英寸,以适应您的需要。如果需要进一步帮助,就需要提供一个可完全重现的数据示例,而您在上面未提供(十六进制缺失)。 - Forrest R. Stevens
抱歉关于缺少的 hex,我会添加它。我同意你的观点。我没有提到的是,这个 ggplot 正在一个 Shiny 应用程序中使用。因此,我不能像你建议的那样以其他合理的方式控制图形输出设备。另外,除了 hex 之外,其他所有内容都应该是可重现的。 - tumultous_rooster
shiny::plotOutputshiny::renderPlot都接受高度和宽度参数... - Gregor Thomas
他们可以...但这只会将我的不必要的大画布挤压成一些高度和宽度。由于ggplot提供的额外白色空间将保留。现在,如果我从我的画布中删除额外的空白区域,那么您的建议将解决可能出现的任何其他大小问题。 - tumultous_rooster
感谢您的修复。我仍然坚持我的评论,即您可以调整高度并清除大部分空白区域问题。其余的边界是您标准的内部边距,可以使用plot.margin主题选项进行设置。虽然我不知道这与闪亮交互时会有什么影响。 - Forrest R. Stevens
1个回答

10

使用ggplot2 plot.margin或panel.margin主题选项,一旦你充分设置了画布的输出尺寸,就应该能够控制内部边距。这对于常规图形设备肯定有效,也应该在闪亮应用程序中起作用:

library(ggplot2)
library(grid)

hex=c("#CC0000", "#90BD31", "#178CCB")    

q <- ggplot(data=NULL)
    q <- q + geom_rect(data=NULL, aes(xmin=0, xmax=1, ymin=0.5, ymax=1.5), fill=hex[1])
    q <- q + geom_rect(data=NULL, aes(xmin=1.5, xmax=2.5, ymin=0.5, ymax=1.5), fill=hex[2])
    q <- q + geom_rect(data=NULL, aes(xmin=3, xmax=4, ymin=0.5, ymax=1.5), fill=hex[3])
    q <- q + annotate("text", x=.5, y=0.1, label='Impaired', size=4)
    q <- q + annotate("text", x=2, y=0.1, label='Normal', size=4)
    q <- q + annotate("text", x=3.5, y=0.1, label='Optimal', size=4)
    q <- q + coord_fixed()
    q <- q + theme_classic()
    q <- q + theme(axis.line=element_blank(),
                   axis.text.x=element_blank(),
                   axis.text.y=element_blank(),
                   axis.ticks=element_blank(),
                   axis.title.x=element_blank(),
                   axis.title.y=element_blank(),
                   panel.background=element_blank(),
                   panel.border=element_blank(),
                   panel.grid.major=element_blank(),
                   panel.grid.minor=element_blank(),
                   plot.background=element_blank(),
                   plot.margin=unit(c(0,0,0,0), "cm"),
                   panel.margin=unit(c(0,0,0,0), "cm"))
    q

无边距输出


我刚收到一条警告信息:panel.margin已被弃用,请使用panel.spacing属性代替。 - KiriSakow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接