条形图中有一个条形位置错误 (ggplot2)

3

我将制作一个双面条形图,但是似乎有一个单独的条形无法正确放置。这是右侧面板上部的条形。它填充为TR,但却占据了TL的位置。

数据如下:

DATA2=structure(list(A = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("For", "Par"), class = "factor"), 
B = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("TL", "TR"), class = c("ordered", 
"factor")), C = structure(c(1L, 4L, 4L, 1L, 1L, 1L, 4L, 1L, 
1L, 1L, 1L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 4L, 1L, 5L, 1L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 5L, 1L, 1L, 1L, 1L, 1L, 
5L, 1L, 1L, 1L, 1L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 3L, 4L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 5L, 4L, 1L, 4L, 5L, 1L, 1L, 1L, 1L, 1L, 3L, 5L, 
3L, 4L, 4L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 1L, 1L, 
3L, 1L, 4L, 1L, 1L, 1L, 1L, 2L, 4L, 1L, 1L, 3L, 1L, 1L, 1L, 
5L, 4L, 1L, 4L, 5L, 1L, 1L, 1L, 1L, 4L, 2L, 1L, 4L, 1L, 1L, 
1L, 1L, 2L, 4L, 5L, 1L, 1L, 5L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
1L, 1L, 1L, 5L, 1L, 4L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 2L, 1L, 
1L, 4L, 1L, 1L, 1L, 5L, 1L, 4L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
4L, 4L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 4L, 1L, 3L, 1L, 1L, 1L, 3L, 5L, 3L, 1L, 1L, 
4L, 1L, 1L, 1L, 5L, 1L, 4L), .Label = c("0-2", "2-4", "4-6", 
"6-8", "8-10"), class = c("ordered", "factor"))), row.names = c(NA, 
-240L), class = "data.frame")

代码如下:
ggplot(DATA2, aes(x=C,fill=B)) +
  geom_bar(position = position_dodge(width = -0.9, preserve = "single")) +
  facet_grid(.~A) +
  theme_bw() + 
  scale_fill_manual(values = c("grey","grey40")) + 
  coord_flip()

enter image description here

右侧面板上部的小条形(数量=1)位置错误,但填充是正确的。有什么提示吗?谢谢!

1个回答

3
您的数据中存在一些变量值的组合,例如c("Par","TL","8-10")c("Par", "TR", "2-4")。当您使用geom_bar(stat = "count")时(这是默认值),ggplot2似乎不会生成其中计数为0的组合。对于每个配对,条形图从上到下呈现。当其中一个计数不存在时,另一个计数将呈现在条形图的顶部。

我们可以在这个简单的例子中看到相同的情况:

library(dplyr)
library(tidyr)
library(ggplot2)

df <- data.frame(A = rep(c("Group 1","Group 2"),each=3),
                 B = c("possum",rep("dog",2),rep("possum",3)))

df
#>         A      B
#> 1 Group 1 possum
#> 2 Group 1    dog
#> 3 Group 1    dog
#> 4 Group 2 possum
#> 5 Group 2 possum
#> 6 Group 2 possum

ggplot(df, aes(x=A,fill=B)) +
  geom_bar(position = position_dodge(width = -0.9, preserve = "single"))

解决这个问题的方法是手动计数:

df_tally <- df %>% 
  group_by(A,B) %>% 
  tally() %>% 
  ungroup()

df_tally
#>   A       B          n
#> 1 Group 1 dog        2
#> 2 Group 1 possum     1
#> 3 Group 2 possum     3

我们需要添加缺失的组合:
df_tally <- complete(df_tally, A, B)

df_tally
#>   A       B          n
#> 1 Group 1 dog        2
#> 2 Group 1 possum     1
#> 3 Group 2 dog       NA
#> 4 Group 2 possum     3

现在,既然我们已经完成了计数,所以我们使用stat = "identity":
ggplot(df_tally, aes(x=A, y=n, fill=B)) +
  geom_bar(stat = "identity",
           position = position_dodge(width = -0.9, preserve = "single"))
#> Warning: Removed 1 rows containing missing values (geom_bar).

在您的情况下,这看起来像:
DATA3 <- DATA2 %>% 
  group_by(A,B,C) %>% 
  tally() %>% 
  ungroup() %>% 
  complete(A,B,C)


ggplot(DATA3, aes(x=C,y=n,fill=B)) +
  geom_bar(stat="identity", 
           position = position_dodge(width = -0.9, preserve = "single")) +
  facet_grid(.~A) +
  theme_bw() + 
  scale_fill_manual(values = c("grey","grey40")) + 
  coord_flip()
#> Warning: Removed 2 rows containing missing values (geom_bar).

更新:dplyr 0.8.0

dplyr 0.8.0 开始,group_by 命令现在有一个 .drop 参数,可以保留没有数据的因子组。这样可以稍微简化必需的代码。例如:

DATA3 <- DATA2 %>% 
  group_by(A,B,C, .drop = FALSE) %>% 
  summarise(n = n())

谢谢。问题已经解决了,虽然我不明白为什么第一种方法会有那个问题。 - Paulo Barradas
@PauloBarradas 我添加了一些解释和另一个问题的示例。希望能有所帮助! - DanTan
非常好的解释。谢谢你的时间。 - Paulo Barradas

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