编辑
从约ggplot 2.1.0,geom_text
得到一个position_fill
/position_stack
,从而不再有必要计算,也不使用AY审美定位标签(请参见原件下面的pos
)。
dt <- read.table(text = "time grpmember
1 TRUE
1 TRUE
1 TRUE
1 FALSE
1 FALSE
1 FALSE
2 FALSE
2 TRUE
2 TRUE
2 TRUE", header=TRUE)
dt$time <- as.factor(dt$time)
library(ggplot2)
library(dplyr)
dtSummary = dt %>%
group_by(time, grpmember) %>%
summarise(count = n()) %>%
mutate(Percent = paste0(sprintf("%.1f", count/sum(count) * 100), "%"))
ggplot(dtSummary, aes(x = time, y = count, fill = grpmember, label = Percent)) +
geom_bar(position = "stack", stat = "identity") +
geom_text(position = position_stack(vjust = .5))
原始
我不能完全确定你所追求的,但这种计算包含计数,标签汇总表(即百分比)和位置的标签(在每个片段的中点);然后绘制该图。
dt <- read.table(text = "time grpmember
1 TRUE
1 TRUE
1 TRUE
1 FALSE
1 FALSE
1 FALSE
2 FALSE
2 TRUE
2 TRUE
2 TRUE", header=TRUE)
dt$time <- as.factor(dt$time)
library(ggplot2)
library(dplyr)
dtSummary = dt %>%
# Get the counts
group_by(time, grpmember) %>%
summarise(count = n()) %>%
# Get labels and position of labels
group_by(time) %>%
mutate(Percent = paste0(sprintf("%.1f", count/sum(count) * 100), "%")) %>%
mutate(pos = cumsum(count) - 0.5 * count)%>%
mutate(pos = cumsum(count) - 0.5 * count) %>%
mutate(grpmember = factor(grpmember),
grpmember = factor(grpmember, levels = rev(levels(grpmember))))
ggplot(dtSummary, aes(x = time, y = count, fill = grpmember)) +
geom_bar(stat = "identity") +
geom_text(aes(y = pos, label = Percent))
你能提供你计数的原始数据?如果我理解正确,那么您会希望y轴以原始计数值表示,同时每个堆栈的百分比也显示出来? –
如果你想要一个100%叠加的条形图,其中每个系列的百分比总和为100%,ggplot2可以做到这一点,而不需要转换数据:http://stackoverflow.com/questions/3619067/stacked -bar-chart-in-r-ggplot2 -y-axis-and-bars-as-percent-of-counts但是,就带有这种图表的百分比标签而言,您可能需要随时转换为汇总表提出并计算标签的位置。 –