3

虽然 SO 通常不用于帮助解决错误,但它显示了特别简单且特别烦人的行为。如果您是ggplot2用户,您可以在 10 秒或更短的时间内复制它。

正如这个 GitHub 问题:ggplot_gtable 创建空白显示所说,以下代码

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

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

我不确定如何调试这个(打印语句似乎并不合适或有用),并且ggplot2开发社区似乎正在休假或其他什么,所以如果任何有经验的R用户可以提供有关如何有效调试的建议,我会很感激的。这是一个微不足道但非常烦人的错误。每次我运行看起来像代码片段的代码时,它都会显示一个空白设备,显示器会将焦点切换到该设备,因此我必须先单击它才能继续。

我可能做错了什么,并且是唯一可以重现此错误的人。出于某种我无法想象的原因,这也可能是正常行为。如果您认为其中任何一个是真的,请告诉我。

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

4

4 回答 4

5

一些网格 grobs 的单位只能在绘图时解析,也就是说,一旦设备窗口打开。例如,文本 grobs 就是这种情况,因为它们的大小可以取决于(在最一般情况下)父视口(可以嵌套等)的cex和参数fontsize

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

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

于 2013-06-09T20:31:04.720 回答
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 上打开一个窗口。当 lattice 发出 trellis.par.get 时,它发生在 lattice 内。一种解决方法是打开一个指向 null 的设备。在 Windows 上,这会起作用。我假设如果你使用“/dev/null”它会在你的机器上工作。

png("NUL")
plot.object <- ...
dev.off()
于 2013-06-09T21:07:58.140 回答
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)按照 baptiste 所说的那样使用 a,那么您会弄错尺寸(并警告说“DejaVu Sans”被另一种导致错误尺寸的字体取代)。为了解决这个问题,我必须打开一个能够呈现非标准字体的输出设备(比如一个临时文件):

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

希望这些信息有用。

于 2019-11-06T21:46:51.833 回答
-1

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

于 2013-08-01T06:01:53.913 回答