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

时间:2018-10-07 00:18:40

标签: r ggplot2 histogram

我正在使用直方图来绘制我的3组数据。但是,就像直方图一样,它计算每个组中有多少(在x轴上)这些值,而我想要的是该值出现/出现的百分比(以百分比为单位)。

这是我生成的图形,我使用下面的常规代码绘制直方图:

datepicker

enter image description here

有什么想法/建议吗?

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么mtcars %>% ggplot(aes(x = factor(gear), group = factor(cyl), fill = factor(cyl))) + geom_bar(position = "fill") 会回答您的问题吗?

例如,

x

enter image description here

在这里,您不再需要计数,但是对于mtcars轴上的每个值,您都可以绘制每个组(此处为圆柱体)的百分比。

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


要遵循我关于将计算与可视化分开的建议,让我们考虑gear数据集,并重点关注carbwith(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

gear = 3, carb = 1

例如,您看到32个观察结果中有3个具有gear = 4, carb = 1,这还不到10%。同样,有4个观测值具有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 ,这比10%多一点。让我们直接获取百分比:

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") ,它也有一个margin参数。也就是说,如果您想了解条件百分比,则可以轻松地对此进行调整(请参见下文)。不过,暂时让我们继续。假设我们要在计算完数字后现在就可视化它,我们可以简单地调用以下代码:

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

这将给我们:

enter image description here

现在假设您要获取条件版本,例如

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

请注意每一行总计为1。可以用相同的方式绘制该图:

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

enter image description here

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

{{1}}

enter image description here

答案 1 :(得分:0)

我们可以用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=stat(count)/sum(stat(count))) + 
  scale_y_continuous(labels = scales::percent)