虽然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(最新版本)。
答案 0 :(得分:5)
某些网格凹槽具有只能在绘制时解析的单位,也就是说一旦设备窗口打开。例如,这是文本grob的情况,因为它们的大小可以取决于(在最一般情况下)父(s)视口的cex
和fontsize
参数(可以嵌套,等)
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”,则不再有空白显示设备。