使用ggplot2在直方图中显示百分比而不是计数|R

rsaldnfx  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(113)

我使用直方图来绘制我的3组数据。但是,正如直方图所做的那样,它计算了每组有多少这些值(在x轴上),我想要的是这个值出现/出现的百分比(%)。
这是我生成的图,我使用这个常规代码绘制直方图:

ggplot2.histogram(data=dat, xName='dens',
                  groupName='lines', legendPosition="top",
                  alpha=0.1) + 
  labs(x="X", y="Count") +
  theme(panel.border = element_rect(colour = "black"),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black")) + 
  theme_bw()+
  theme(legend.title=element_blank())

任何想法/建议?

ee7vknir

ee7vknir1#

我们可以用count计算统计量的相对值来替换y美学,并设置比例来显示百分比:

ggplot2.histogram(data=dat, xName='dens',
                  groupName='lines', legendPosition="top",
                  alpha=0.1) + 
  labs(x="X", y="Count") +
  theme(panel.border = element_rect(colour = "black"),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black")) + 
  theme_bw()+
  theme(legend.title=element_blank()) + 
  aes(y = after_stat(count)/sum(after_stat(count))) + 
  scale_y_continuous(labels = scales::percent)
4xrmg8kj

4xrmg8kj2#

如果我理解正确,那么fill会回答你的问题吗?
比如说,

mtcars %>% 
ggplot(aes(x = factor(gear), group = factor(cyl), fill = factor(cyl))) + 
geom_bar(position = "fill")

在这里,您不再有计数,但是对于沿着x轴的每个值,您有每个组的百分比(在这里:圆柱体)绘制。
如果这不是您想要的,一般建议是先计算要绘制的数据,然后再绘制它。也就是说,许多人认为将计算/转换/聚合与绘图分开通常是明智的。
为了跟进我将计算与可视化分离的建议,让我们考虑mtcars数据集,并关注gearcarb

with(mtcars, table(gear, carb))
    carb
gear 1 2 3 4 6 8
   3 3 4 3 5 0 0
   4 4 4 0 4 0 0
   5 0 2 0 1 1 1

例如,您可以看到3个(32个中的)观测值具有gear = 3, carb = 1,这略小于10%。同样,4个观测值有gear = 4, carb = 1,比10%多一点。让我们直接计算百分比:

with(mtcars, prop.table(table(gear, carb)))
    carb
gear       1       2       3       4       6       8
   3 0.09375 0.12500 0.09375 0.15625 0.00000 0.00000
   4 0.12500 0.12500 0.00000 0.12500 0.00000 0.00000
   5 0.00000 0.06250 0.00000 0.03125 0.03125 0.03125

我在这里使用了prop.table,它也有一个margin参数。也就是说,如果你想知道条件百分比,你可以很容易地调整它(见下文)。不过,我们还是先讨论这个吧。假设我们想在计算完这些数字后将其可视化,我们可以简单地调用以下命令:

with(mtcars, prop.table(table(gear, carb))) %>% 
             as.data.frame() %>% 
             ggplot(aes(x = factor(carb), y = Freq, group = factor(gear), fill = factor(gear))) + 
             geom_bar(stat = "identity")

这将给我们给予:

现在假设你想得到条件版本,例如。

with(mtcars, prop.table(table(gear, carb), margin = 1))
    carb
gear         1         2         3         4         6         8
   3 0.2000000 0.2666667 0.2000000 0.3333333 0.0000000 0.0000000
   4 0.3333333 0.3333333 0.0000000 0.3333333 0.0000000 0.0000000
   5 0.0000000 0.4000000 0.0000000 0.2000000 0.2000000 0.2000000

注意每行的总和是如何为1的。这可以用同样的方式绘制:

with(mtcars, prop.table(table(gear, carb), margin = 1)) %>% 
as.data.frame() %>% 
ggplot(aes(x = factor(carb), y = Freq, group = factor(gear), fill = factor(gear))) + 
geom_bar(stat = "identity")

请注意与以下方法生成的平滑版本的相似性:

mtcars %>% 
ggplot(aes(x = factor(carb), group = factor(gear), fill = factor(gear))) + 
geom_density(alpha = 0.5)

相关问题