如何在使用facet_wrap的ggplot2中显示所有x轴标签,包括缺失数据?

3
我正在使用更新的ggplot2(2.2.0)进行工作。一个很棒的新功能是能够在每个x轴上绘制不同数量的图形,如页面所述。
我希望在每个facet中使用相同的x轴。然而,当引入缺失数据时,这种方法是行不通的。例如,我将借用这个问题中的示例数据进行说明。
# Example dataset
dataf <- data.frame(x=c(1:30), A=rnorm(30,20,5), B=rnorm(30,15,0.5))
datam <- melt(dataf, id="x")
# Plot in ggplot2
ggplot(datam, aes(factor(x), value)) + 
  geom_bar(stat="identity") + 
  facet_wrap(~variable,nrow = 2,scales = "free")

当我删除特定行并引入缺失数据时(根据下面的代码),我不能再为“A”和“B”拥有相同的x轴标签。

# Remove certain rows to introduce missing data
datam <- datam[-c(2, 4, 58), ]

我可以使用scales = fixed绘制缺失值并将其对齐到底部的x轴,但是在分面中,组“A”的x轴刻度标签已经不存在了。

ggplot(datam, aes(factor(x), value)) + 
  geom_bar(stat="identity") + 
  facet_wrap(~variable,nrow = 2,scales = "fixed")

如何在每个面板上都显示完全相同的x轴标签,即使存在缺失数据?
谢谢。

@hadley - ggplot2内部是否有此功能,可以在不使用下面答案中的解决方法的情况下完成上述操作? - user2716568
我在下面提供了解决方案,仅限于ggplot2功能,没有任何变通方法。 - Djork
2个回答

1
您可以这样做:
library(reshape2)
library(ggplot2)
dataf <- data.frame(x=c(1:30), A=rnorm(30,20,5), B=rnorm(30,15,0.5))
datam <- melt(dataf, id="x")
datam2 <- datam[-c(2, 4, 58), ] #mising rows
graph<-ggplot(datam2, aes(factor(x), value)) + 
  geom_bar(stat="identity") + 
  facet_wrap(~variable,nrow = 2,scales = "fixed")
library(gtable)
library(grid)
g <- ggplotGrob(graph) #retrieve grob from graph
panels <- grep("panel", g$layout$name)
top <- unique(g$layout$t[panels])
all <- gtable:::rbind_gtable(gtable:::rbind_gtable(g[seq.int(min(top)), ], 
                                                   g[max(top)+1,], "first"), 
                             g[seq(min(top)+1, nrow(g)),], "first")
grid.newpage()
grid.draw(all)

在此输入图像描述
我相信这是我在 Stack Overflow 上找到的一个解决方案。但是我无法记起原始帖子。


1
太好了,感谢您提供的解决方法!很遗憾无法通过比例选项来解决。我该如何添加我的y轴标签(不在原帖中)? - user2716568

0
这是一个仅使用ggplot2功能的解决方案。在scale_x_discreetscale_y_discreet中有一个drop参数,当设置为FALSE时,它会显示所有因子,而不管该因子是否存在数据。
请参见? scale_x_discreet。第一步是将datam$x转换为因子。
library(ggplot2)
dataf <- data.frame(x=c(1:30), A=rnorm(30,20,5), B=rnorm(30,15,0.5))
datam <- melt(dataf, id="x")

# missing data
datam <- datam[-c(2, 4, 58), ]

# solution
ggplot(datam, aes(factor(x), value)) + 
  geom_bar(stat="identity") + 
  facet_wrap(~variable,nrow = 2, scales = "free") + 
  scale_x_discrete(drop=FALSE)

enter image description here


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