2015-08-28 113 views
2

我让自己从another existing post采取数据和代码,因为我的问题是相似的,但在一个点上不同。ggplot酒吧与百分比基于组和相同的长度

我的数据帧是

df = read.table(text = " 
id year type amount 
1 1991 HIIT  22 
2 1991 inter 144 
3 1991 VIIT  98 
4 1992 HIIT  20 
5 1992 inter 136 
6 1992 VIIT 108 
7 1993 HIIT  20 
8 1993 inter 120 
9 1993 VIIT 124 
10 1994 HIIT  26 
11 1994 inter 118 
12 1994 VIIT 120 
13 1995 HIIT  23 
14 1995 inter 101 
15 1995 VIIT 140 
16 1996 HIIT  27 
17 1996 inter 103 
18 1996 VIIT 162 
19 1997 HIIT  24 
20 1997 inter  96 
21 1997 VIIT 172 
22 1998 HIIT  24 
23 1998 inter  92 
24 1998 VIIT 177 
25 1999 HIIT  28 
26 1999 inter  45 
27 1999 VIIT 220 
28 2000 HIIT  26 
29 2000 inter  36 
30 2000 VIIT 231 
31 2001 HIIT  29 
32 2001 inter  30 
33 2001 VIIT 233 
34 2002 HIIT  37 
35 2002 inter  35 
36 2002 VIIT 221 
37 2003 HIIT  41 
38 2003 inter  34 
39 2003 VIIT 218 
40 2004 HIIT  28 
41 2004 inter  38 
42 2004 VIIT 226 
43 2005 HIIT  34 
44 2005 inter  41 
45 2005 VIIT 216 
46 2006 HIIT  28 
47 2006 inter  40 
48 2006 VIIT 222 
49 2007 HIIT  37 
50 2007 inter  42 
51 2007 VIIT 199 
52 2008 HIIT  35 
53 2008 inter  60 
54 2008 VIIT 185 
55 2009 HIIT  47 
56 2009 inter  51 
57 2009 VIIT 181 
58 2010 HIIT  44 
59 2010 inter  44 
60 2010 VIIT 174 
61 2011 HIIT  44 
62 2011 inter  47 
63 2011 VIIT 171 
64 2012 HIIT  37 
65 2012 inter  49 
66 2012 VIIT 178", header = TRUE, sep = "") 

此代码给我一个ggplot barplot:

library(plyr) 
library(ggplot2) 

# Get the levels for type in the required order 
df$type = factor(df$type, levels = c("inter", "VIIT", "HIIT")) 
df = arrange(df, year, type) 

# Calculate the percentages 
df = ddply(df, .(year), transform, percent = amount/sum(amount) * 100) 

# Format the labels and calculate their positions 
df = ddply(df, .(year), transform, pos = (cumsum(amount) - 0.5 * amount)) 
df$label = paste0(sprintf("%.0f", df$percent), "%") 

# Plot 
ggplot(df, aes(x = factor(year), y = amount, fill = type)) + 
    geom_bar(stat = "identity", width = .7) + 
    geom_text(aes(y = pos, label = label), size = 2) + 
    coord_flip() 

我想保持相同的图形,但我想有条的长度相同。 所以我必须从横坐标中删除amount

+0

有一个解决方案,您的问题在这个线程[这里](http://stackoverflow.com/questions/9563368/create-stacked-percent-barplot-in-r)和在这[这里](http ://stackoverflow.com/questions/12386005/r-stacked-percentage-bar-plot-with-percentage-of-binary-factor-and-labels-with)。 –

回答

1

您是指以下内容? (geom_bar(..., position = "fill")

# adjust label positions  
df <- ddply(df, .(year), transform, 
      pos = (cumsum(amount) - 0.5*amount)/sum(amount)) 

ggplot(df, aes(x = factor(year), y = amount, fill = type)) + 
    geom_bar(stat = "identity", position = "fill", width = .7) +  
    geom_text(aes(y = pos, label = label), size = 2) + 
    coord_flip() 

plot

+0

谢谢,我正在寻找什么! –

1

使用包装秤()则无需手动创建百分号标签:

library(dplyr) 
library(ggplot2) 
library(scales) 
df %>% 
    mutate(type = factor(type, levels = c("inter", "VIIT", "HIIT"))) %>% 
    group_by(year) %>% 
    mutate(ratio = amount/sum(amount), 
      pos=cumsum(ratio)-ratio/2) %>% 
    ggplot(aes(x=factor(year), y=ratio, fill=type)) + 
     geom_bar(stat="identity") + 
     geom_text(aes(y = pos, label = percent(pos)), size = 2) + 
     scale_y_continuous(name="", labels = percent) + 
     coord_flip() 

导致情节就像是一个在RCS的回答。

+0

dplyr的回复很好,谢谢! –