我有以下示例数据集
dump.stack<-structure(list(vanilla = c(16438L, 15877L, 16141L, 15490L, 15468L
), berry = c(27235L, 26692L, 25964L, 25762L, 24961L), orange = c(15825L,
16278L, 16413L, 16714L, 16881L), lemon = c(40502L, 41153L, 41482L,
42034L, 42690L), age = c(20, 21, 22, 23, 24)), .Names = c("vanilla",
"berry", "orange", "lemon", "age"), row.names = c(NA, -5L), class = "data.frame")
对于每个age
,答案总数最多为100000.我想在X轴上使用带有age
的堆积条形图以及每种风格中的个体比例/百分比来绘制图表。 Y轴。
我试了barplot(as.matrix(dump.stack))
但没有成功。我认为barplot
和cdplot
需要对数据进行转换,但我无法确定如何。
如何使用堆叠的火炮来做到这一点?也可以使用cdplot()
来绘制图形(因为从统计上讲,图形将是条件密度)。
我会支持R,但如果不可能,我也会接受ggplot2解决方案。
答案 0 :(得分:1)
尝试:
mm = melt(dump.stack, id='age')
mm$percent = mm$value*100/100000
library(ggplot2)
ggplot(mm)+geom_bar(aes(x=age, y=percent, fill=variable), stat='identity')
答案 1 :(得分:1)
对于基数R:
mm = melt(dump.stack, id='age')
mm$percent = mm$value*100/100000
mm=mm[,c(1,2,4)]
barplot(with(mm3, tapply(value, list(variable,age), sum)), legend=TRUE)
编辑:使用以下代码也可以获得相同的结果:
rownames(dump.stack)=dump.stack$age
dump.stack = dump.stack[,-5]
dump.stack = dump.stack/1000
barplot(t(dump.stack), legend=TRUE)
答案 2 :(得分:1)
关于您对cdplot
(或其他基本策略)的区域图的请求...只需使用数据元素的转置。 cdplot
的帮助页面显示它与spineplot
类似。 spineplot
将各个列放在......呃,行中。
spineplot(t(dump.stack[-5]))
我认为它比条形图具有明显的优势,即列的宽度是提供信息的。您还可以进行进一步转置(以保持输入矩阵)并使每列成为一个单独的年龄(可能是您在开始时想要的):
png(); spineplot(t(t(dump.stack[-5])),
xaxlabels=dump.stack[[5]], ylab="Preferences", xlab="Ages"); dev.off()