奇怪的ggplot2错误:空栅格

29

为什么会

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(1.5,1.5)),aes(x=x,y=y,color=z)) +
geom_point()

请给我错误信息

Error in grid.Call.graphics(L_raster, x$raster, x$x, x$y, x$width, x$height, : Empty raster

但以下两个图表可以工作

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(2.5,2.5)),aes(x=x,y=y,color=z)) +
geom_point()
ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(1.5,2.5)),aes(x=x,y=y,color=z)) +
geom_point()

我正在使用ggplot2 0.9.3.1版本。


@N8TRO 不幸的是,我不能选择这种方法,因为我的数据并不总是具有单个唯一的 z 值,而我需要将该变量映射到连续的颜色比例尺。 - Ben
当您的颜色美学中只有一个值时,问题出在颜色比例尺上吗?这在我的ggplot2:0.9.3.1中全部运作正常 - 您的网格版本是多少?我使用的是3.0.2(来自R 3.0.2)。 - Spacedman
@Spacedman 当我的z值为1.5时,出现了错误。如果我的z值不是1.5,则可以正常工作。我使用的是3.0.3网格。 - Ben
2
在这里提交了一个报告 https://github.com/hadley/ggplot2/issues/943 - Ben
1
我发现ggplot2_1.0.0也出现了同样的错误。 - Paulo E. Cardoso
显示剩余5条评论
3个回答

7

简而言之:检查你的数据——你真的想使用连续的颜色比例尺,只有一种可能的颜色值吗?

如果在图表中添加+ scale_fill_continuous(guide=FALSE),就不会出现此错误。(这将关闭图例。)

ggplot(data.frame(x=c(1,2), y=c(1,2), z=c(1.5,1.5)), aes(x=x,y=y,color=z)) +
  geom_point() + scale_color_continuous(guide = FALSE)

出错似乎是在连续色标只使用一种颜色的情况下触发的。当前的 GitHub 版本已经包含了相关的 pull request。请通过以下方式进行安装:

devtools::install_github("hadley/ggplot2")

但更有可能是数据存在问题:为什么只有一个值,你会使用连续的颜色比例尺呢?


1
在我的情况下,我正在使用循环为200个国家创建标准化的图表。大多数国家行为良好,因此使用连续比例尺,但其中一个国家恰好只有所有变量的一个值,这导致了错误。拉取请求运作得非常好。 - Amit Kohli
@AmitKohli:你的情况很有道理。很高兴这个PR对你有用。 - krlmlr
请注意,github分支已不再可用(似乎是作者删除了)。它在我的类似应用中运行良好(除了我需要生成约5000个图),但是在最近升级R之后,该补丁已经消失,现在又回到了无法使用的状态。叹气 - user3396385
@user3396385:https://github.com/hadley/ggplot2/pull/1077上说已经合并到'master'分支,但可能还没有发布到CRAN。请尝试使用`devtools :: install_github("hadley/ggplot2")`命令安装。如果可以,请告诉我,这样我就可以编辑答案了。 - krlmlr
@krlmlr:感谢您的建议!从Github安装ggplot2解决了问题。干杯! - user3396385

4

除了1.5之外,我遇到了“空栅格”错误的相同行为。

请尝试以下操作:

ggplot(data.frame(x=c(1,2),y=c(1,2),z=c(0.02,0.02)),aes(x=x,y=y,color=z))
+ geom_point()

您再次遇到了相同的错误(尝试使用0.9.3.1和1.0.0.0版本),因此看起来这是一个讨厌且奇怪的错误。


0

这绝对听起来像是一个边缘情况,更适合作为错误报告提交,正如其他人所提到的,但这里有一些通用代码,可能对某些人作为笨拙的解决方法或处理标签/颜色很有用。它绘制了一个重新缩放的变量,并使用实际值作为标签。

require(scales)
z <- c(1.5,1.5)
# rescale z to 0:1
z_rescaled <- rescale(z)
# customizable number of breaks in the legend
max_breaks_cnt <- 5
# break z and z_rescaled by quantiles determined by number of maximum breaks 
#  and use 'unique' to remove duplicate breaks
breaks_z <- unique(as.vector(quantile(z, seq(0,1,by=1/max_breaks_cnt))))
breaks_z_rescaled <- unique(as.vector(quantile(z_rescaled, seq(0,1,by=1/max_breaks_cnt))))
# make a color palette
Pal <- colorRampPalette(c('yellow','orange','red'))(500)
# plot z_rescaled with breaks_z used as labels
ggplot(data.frame(x=c(1,2),y=c(1,2),z_rescaled),aes(x=x,y=y,color=z_rescaled)) +
  geom_point() + scale_colour_gradientn("z",colours=Pal,labels = breaks_z,breaks=breaks_z_rescaled)

这个话题有点偏离,但是我喜欢使用重新缩放的方法将大量的变化变量发送到像这样的函数中:

colorfunction <- gradient_n_pal(colours = colorRampPalette(c('yellow','orange','red'))(500),
                            values = c(0:1), space = "Lab")
colorfunction(z_rescaled)

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