在条形图中获得等宽条

get equal width bars in a barplot

我有以下数据:

dput(test_mod3)

我通过以下方式为其绘制条形图:

ggplot(data=test_mod3, aes(x = as.factor(realDist), y = 1-value, fill=as.factor(clusteringDistance), width=0.75 ) ) + 
  stat_summary( fun.y=mean, geom="bar", width=0.1, color="black", size=0.2, position=position_dodge(width = 0.90) ) +
  stat_summary( fun.data=mean_cl_normal,geom="errorbar", width=0.35, size=0.3, position=position_dodge(width = 0.90)) 

这给了我以下栏:

我希望所有的条形图都具有相同的大小,尽管 x=100 没有要绘制的条形图。所以 x=100 出现的唯一条形应该与其他条形宽度相同

为了实现这一点,我尝试了类似的方法:

rd_100 <- c(100, 100, 100, 100, 100)
val_100 = c(1,1,1,1,1)
cd_100 = c(200,300,400,500,550)
df_100 = data.frame(rd_100, val_100, cd_100)

names(df_100) <- names(test_mod2) 
test_mod2 <- rbind(test_mod2, df_100)

然而这给了我很大的置信区间,但宽度还可以...

在使用 stat_summary() 时是否有任何其他方法可以使条宽度相等?

这是一个快速破解,不可扩展。您需要通过对 y 变量使用 NA 来添加缺失因子水平组合的条目。

for (i in c(200,300,400,500,550)) {
  test_mod3 = rbind(test_mod3, c(100,NA,i))
}

您可以通过分面实现与您正在寻找的东西接近的东西:

ggplot(data=test_mod3, aes(x = as.factor(clusteringDistance), y = 1-value, fill=as.factor(clusteringDistance), width=0.75 ) ) + 
  stat_summary( fun.y=mean, geom="bar", width=0.1, color="black", size=0.2, position=position_dodge(width = 0.90) ) +
  stat_summary( fun.data=mean_cl_normal,geom="errorbar", width=0.35, size=0.3, position=position_dodge(width = 0.90)) +
  facet_grid(. ~ realDist)

我们预先计算这些值,而不是在 ggplot2 中使用 stat_summary 进行汇总,我们将添加 realDist = 100 的缺失组作为 NA,以便稍后实现相同的宽度。

首先,我们使用 dplyr 对数据进行分组,并使用 mean_cl_normal.

按平均值和总体平均值的下限和上限进行汇总
library(dplyr)
df <- test_mod3 %>% 
      group_by(realDist, clusteringDistance) %>% 
      summarise(mean = mean(value), ymin = mean_cl_normal(value)$ymin,
                ymax = mean_cl_normal(value)$ymax)

输出:

  realDist clusteringDistance      mean      ymin      ymax
1       10                100 0.9997100 0.9996082 0.9998118
2       10                200 0.9963526 0.9959486 0.9967567
3       10                300 0.9860415 0.9850053 0.9870777
4       10                400 0.9711180 0.9695458 0.9726903
5       10                500 0.9496824 0.9471561 0.9522088
6       10                550 0.9632924 0.9606701 0.9659147
7      100                100 0.9877920 0.9867590 0.9888251

然后我们处理缺失的组。我们创建 realDistclusteringDistance.

的所有组合
df <- rbind(df, cbind(expand.grid(realDist = levels(as.factor(df$realDist)),
           clusteringDistance = levels(as.factor(df$clusteringDistance))),
           mean = NA, ymin = NA, ymax = NA))

输出:

   realDist clusteringDistance      mean      ymin      ymax
1        10                100 0.9997100 0.9996082 0.9998118
2        10                200 0.9963526 0.9959486 0.9967567
3        10                300 0.9860415 0.9850053 0.9870777
4        10                400 0.9711180 0.9695458 0.9726903
5        10                500 0.9496824 0.9471561 0.9522088
6        10                550 0.9632924 0.9606701 0.9659147
7       100                100 0.9877920 0.9867590 0.9888251
8        10                100        NA        NA        NA
9       100                100        NA        NA        NA
10       10                200        NA        NA        NA
11      100                200        NA        NA        NA
12       10                300        NA        NA        NA
13      100                300        NA        NA        NA
14       10                400        NA        NA        NA
15      100                400        NA        NA        NA
16       10                500        NA        NA        NA
17      100                500        NA        NA        NA
18       10                550        NA        NA        NA
19      100                550        NA        NA        NA    

最后,我们使用 geom_barstat = "identity"geom_errorbar

绘制数据
ggplot(data=df, aes(x = as.factor(realDist), y = 1-mean, fill=as.factor(clusteringDistance), width=0.75 )) +
      geom_bar(stat = "identity", position=position_dodge(width = 0.90), color="black", size=0.2)+
      geom_errorbar(aes(ymin=1-ymin, ymax=1-ymax), width=.35, size=0.3,  position=position_dodge(.9))