2013-08-30 82 views
3

我有四個數據集,我想繪製所有數據在同一圖上的直方圖。我已將所有數據放入一個數據框中。我也可以在一個圖上繪製直方圖。但是,我在繪製百分比而不是計數時遇到了麻煩。當我使用下面的代碼時,它將百分比繪製爲所有計數的總和,但我更傾向於百分比是相對於每個數據集。這可能嗎?使用ggplot2爲百分比繪製多個數據集的直方圖

all <- rbind(data.frame(fill = "A", Events = A$Events), 
    data.frame(fill = "B", Events = B$Events), 
    data.frame(fill = "C", Events = C$Events), 
    data.frame(fill = "D", Events = D$Events) 
ggplot(all,aes(x=Events, fill = fill)) + 
geom_histogram(aes(y = ..count../sum(..count..)), position = 'dodge') 

編輯

下面是一些示例數據:

fill Events 
1 A 1 
2 A 1 
3 A 3 
4 A 1 
5 A 1 
6 A 6 
7 A 2 
8 A 1 
9 A 1 
10 A 2 
11 A 1 
12 A 1 
13 A 1 
14 A 1 
15 A 5 
16 A 1 
17 A 2 
18 A 2 
19 A 1 
20 A 1 
21 A 1 
22 A 1 
23 A 2 
24 A 1 
25 A 2 
26 A 1 
27 B 2 
28 B 3 
29 B 1 
30 B 3 
31 B 2 
32 B 5 
33 B 1 
34 B 1 
35 B 1 
36 B 2 
37 B 1 
38 B 1 
39 B 1 
40 B 1 
41 B 1 
42 B 1 
43 B 1 
44 B 1 
45 B 1 
46 B 4 
47 B 3 
48 B 3 
49 B 5 
50 B 3 
51 C 1 
52 C 2 
53 C 2 
54 C 3 
55 C 3 
56 C 9 
57 C 8 
58 C 1 
59 C 1 
60 C 2 
61 C 2 
62 C 1 
63 C 2 
64 C 39 
65 C 43 
66 C 194 
67 C 129 
68 C 186 
69 C 1 
70 C 2 
71 C 7 
72 C 4 
73 C 1 
74 D 12 
75 D 3 
76 D 2 
77 D 3 
78 D 8 
79 D 20 
80 D 5 
81 D 1 
82 D 4 
83 D 9 
84 D 51 
85 D 12 
86 D 7 
87 D 6 
88 D 7 
89 D 7 
90 D 9 
91 D 17 
92 D 18 
93 D 8 
94 D 7 
95 D 6 
96 D 10 
97 D 27 
98 D 11 
99 D 21 
100 D 89 
101 D 47 
102 D 1 

回答

1

你接近,但需要使用(..density..)*binwidth,而不是..count../sum(..count..)

# Your data: 
all <- data.frame(fill=rep(LETTERS[1:4],c(26,24,23,29)), 
        Events=c(1,1,3,1,1,6,2,1,1,2,1,1,1,1,5,1,2,2,1,1,1,1,2,1,2,1,2,3,1,3,2,5,1,1,1,2,1,1,1,1,1,1,1,1,1,4,3,3,5,3,1,2,2,3,3,9,8,1,1,2,2,1,2,39,43,194,129,186,1,2,7,4,1,12,3,2,3,8,20,5,1,4,9,51,12,7,6,7,7,9,17,18,8,7,6,10,27,11,21,89,47,1)) 

bw <- 20 # set the binwidth 

# plot 
p1<-ggplot(all,aes(x=Events, fill=fill)) + 
    geom_histogram(aes(y=(..density..)*bw), position='dodge', binwidth=bw) 
p1 

desired output

下面是一個檢查,以確保該值添加到1:

aggregate(ymax ~ group, data = as.data.frame(print(p1)$data[[1]]), FUN = sum) 
# group ymax 
#1  1 1 
#2  2 1 
#3  3 1 
#4  4 1 

年長的答案

下面是一個例子:

library(ggplot2) 

ggplot(mtcars,aes(x=mpg, fill = as.factor(cyl))) + 
    geom_histogram(aes(y = ..density..), position = 'dodge', binwidth=5) 

作爲一個檢查,將binwidth調整爲100,每列將有0.01(100%/ 100 = 0.01)的值。

編輯)下面是另一個例子,使用過於簡單的數據集,突出結果:

library(data.table) 
# Calculate the average miles per gallon by number of cylinders 
mtcars_avg <- as.data.table(mtcars)[, 
            list(mpg_avg=mean(mpg)), 
            by=list(cyl=as.factor(cyl))][order(cyl)][order(cyl)] 
mtcars_avg 
# cyl mpg_avg 
#1: 4 26.66364 
#2: 6 19.74286 
#3: 8 15.10000 

# OP version, with unwanted results of 33% per color (cyl) 
ggplot(mtcars_avg, aes(x=mpg_avg, fill=cyl)) + 
    geom_histogram(aes(y = ..count../sum(..count..)), position = 'dodge', binwidth=1) 

original

# ..density.. version, which shows the desired results of 100% per color (cyl) 
ggplot(mtcars_avg, aes(x=mpg_avg, fill=cyl)) + 
    geom_histogram(aes(y = ..density..), position = 'dodge', binwidth=1) 

solution

您可能還需要考慮改爲使用geom_density

ggplot(mtcars,aes(x=mpg, fill = as.factor(cyl))) + geom_density(alpha=0.5) 
+0

也許我沒有正確地說出我的問題。我想象的是,爲每個數據集添加所有條形圖將等於100%,但使用密度,對於所有數據集,我總共獲得100%。 – user2167681

+1

是的,我想我明白了。我已經爲解決方案添加了另一個示例。這有幫助嗎?也許你可以發佈突出你的確切關注的實際數據? – dnlbrky

+0

我已經在頂部添加了一些示例數據。如果我離開binwidth = 1,使用..density ..可以正常工作,但是當我改變binwidth = 10時,總數最終爲10%(我猜是因爲1.00/10 = .1)。如果您知道改變binwidth的方法,但將比例保持在100%是有幫助的。另外,感謝關​​於geom_density的提示。我可能只是用它來代替。 – user2167681

相關問題