2015-04-15 68 views
1

我想正常化一个堆积图,并把每个填充的中间填充的百分比。这是一个简单的问题,但我没有处理y值是什么,因为它是隐含的,所以我不知道如何设置:geom_text(aes(y=??, label=paste0(??,"%")))ggplot2:中等百分比的归一化堆积图

至于正常化,我已经看到人们预先崩溃并正常化dt,但我希望学习ggplot-ish的方式来做到这一点。

我是否需要将我的dt转换为time-grpmember百分比汇总表?这会让我直接处理y值(例如,计算'每个填充的中间值')。

dt <- as.data.table(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) 

ggplot(dt, aes(x=time)) + geom_bar(aes(fill=grpmember)) + geom_text(aes(y = 2, label=paste0("?", "%"))) 

Graph

+0

你能提供你计数的原始数据?如果我理解正确,那么您会希望y轴以原始计数值表示,同时每个堆栈的百分比也显示出来? –

+0

如果你想要一个100%叠加的条形图,其中每个系列的百分比总和为100%,ggplot2可以做到这一点,而不需要转换数据:http://stackoverflow.com/questions/3619067/stacked -bar-chart-in-r-ggplot2 -y-axis-and-bars-as-percent-of-counts但是,就带有这种图表的百分比标签而言,您可能需要随时转换为汇总表提出并计算标签的位置。 –

回答

1

编辑

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

enter image description here

+0

这已经足够接近了,尽管我用'data.table'重写了'dplyr'命令。谢谢。 – rjturn

相关问题