我有一个政治捐款的数据框架,按年月和政党分列(总和是我的人口总数,中位数是给出的中位数贡献):
> head(contribs)
DATE PARTY SUM MEDIAN
1 Feb 2001 DEM 250 250
2 Mar 2001 DEM 4000 1000
3 Mar 2001 REP 1000 1000
4 Apr 2001 DEM 1000 1000
5 Apr 2001 GRE 500 250
6 May 2001 DEM 1250 625
我试图格式化数据,以便我可以在堆积条形图中显示它,x轴为DATE
,y轴为SUM
,{ {1}}作为堆叠的变量(例如,在x轴上的PARTY
处,我想要一个高度为4000的条形蓝色堆叠在高度为1000的条形图下方。
最终,我想将派对中的贡献叠加作为折线图,但我确信一旦我这样做,我就可以解决这个问题。
我已经尝试了一系列Mar 2001
,barplot(contribs)
,barplot(as.matrix(contribs))
,我想我还没有正确理解数据需要的方式格式化。
我认为,对于我想要生成的堆积条形图,我需要将数据格式化为这样,并使用melt(contribs)
值作为列名:
DATE
但是,我不确定如何将数据纠缠成这种格式。有人有任何提示吗?谢谢你的帮助!
答案 0 :(得分:2)
尝试
library(reshape2)
library(zoo)
df1 <- transform(df[order(as.yearmon(df$DATE)),],
DATE=factor(DATE, levels=unique(DATE)))
m1 <- acast(df1, PARTY~DATE, value.var='SUM', fill=0)
m1
# Feb 2001 Mar 2001 Apr 2001 May 2001
#DEM 250 4000 1000 1250
#GRE 0 0 500 0
#REP 0 1000 0 0
barplot(m1, col=4:2)
legend('topright', legend=row.names(m1), fill=4:2)
par(oma=c(0,0,2,0))
barplot(rep(NA, ncol(m1)), ylim=c(0, max(m1)+2000), axes=FALSE)
barplot(m1, col=4:2, add=TRUE)
abline(v=1.9)
legend('topright', legend=row.names(m1), fill=4:2)
df <- structure(list(DATE = c("Feb 2001", "Mar 2001", "Mar 2001", "Apr 2001",
"Apr 2001", "May 2001"), PARTY = c("DEM", "DEM", "REP", "DEM",
"GRE", "DEM"), SUM = c(250L, 4000L, 1000L, 1000L, 500L, 1250L
), MEDIAN = c(250L, 1000L, 1000L, 1000L, 250L, 625L)), .Names = c("DATE",
"PARTY", "SUM", "MEDIAN"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
答案 1 :(得分:2)
还可以融化数据并使用ggplot
来绘制数据。
融化数据
library(reshape2)
mcont <- melt(contribs[-4]) # ignore "MEDIAN" column
按日期对数据集进行排序(如果尚未排序 - 不是在特定情况下)
indx <- order(as.Date(paste(mcont$DATE, "01"), format = "%b %Y %d"))
mcont <- mcont[indx, ]
使用ggplot
绘制数据(ggplot提供默认颜色,但您可以设置自己的颜色)
library(ggplot2)
ggplot(mcont, aes(DATE, value, fill = PARTY)) +
geom_bar(stat = "identity") +
scale_x_discrete(limits = unique(contribs$DATE)) + # Sort labels according to the correct order
scale_fill_manual(values = 4:2) # Select your own colors if you want