R中的堆积条形图:正确格式化数据

时间:2014-11-30 14:28:59

标签: r

我有一个政治捐款的数据框架,按年月和政党分列(总和是我的人口总数,中位数是给出的中位数贡献):

> 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 2001barplot(contribs)barplot(as.matrix(contribs)),我想我还没有正确理解数据需要的方式格式化。

我认为,对于我想要生成的堆积条形图,我需要将数据格式化为这样,并使用melt(contribs)值作为列名:

DATE

但是,我不确定如何将数据纠缠成这种格式。有人有任何提示吗?谢谢你的帮助!

2 个答案:

答案 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)

enter image description here

更新

 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

enter image description here