2013-08-30 4 views
3

4 개의 데이터 세트가 있으며 동일한 플롯에 데이터의 히스토그램을 플롯하고자합니다. 모든 데이터를 하나의 데이터 프레임에 넣었습니다. 또한 히스토그램을 한 플롯에 플로팅 할 수 있습니다. 그러나 나는 카운트보다는 백분율을 그리는 데 어려움을 겪고있다. 아래 코드를 사용하면 모든 카운트의 합계로 백분율을 표시하지만 백분율을 각 데이터 세트에 상대적으로 선호합니다. 이것이 가능한가? 당신은했으나, (..density..)*binwidth보다는 ..count../sum(..count..) 사용할 필요가ggplot2를 사용하여 여러 데이터 세트에 대한 막대 그래프 플로팅

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

: 여기에 편집

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') 

몇 가지 예를 들어 데이터입니다.

library(ggplot2) 

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

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 

이전 대답 여기

는 예입니다 : 여기

desired output

# 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 
는 값이 1에 추가되었는지 확인하는 검사입니다

수표로 빈도를 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

몇 가지 예제 데이터를 추가했습니다. ..density를 사용하면 .. binwidth = 1을 그대로두면 잘 작동하지만 예를 들어 binwidth = 10을 변경하면 총계가 10 %가됩니다 (1.00/10 = .1이기 때문에). binwidth를 변경하는 방법을 알고 있지만 규모를 100 %로 유지하면 도움이됩니다. 또한 geom_density에 대한 팁을 주셔서 감사합니다. 대신 그걸 사용할 수도 있습니다. – user2167681

관련 문제