为什么这个R ggplot2代码会显示空白显示设备?

时间:2013-06-09 17:55:32

标签: r debugging graphics ggplot2

虽然SO通常不用于帮助修复bug,但这个版本显示出特别简单且特别烦人的行为。如果您是ggplot2用户,则可以在10秒或更短时间内重现。

正如此GitHub问题:ggplot_gtable creates blank display所说,以下代码

library(ggplot2)
stat = qplot(Sepal.Length, Petal.Length, data = iris, color = Species)
ggplot_gtable(ggplot_build(stat))

将生成一个空白设备。请注意,由于ggplot2是图形库,因此某些命令可以显示图形设备以显示相关的图。具体来说,只需运行ggplot_build(stat)即可显示情节。但这并不能解释这种行为。

我不确定如何调试这个(打印语句似乎不合适或有用),ggplot2开发社区似乎正在度假或其他什么,所以如果有任何经验{{1}用户可以提供有关如何有效调试的建议,我将不胜感激。这是一个微不足道但又令人讨厌的bug。每次我运行看起来像代码片段的代码时,它会显示一个空白设备,显示器会切换到该设备,所以我必须先将其点击才能继续。

我可能正在做一些可怕的错误,并且是唯一可以重现此错误的人。由于某些原因我无法想象,这也是正常行为。如果你认为这些事情都是真的,请告诉我。

我在Debian squeeze上使用ggplot2 0.9.3.1(最新版本)。

4 个答案:

答案 0 :(得分:5)

某些网格凹槽具有只能在绘制时解析的单位,也就是说一旦设备窗口打开。例如,这是文本grob的情况,因为它们的大小可以取决于(在最一般情况下)父(s)视口的cexfontsize参数(可以嵌套,等)

library(grid)
widthDetails(textGrob("hi"))

当前版本的ggplot2似乎在代码中使用widthDetails来构建图例grobs(guides_build函数)。可以想象这可以用grobWidth代替,除非grob大小太复杂。

答案 1 :(得分:2)

我想知道它是否与3年前R-Help中的这个帖子有关,来自@ G.Grothendieck的这个解决方法(复制材料如下)

https://stat.ethz.ch/pipermail/r-help/2010-December/263754.html

library(lattice)
library(zoo)

df <- data.frame(y = matrix(rnorm(24), nrow = 6), x = 1:6)
xyplot(zoo(df[1:4], df$x), type = "p")

plot.object <- xyplot(zoo(df[1:4], df$x), type = "p") 
# problem: a Quartz device is opened (on Mac OS X 10.6)

格洛腾迪克在回复中写道:

  

这也会在Windows上打开一个窗口。它发生在格子内   格子发出trellis.par.get时。解决方法是打开   一个指向null的设备。在Windows上这可行。我假设是   你使用“/ dev / null”它可以在你的机器上运行。

png("NUL")
plot.object <- ...
dev.off()

答案 2 :(得分:0)

2019年我仍会在R 3.6.1中遇到此问题。

我缺乏名望,不允许我发表评论。所以我在写另一个答案:

例如,如果您的情节使用非标准字体,则事情会变得有些棘手

library (ggplot2)
stat = qplot(Sepal.Length, Petal.Length, data = iris, color = Species) + 
  theme(text = element_text (family="DejaVu Sans"))

如baptiste的回答所述,需要输出设备才能确定某些文本尺寸。但是,使用非标准字体时,您需要适当的输出设备。如果按浸信徒的说法仅使用pdf(file=NULL),则会得到错误的尺寸(并警告“ DejaVu Sans”已替换为另一种引起错误尺寸的字体)。为了解决这个问题,我必须打开一个能够渲染非标准字体(例如带有临时文件)的输出设备:

cairo_pdf (tempfile (fileext=".pdf"))
grob = ggplot_gtable (ggplot_build (stat))
dummy = dev.off ()

希望此信息有用。

答案 3 :(得分:-1)

问题似乎是由“color = Species”引起的。 如果替换为“group = Species”,则不再有空白显示设备。