在条形图中获得等宽条
get equal width bars in a barplot
我有以下数据:
我通过以下方式为其绘制条形图:
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
然后我们处理缺失的组。我们创建 realDist
和 clusteringDistance
.
的所有组合
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_bar
和 stat = "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))
我有以下数据:
我通过以下方式为其绘制条形图:
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
然后我们处理缺失的组。我们创建 realDist
和 clusteringDistance
.
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_bar
和 stat = "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))