在条形图中获得相等的宽度条

时间:2015-08-31 12:12:11

标签: r ggplot2 bar-chart

我有以下数据:

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)) 

这给了我以下栏:

enter image description here

我希望所有的条形图都相同,但是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()时,还有其他方法可以使用相等的宽度条吗?

3 个答案:

答案 0 :(得分:2)

你可以通过刻面来实现与你正在寻找的东西接近的东西:

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)

enter image description here

答案 1 :(得分:2)

我们不是使用stat_summary在ggplot2内部进行汇总,而是预先计算这些值,我们会将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))

enter image description here

答案 2 :(得分:0)

这是一个快速入侵,无法扩展。您需要为y变量使用NA添加缺少因子级别组合的条目。

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