ggplot2:如果位置 = "fill",则在条形图上添加标签
ggplot2: Add label on barplot if position = "fill"
我想在 填充 条形图上添加百分比数字。这是标签在错误位置的图:
这是数据框:
x0 <- expand.grid(grp = c("G1","G2")
, treat = c("T1","T2")
, out = c("out1","out2","out3","out4")
)
set.seed(1234)
x0$n <- round(runif(16,0,1)*100,0)
head(x0)
grp treat out n
1 G1 T1 out1 11
2 G2 T1 out1 62
3 G1 T2 out1 61
4 G2 T2 out1 62
5 G1 T1 out2 86
6 G2 T1 out2 64
现在,我将 grp/treat 内的总和添加到数据框(使用 sql,抱歉!):
x0 <- sqldf(paste("SELECT a.*, (SELECT SUM(n)"
," FROM x0 b"
," WHERE a.grp = b.grp"
," AND a.treat = b.treat"
," ) tot"
," FROM x0 a"
," ORDER BY a.grp,a.treat,a.out"
)
)
x0$p <- with(x0, n/tot)
x0$p2 <- with(x0, paste(formatC(p*100, digits=2
, format="fg"),"%",sep=""))
head(x0)
grp treat out n tot p p2
1 G1 T1 out1 11 192 0.05729167 5.7%
2 G1 T1 out2 86 192 0.44791667 45%
3 G1 T1 out3 67 192 0.34895833 35%
4 G1 T1 out4 28 192 0.14583333 15%
5 G1 T2 out1 61 160 0.38125000 38%
6 G1 T2 out2 1 160 0.00625000 0.62%
我是这样得到情节的:
ggplot(x0, aes(grp, weight=n)) +
geom_bar(aes(fill = out), position = "fill") +
facet_grid(.~treat) +
scale_y_continuous(labels=percent) +
geom_text(aes(label=p2, y=p))
我可以用累积百分比向数据框添加一个新变量,但我想知道是否有更简单的方法来添加标签。
为避免自己创建位置值,您可以在 geom_text
中使用 position = "stack"
,就像在 this question 中一样。正如您在评论中指出的那样,数据集必须按 fill
变量排序才能以正确的顺序获取堆栈以匹配条形堆栈。
ggplot(x0, aes(grp, weight = n)) +
geom_bar(aes(fill = out), position = "fill") +
facet_grid(.~treat) +
scale_y_continuous(labels=percent) +
geom_text(aes(label = p2, y=p), position = "stack")
您可能最终需要删除特定大小以下的标签,以删除上图中看到的重叠部分。 geom_text(aes(label = ifelse(p < .05, NA, p2), y = p), position = "stack")
之类的东西会删除非常小的值的标签。
我想在 填充 条形图上添加百分比数字。这是标签在错误位置的图:
这是数据框:
x0 <- expand.grid(grp = c("G1","G2")
, treat = c("T1","T2")
, out = c("out1","out2","out3","out4")
)
set.seed(1234)
x0$n <- round(runif(16,0,1)*100,0)
head(x0)
grp treat out n
1 G1 T1 out1 11
2 G2 T1 out1 62
3 G1 T2 out1 61
4 G2 T2 out1 62
5 G1 T1 out2 86
6 G2 T1 out2 64
现在,我将 grp/treat 内的总和添加到数据框(使用 sql,抱歉!):
x0 <- sqldf(paste("SELECT a.*, (SELECT SUM(n)"
," FROM x0 b"
," WHERE a.grp = b.grp"
," AND a.treat = b.treat"
," ) tot"
," FROM x0 a"
," ORDER BY a.grp,a.treat,a.out"
)
)
x0$p <- with(x0, n/tot)
x0$p2 <- with(x0, paste(formatC(p*100, digits=2
, format="fg"),"%",sep=""))
head(x0)
grp treat out n tot p p2
1 G1 T1 out1 11 192 0.05729167 5.7%
2 G1 T1 out2 86 192 0.44791667 45%
3 G1 T1 out3 67 192 0.34895833 35%
4 G1 T1 out4 28 192 0.14583333 15%
5 G1 T2 out1 61 160 0.38125000 38%
6 G1 T2 out2 1 160 0.00625000 0.62%
我是这样得到情节的:
ggplot(x0, aes(grp, weight=n)) +
geom_bar(aes(fill = out), position = "fill") +
facet_grid(.~treat) +
scale_y_continuous(labels=percent) +
geom_text(aes(label=p2, y=p))
我可以用累积百分比向数据框添加一个新变量,但我想知道是否有更简单的方法来添加标签。
为避免自己创建位置值,您可以在 geom_text
中使用 position = "stack"
,就像在 this question 中一样。正如您在评论中指出的那样,数据集必须按 fill
变量排序才能以正确的顺序获取堆栈以匹配条形堆栈。
ggplot(x0, aes(grp, weight = n)) +
geom_bar(aes(fill = out), position = "fill") +
facet_grid(.~treat) +
scale_y_continuous(labels=percent) +
geom_text(aes(label = p2, y=p), position = "stack")
您可能最终需要删除特定大小以下的标签,以删除上图中看到的重叠部分。 geom_text(aes(label = ifelse(p < .05, NA, p2), y = p), position = "stack")
之类的东西会删除非常小的值的标签。