如何使用ggrepel抑制警告信息

10

ggrepel 可以通过将标签彼此之间的距离推开来避免标签重叠。
该算法取决于视窗大小,当窗口大小改变时会触发回调函数。
如果算法无法避免给定窗口大小的重叠,则会发出警告:

Warning messages:
1: ggrepel: 178 unlabeled data points (too many overlaps). Consider increasing max.overlaps

我希望能够抑制这些警告,无论 max.overlaps 的值如何,因为它们可能会延迟并失去上下文。
延迟的原因可能是第一次打印后的回调或更改查看窗口宽度后的回调,如下例所示:
library(ggplot2)
library(ggrepel)

N <- 50
data <- data.frame(x=1:N,y=rep(1,N),label =  paste0("Text",1:N))

ggplot(data)+
  geom_point(aes(x=x,y=y))+
  geom_text_repel(aes(x=x,y=y,label=label),hjust=0, vjust=0, box.padding = 0.5, max.overlaps = 20)

# If the viewing window width is OK, no warning!

#  Execute anything in console
1
#[1] 1
# This is OK!

enter image description here

# Now reduce window width with mouse

# No warning yet

# Execute anything in console
1
# Warning messages:
#   1: ggrepel: 41 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 2: ggrepel: 41 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 3: ggrepel: 41 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 4: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 5: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 6: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 7: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 8: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
# 9: ggrepel: 47 unlabeled data points (too many overlaps). Consider increasing max.overlaps 
#[1] 1

enter image description here

我尝试了suppressWarningswithCallingHandlers,但都没有用:
withCallingHandlers(
  suppressWarnings(ggplot(data)+
    geom_point(aes(x=x,y=y))+
    geom_text_repel(aes(x=x,y=y,label=label),hjust=0, vjust=0, box.padding = 0.5, max.overlaps = 20)
    )
,  warning=function(w) {
  if( any( grepl( "ggrepel", w) ) ) invokeRestart( "muffleWarning" )
})

我猜 g <- ggplot...; print(suppressWarnings(g)) 不是一个好的选择? - Sirius
@Sirius,不幸的是这并不足够,可能是由于回调函数! - Waldi
@Waldi,我可能有解决方案:我正在开发一个尚未公开的R包,其中一个函数专门用于处理绘制ggplot2图时的警告。 如果您希望访问并尝试该函数,请在此处分享您的Github用户名,以便我可以授权您访问。 - Yoann Pageaud
1
@Yoann,感谢您的建议。我尝试了assign("last.warning", NULL, envir = baseenv()),它确实可以清除警告,这样我们就可以控制它们何时发生。但是,这并没有禁用它们,当ggrepel图的窗口大小改变时,需要进行新的刷新。 - Waldi
@YoannPageaud,感谢您提供的链接,我会跟进这个问题。我的GitHub用户名是Waldi73 - Waldi
显示剩余3条评论
2个回答

0

您可以通过设置最大重叠来实现此操作:

options(ggrepel.max.overlaps = Inf)

谢谢你的回答。我知道max.overlaps,但我的问题是“我想抑制这些警告,而不管max.overlaps的值如何”,因为允许Inf会使输出在小窗口上非常难以阅读。 - Waldi

0

您可以通过以下方式设置全局警告级别来忽略警告信息:
options(warn=-1)


谢谢您的回答。不过我不确定它是否回答了我的问题:我想要移除延迟的 ggreprel 警告,而不是所有警告。 - Waldi
你需要一直保留图形吗?为什么不在打印完图形后使用dev.off()关闭它呢?否则,我可能会转向knitr/rmarkdown来避免这个问题。 - CyG
“warn”选项不足以避免所描述的行为。当然,删除图表可以消除警告问题,但问题是如何避免在这个特定的ggrepel对象上出现警告。 - Waldi

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