我有一个包含以下列的数据框:product_id
,...,p1
,p2
,p3
,...等p列只有 0或1 作为其单元格数据。
我想要一个总结(或统计)p1
,p2
等的条形图,并将每个p列显示为具有总和值的条形(使用 ggplot < /强>)。
此外,我想按product_id
填充颜色。
似乎重新整理长格式的数据可能会有所帮助,但我仍然坚持。
这是已经重新塑造的最小数据集:
product_id <- c(1, 2, 3, 1, 2, 3, 1, 2, 3)
p1 <- c(0, 0, 1, 1, 0, 0, 1, 0, 0)
p2 <- c(1, 0, 1, 0, 1, 0, 1, 1, 0)
p3 <- c(0, 0, 1, 1, 0, 1, 0, 1, 1)
df1 <- data.frame(product_id, p1, p2, p3)
df2 <- melt(df1, id.vars = "product_id",
measure.vars = grep("^p[0-9]", names(df1), value = TRUE),
variable.name = "p",
value.name = "p-active")
答案 0 :(得分:4)
有几十个ggplot2教程,但我感觉很慷慨:
ggplot(df2,
#map columns to aesthetics:
aes(x = p, y = `p-active`,
#important to use a factor for discrete values:
fill = factor(product_id),
color = factor(product_id))) +
#summarize data:
stat_summary(fun.y = sum,
#the geom:
geom = "bar",
#positioning:
position = "dodge")
答案 1 :(得分:3)
我不确定我到底知道你想要什么,但我会试一试:
我稍微更改了重塑,因为在数据框列的名称中使用-
不是一个好主意:
df2 <- melt(df1, id.vars = "product_id",
measure.vars = grep("^p[0-9]", names(df1), value = TRUE),
variable.name = "p",
value.name = "p_active")
下一步是总结p_active
和p
每个值product_id
的值:
library(dplyr)
df2_summed <- group_by(df2, product_id, p) %>%
summarise(p_active_summed = sum(p_active))
最后,我创建了情节:
library(ggplot2)
ggplot(df2_summed, aes(x = p, y = p_active_summed, fill = as.factor(product_id))) +
geom_col()