【问题标题】:Plotting histograms for multiple datasets with percentages with ggplot2使用 ggplot2 绘制具有百分比的多个数据集的直方图
【发布时间】:2013-09-03 16:01:34
【问题描述】:

我有四个数据集,我想在同一个图上绘制数据的直方图。我已将所有数据放入一个数据框中。我也可以在一个图上绘制直方图。但是,我无法绘制百分比而不是计数。当我使用下面的代码时,它将百分比绘制为所有计数的总和,但我希望百分比与每个数据集相关。这可能吗?

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  

【问题讨论】:

    标签: r ggplot2 histogram percentage


    【解决方案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
    

    这是一个检查以确保值相加为 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)。

    (Edit) 下面是另一个例子,使用过度简化的数据集来突出显示结果:

    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)
    

    # ..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)
    

    您可能还想考虑改用geom_density

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

    【讨论】:

    • 也许我的问题措辞不正确。我想象的是,将每个数据集的所有条形加起来等于 100%,但是使用密度,我得到所有数据集的总和 100%。
    • 是的,我想我明白了。我在解决方案中添加了另一个示例。这有帮助吗?也许您可以发布突出您确切关注的实际数据?
    • 我在顶部添加了一些示例数据。如果我保留 binwidth = 1,使用 ..density.. 可以正常工作,但是当我更改 binwidth = 10 时,总数最终为 10%(我猜是因为 1.00/10 = .1)。如果您知道更改 binwidth 的方法,但将比例保持为 100%,那将很有帮助。另外,感谢有关 geom_density 的提示。我可能会用它来代替。
    • 好的。看起来将密度乘以 binwidth 将达到您想要的结果。检查编辑的答案。也许其他人可以权衡一下为什么这是必要的。
    【解决方案2】:

    这个 binwidth 是必要的,因为根据定义,积分总和为 1。 基本上x binwidth 的增加会导致y 的变化1/x - binwidth 更大,因此高度必须更低才能获得相同的区域。

    因此,要恢复百分比,您必须通过将 y 乘以 bw 来纠正此问题。

    一个简单的例子,想象一下:

    • 基本的“..density..”代码将为您提供百分比,因为bw * p = 1,即1*1=1
    • 如果您将bw 更改为 2,“..density..”代码将在 y 轴上为您提供:bw * y = 1 =&gt; y = 1/bw = 0.5
    • 为了获得y 轴上的百分比,您必须乘以bw

    【讨论】:

    • 请正确格式化您的答案。就目前而言,它是相当难以理解的。
    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多