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

问题描述 投票:0回答:2

我正在使用直方图来绘制我的 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())

有什么想法/建议吗?

r ggplot2 histogram
2个回答
4
投票

我们可以用

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)

1
投票

如果我理解正确的话,那么

fill
会回答你的问题吗?

举个例子,

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

在这里,您不再有计数,但对于沿

x
轴的每个值,您可以绘制每组(此处:圆柱体)的百分比。

如果这不是您想要的,一般建议是先计算您想要绘制的数据,然后绘制它。也就是说,许多人认为通常建议将计算/转换/聚合与绘图分开。


为了跟进我将计算与可视化分开的建议,让我们考虑

mtcars
数据集并重点关注
gear
carb

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

例如,您会看到 32 个观测值(共 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
,它也有一个边距参数。也就是说,如果您想知道条件百分比,您可以轻松调整它(见下文)。不过,让我们暂时保留这一点。假设我们现在想要在计算完数字后将其可视化,我们可以简单地调用以下内容:

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)

© www.soinside.com 2019 - 2024. All rights reserved.