【问题标题】:Show the percentage instead of count in histogram using ggplot2 | R使用 ggplot2 在直方图中显示百分比而不是计数R
【发布时间】:2019-03-12 01:42:50
【问题描述】:

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

有什么想法/建议吗?

【问题讨论】:

  • 尝试添加+ scale_y_continuous(labels = scales::percent) ? (最好提供可重复的数据!)
  • 不,它似乎将 y-axis* 乘以 100 并且从我的上图中更改为 300,000% @Moody_Mudskipper
  • 确实...好吧,您正在使用自定义函数ggplot2.histogram,我们没有它的代码,所以我们不能做太多,再次,最好提供可重复的数据
  • + aes(y=stat(count)/sum(stat(count))) + scale_y_continuous(labels = scales::percent)能用吗?
  • 非常感谢,这对我有用@Moody_Mudskipper

标签: r ggplot2 histogram


【解决方案1】:

我们可以用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)

【讨论】:

  • y=stat(count)/sum(stat(count),这会有所不同。非常感谢
【解决方案2】:

如果我理解正确,那么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,它也有一个边距参数。也就是说,如果您想知道条件百分比,您可以轻松调整它(见下文)。不过,让我们暂时保留这一点。假设我们现在想在计算完数字后将其可视化,我们可以简单地调用以下代码:

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)

【讨论】:

  • 不,确实不同,我的 x 轴在这 3 组中的每组中都有很多值(与您展示的示例不完全相同)
  • @SaraWasl 我不确定我是否完全理解。您能否发布一些示例数据并更多地描述您想要的图表应该是什么样子?您可以为此编辑您的帖子,但请在此处给我留言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2017-02-26
  • 2019-12-20
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多