使用geom_text和facet_wrap:unit(x, default.units)中的错误:'x'和'units'必须具有长度> 0。

4
我遇到了一个奇怪的错误...
一些测试数据:
library(ggplot2)
library(dplyr)

test <- structure(list(group = structure(c(1L, 2L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 3L, 3L, 3L, 3L, 3L), .Label = c("G", "N", "P"), class = "factor"), 
        var = structure(c(1L, 1L, 2L, 3L, 4L, 4L, 4L, 4L, 2L, 2L, 
        2L, 3L, 2L, 2L, 2L, 5L, 5L, 5L, 4L, 5L, 5L, 5L, 5L, 1L, 1L, 
        2L, 1L, 1L, 1L, 3L, 3L, 3L, 5L, 3L, 3L, 3L, 4L, 4L, 4L, 1L, 
        1L, 2L, 2L, 2L, 3L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), 
        group2 = structure(c(3L, 1L, 3L, 3L, 1L, 2L, 3L, 4L, 1L, 
        2L, 3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 2L, 
        3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 
        4L, 1L, 1L, 2L, 3L, 4L), .Label = c("O", "P", "Q", "R"), class = "factor"), 
        cor = c(0.270075198428616, 0.262097140096646, -0.331312784846655, 
        -0.343984945812309, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
        NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
        NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
        NA)), row.names = c(NA, -45L), .Names = c("group", "var", 
    "group2", "cor"), class = "data.frame")

我想制作这个图表:

test %>% 
  ggplot(., aes(x=group2, y=cor)) +
  geom_bar(stat="identity", position="dodge", aes(fill=var, group=var)) +
  geom_text(aes(label = round(cor,2),
                vjust = ifelse(cor >= 0, 0, 1),
                group=var),
            position = position_dodge(width=1)) +
  theme_bw(base_size=18) +
  facet_wrap(~group, scales="free_x")

.. 这导致出现以下错误: Error in unit(x, default.units) : 'x' 和 'units' 必须长度 > 0

然而,没有使用 geom_text 时它可以工作: enter image description here

而且仅使用行1到40也可以工作:

test %>% slice(1:40) %>%
  ggplot(., aes(x=group2, y=cor)) +
  geom_bar(stat="identity", position="dodge", aes(fill=var, group=var)) +
  geom_text(aes(label = round(cor,2),
                vjust = ifelse(cor >= 0, 0, 1),
                group=var),
            position = position_dodge(width=1)) +
  theme_bw(base_size=18) +
  facet_wrap(~group, scales="free_x")

在这里输入图片描述

所以说,在前40行中,group仅有两个级别,而从第41行开始就有了第三个级别。但是这会引起什么错误吗?或者还有其他我没有看到的问题吗?


你使用哪些软件包? - user3710546
@Pascal 抱歉,我编辑了一下,我使用 dplyrggplot2 来完成这个任务。 - erc
你使用这种数据结构有什么原因吗?你的结果变量中有这么多缺失值似乎是聚合的不寻常。 - Heroka
@Heroka 我将数据框中的值填充为NA,以避免不同条形图宽度的问题... - erc
我的回答有帮助吗? - RHA
@RHA 谢谢您的回答,我还没有时间测试它,但下周会测试并反馈! - erc
1个回答

2
错误也会消失,如果您删除facet_wrap,或者如果您的P组不是全部都是NA(例如将cor中的最后一项更改为0.2)。所以显然,如果一个面板为空(只包含NA),geom_text就无法处理它。
如果您真的想要包括空面板,则可以使用以下解决方法: 1. 将空面板中至少1个(或全部?)NA替换为0。条形图长度为0,因此没有问题。 2. 现在您的图表中有一个零标签。通过使用alpha=ifelse(cor == 0, 0, 1),您将使该标签完全透明。
代码:
library(ggplot2)
library(dplyr)
test <- structure(list(group = structure(c(1L, 2L, 1L, 1L, 1L, 1L, 1L, 
                                           1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
                                           2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 
                                           2L, 3L, 3L, 3L, 3L, 3L), .Label = c("G", "N", "P"), class = "factor"), 
                       var = structure(c(1L, 1L, 2L, 3L, 4L, 4L, 4L, 4L, 2L, 2L, 
                                         2L, 3L, 2L, 2L, 2L, 5L, 5L, 5L, 4L, 5L, 5L, 5L, 5L, 1L, 1L, 
                                         2L, 1L, 1L, 1L, 3L, 3L, 3L, 5L, 3L, 3L, 3L, 4L, 4L, 4L, 1L, 
                                         1L, 2L, 2L, 2L, 3L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), 
                       group2 = structure(c(3L, 1L, 3L, 3L, 1L, 2L, 3L, 4L, 1L, 
                                            2L, 3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 2L, 
                                            3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 4L, 1L, 2L, 3L, 
                                            4L, 1L, 1L, 2L, 3L, 4L), .Label = c("O", "P", "Q", "R"), class = "factor"), 
                       cor = c(0.270075198428616, 0.262097140096646, -0.331312784846655, 
                               -0.343984945812309, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                               NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                               NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                               0)), row.names = c(NA, -45L), .Names = c("group", "var", 
                                                                         "group2", "cor"), class = "data.frame")


test %>% 
  ggplot(., aes(x=group2, y=cor)) +
  geom_bar(stat="identity", position="dodge", aes(fill=var, group=var)) +
  geom_text(aes(label = round(cor,2),
                vjust = ifelse(cor >= 0, 0, 1),
                group=var, alpha=ifelse(cor == 0, 0, 1)),
            position = position_dodge(width=1)) +
  theme_bw(base_size=18) +
  facet_wrap(~group, scales="free_x") 

enter image description here

如果您想删除geom_text的图例,只需添加show_guide = FALSE

编辑:如果透明度无法正常工作,@beetroot提出了一个好的替代方法:将alpha=ifelse(cor == 0, 0, 1)替换为size=ifelse(cor == 0, NA, 3))


谢谢,我终于能够测试了。不幸的是我看到了0标签(它们的颜色与网格线的颜色差不多),你知道问题可能是什么吗? - erc
@beetroot。我不知道。如果alpha=0,它们应该完全透明。你是在R/Rstudio中看到它们还是在导出的文件(png/pdf)中看到的? - RHA
无论是在RStudio中还是导出的文件中,图形都应该保持一致。但是你的回答让我想着去尝试一下不同的做法,我尝试了使用 size 代替 alpha size=ifelse(cor == 0, NA, 3)) ,现在它可以用了... - erc
@beetroot:不错的替代方案!如果可以的话,我会将其添加到我的答案中,并注明参考(当然是指你!)。 - RHA

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