R / ggplot2 - 如何使用Facet_grid和geom直方图/误差条处理不均匀的分组大小

3

我希望在代码的最后一行使用+facet_grid(.~sample,scales = "free_x")强制分面,但结果看起来相当不美观(见图2)(依我之见)。我想知道是否有一种方法可以强制geom_histogram的每个条形图具有特定大小,以便无论组是否平衡,条形图都看起来相似。

谢谢, Vivian

示例数据:

samplenote  prod    N   mean    sd  se  sampleprod  sample
Sample A    PRODUCT A   3   0.562103162 0.120039901 0.069305069 Sample A PRODUCT A  Sample A
Sample A    PRODUCT B   3   0.516322045 0.039250354 0.022661203 Sample A PRODUCT B  Sample A
Sample B    PRODUCT A   3   0.504789098 0.055005623 0.031757511 Sample B PRODUCT A  Sample B
Sample B    PRODUCT B   3   0.564334594 0.035685751 0.020603178 Sample B PRODUCT B  Sample B
Sample C    PRODUCT A   3   0.337747481 0.042670562 0.024635861 Sample C PRODUCT A  Sample C
Sample C    PRODUCT B   3   0.470207809 0.012102641 0.006987463 Sample C PRODUCT B  Sample C
Sample C group1 PRODUCT A   3   0.666033925 0   0   Sample C group1 PRODUCT A   Sample C
Sample C group1 PRODUCT B   3   0.775242276 0.017019353 0.009826128 Sample C group1 PRODUCT B   Sample C
Sample C group2 PRODUCT A   3   0.53594287  0.062336653 0.035990084 Sample C group2 PRODUCT A   Sample C
Sample C group2 PRODUCT B   3   0.4705616   0.009122911 0.005267115 Sample C group2 PRODUCT B   Sample C

示例图1:

ggplot(data=test.df,aes(x=samplenote,y=mean,fill=prod))+
geom_bar(stat="identity",col="black",size = 0.4,position='dodge')+
scale_fill_manual(values=c("#B50000","#0039e6"))+
geom_errorbar(data=test.df,aes(x=samplenote,ymax=mean+sd,ymin=mean,width=.2),position=position_dodge(.9),colour="black",size = 0.4)+
theme_classic()+
theme(axis.text=element_text(colour="black"))+
theme(axis.ticks=element_line(colour="black"))+
    coord_cartesian(ylim=c(0,1.13),expand = TRUE)+
scale_y_continuous(expand=c(0,0),breaks=c(0,0.25,0.5,0.75,1))+
ylab("g/g prod")+
xlab("")+
theme(legend.title=element_blank())+
theme(axis.line=element_line(size=0.4))

图1 图2

编辑

Brian 给出的解决方案:

ggplot(data=test.df,aes(x=samplenote,y=mean,fill=prod))+
geom_bar(stat="identity",col="black",size = 0.4,position='dodge')+
scale_fill_manual(values=c("#B50000","#0039e6"))+
geom_errorbar(data=test.df,aes(x=samplenote,ymax=mean+sd,ymin=mean,width=.2),position=position_dodge(.9),colour="black",size = 0.4)+
theme_classic()+
theme(axis.text=element_text(colour="black"))+
theme(axis.ticks=element_line(colour="black"))+
    coord_cartesian(ylim=c(0,1.13),expand = TRUE)+
scale_y_continuous(expand=c(0,0),breaks=c(0,0.25,0.5,0.75,1))+
ylab("g/g prod")+
xlab("")+
theme(legend.title=element_blank())+
theme(axis.line=element_line(size=0.4))+facet_grid(.~sample,scales = "free_x",space="free_x")

展示图3graph3

1个回答

6

您需要使用+ facet_grid(〜样本,scales =“free_x”,space =“free_x”)space参数调整分面大小,以使条形图宽度保持一致(或更精确地说,使X轴上刻度之间的间距相同)。

require(dplyr)
data_frame(x = c("a", "a", "b", "b", "c", "c"),
           y = runif(length(x)),
           sample = rep(c("A", "B"), 3),
           grouping = c(1, 1, 1, 1, 2, 2)) %>% 
  ggplot(aes(x, y, fill = sample)) + geom_bar(stat = "identity", position = "dodge") + 
  facet_grid(~grouping, space = "free_x", scales = "free_x")

在此输入图片描述

编辑:

有时候你可能会发现缺少数据,导致柱状图不平衡:

data_frame(x = c("a", "a", "b", "b", "c", "c"),
           y = runif(length(x)),
           sample = rep(c("A", "B"), 3),
           grouping = c(1, 1, 1, 2, 2, 2)) %>% 
  ggplot(aes(x, y, fill = sample)) + geom_bar(stat = "identity", position = "dodge") + 
  facet_grid(~grouping, space = "free_x", scales = "free_x")

在这里输入图片描述

解决这个问题的方法是使用tidyr包,它可以让你包含显式的NA值,这样就可以为缺失的柱形图留出空间。

data_frame(x = c("a", "a", "b", "b", "c", "c"),
           y = runif(length(x)),
           sample = rep(c("A", "B"), 3),
           grouping = c(1, 1, 1, 2, 2, 2)) %>% 
  group_by(grouping) %>% 
  tidyr::complete(crossing(sample, x)) %>% 
  ggplot(aes(x, y, fill = sample)) + geom_bar(stat = "identity", position = "dodge") + 
  facet_grid(~grouping, space = "free_x", scales = "free_x")

enter image description here


谢谢Brian。确实,space = "free_x" 函数! - Vivi
2
tidyr::complete()中的crossing是不必要的。 - Jake Kaupp

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