ggplot2 - 条形图的总和比例

时间:2017-10-14 10:50:34

标签: r ggplot2 bar-chart

我想绘制变量值之和的比例,而不是观察次数的比例。

对于后者,给定分类(例如切割)的观察比例可以这样完成:

library(ggplot2)

ggplot(data=diamonds) +
 geom_bar(aes(x=cut,y=..count../sum(..count..)),position="dodge")

为了从其他变量(如“价格”)的值中引入信息,可以将其映射到“y”并使用“身份”概念:

ggplot(data=diamonds) +
 geom_bar(aes(x=cut,y=price),stat="identity",position="dodge")

但是,我想结合两者绘制变量值之和的比例(例如价格之和) 所以有人必须将感兴趣的变量(例如价格)映射到y,而不是阻止y进行比例计算,除了聚合数据之外我还没有看到明显的方法(我喜欢避免)。 “

为了使我的意图更清晰,理想的解决方案看起来可能是这样的:

ggplot(data=diamonds) +
 geom_bar(aes(x=cut,y=..sum(price)../sum(..sum(price)..)),position="dodge")

2 个答案:

答案 0 :(得分:1)

library(ggplot2)
library(data.table)
df <- data.table(data.frame(diamonds))
df <- df[,.(value = sum(price)), by = cut]

windows()
ggplot(data = df, aes(x = cut, y = value/sum(value))) +
  geom_bar(position="dodge", stat="identity") 

** New Answer **

library(ggplot2)
library(data.table)
df <- data.table(data.frame(diamonds))

windows()
ggplot(data = df[,.(value = sum(price)), by = cut], aes(x = cut, y = value/sum(value))) +
  geom_bar(position="dodge", stat="identity") 

答案 1 :(得分:1)

您可以使用dplyr执行此操作:

  diamonds %>%
  group_by(cut) %>%
    mutate(sum_price = sum(price)) %>%
    mutate(prop_sum = price/sum_price) %>%
    ggplot(aes(cut, prop_sum)) +
      geom_bar(stat = "identity", position = "dodge")