Thanks a lot, Ista! On Tue, Sep 28, 2010 at 10:00 AM, Ista Zahn <iz...@psych.rochester.edu> wrote: > Hi Dimitri, > I'm not proficient with base graphics, but here is a ggplot solution: > > my.data.m <- melt(my.data, id="date") > my.data.m$pn <- "+" > my.data.m[my.data.m$variable %in% c("y", "z"), "pn"] <- "-" > my.data.m$variable <- factor(my.data.m$variable, levels=c("a", "x", "y", "z")) > my.data.m$Date <- as.numeric(my.data.m$date) > > ggplot(my.data.m, aes(x=Date, y=value, fill=variable)) + > geom_area(data=subset(my.data.m, pn=="+")) + > geom_area(data=subset(my.data.m, pn=="-")) + > scale_x_continuous(breaks=unique(my.data.m$Date), > labels=unique(my.data.m$date)) + > scale_fill_manual(values=c("yellow", "blue", "green", "orange")) + > theme_bw() + > ylab("Title of Y") + > opts(title="Chart title", axis.text.x=theme_text(angle=70, vjust=1, hjust=1)) > > > HTH, > Ista > > On Mon, Sep 27, 2010 at 6:05 PM, Dimitri Liakhovitski > <dimitri.liakhovit...@gmail.com> wrote: >> I found a solution to my original question (see code below). >> But I have a question about cosmetics, which I always find very challenging. >> 1. How can I make all dates appear on the X axis (rotated at 90 >> degrees vs. horizontal)? >> 2. How can I create vertical grid lines so that at each date there is >> a gridline? >> 3. How can I create a legend for colors, but not on top of the graph >> but on the right side, outside of the graph (because in my real data >> set I have a lot of variables - so that there'll never be enough space >> for the legend in the graph itself) >> >> Thanks a lot! >> Dimitri >> >> >> ### Creating a data set with both positives and negatives >> my.data<-data.frame(date=c(20080301,20080402,20080503,20090301,20090402,20090503,20100301,20100402,20100503), >> x=c(1.1,1.0,1.6,1,2,1.5,2.1,1.3,1.9),y=c(-4,-3,-6,-5,-7,-5.2,-6,-4,-4.9), >> z=c(-0.2,-0.3,-0.4,-0.1,-0.2,-0.05,-0.2,-0.15,-0.06),a=c(10,13,15,15,16,17,15,16,14)) >> my.data$date<-as.character(my.data$date) >> my.data$date<-as.Date(my.data$date,"%Y%m%d") >> (my.data) >> >> positives<-which(colSums(my.data[2:ncol(my.data)])>0) # which vars >> have positive column sums? >> negatives<-which(colSums(my.data[2:ncol(my.data)])<0) # which vars >> have negative column sums? >> >> y.max<-1.1*max(rowSums(my.data[names(positives)])) # the max on the y >> axis of the chart >> y.min<-1.1*min(rowSums(my.data[names(negatives)])) # the min on the y >> axis of the chart >> ylim <- c(y.min, y.max) >> order.positives<-rev(rank(positives)) >> order.of.pos.vars<-names(order.positives) >> order.negatives<-rev(rank(negatives)) >> order.of.neg.vars<-names(order.negatives) >> order<-c(order.negatives,order.positives) >> order.of.vars<-names(order) # the order of variables on the chart - >> from the bottom up >> ### so, the bottom-most area should be for z, the second from the >> bottom area- for y (above z) >> >> all.colors<-c('red','blue','green','orange','yellow','purple') >> xx <- c(my.data$date, rev(my.data$date)) >> bottom.y.coordinates<-rowSums(my.data[names(negatives)]) >> >> plot(x=my.data$date, y=bottom.y.coordinates, ylim=ylim, col='white', >> type='l', xaxt='n', >> ylab='Title for Y', xlab='Date', main='Chart Title') >> >> for(var in order.of.neg.vars){ >> top.line.coords<-bottom.y.coordinates-my.data[[var]] >> bottom.coords<-c(bottom.y.coordinates,rev(top.line.coords)) >> polygon(xx,bottom.coords,col=all.colors[which(names(my.data) %in% >> var)]) >> bottom.y.coordinates<-top.line.coords >> } >> >> for(var in order.of.pos.vars){ >> top.line.coords<-bottom.y.coordinates+my.data[[var]] >> bottom.coords<-c(bottom.y.coordinates,rev(top.line.coords)) >> polygon(xx,bottom.coords,col=all.colors[which(names(my.data) %in% >> var)]) >> bottom.y.coordinates<-top.line.coords >> } >> >> >> >> On Mon, Sep 27, 2010 at 11:47 AM, Dimitri Liakhovitski >> <dimitri.liakhovit...@gmail.com> wrote: >>> Dear R-ers! >>> >>> Asking for your help with building the stacked area chart for the >>> following simple data (several variables - with date on the X axis): >>> >>> ### Creating a data set >>> my.data<-data.frame(date=c(20080301,20080402,20080503,20090301,20090402,20090503,20100301,20100402,20100503), >>> x=c(1.1,1.0,1.6,1,2,1.5,2.1,1.3,1.9),y=c(-4,-3,-6,-5,-7,-5.2,-6,-4,-4.9), >>> z=c(-0.2,-0.3,-0.4,-0.1,-0.2,-0.05,-0.2,-0.15,-0.06),a=c(4,3,5,5,6,7,5,6,4)) >>> my.data$date<-as.character(my.data$date) >>> my.data$date<-as.Date(my.data$date,"%Y%m%d") >>> (my.data) >>> >>> I'd like the variables whose column values sum up to a negative number >>> to be below zero on that chart and those that add up to a positive >>> number to be above zero in the chart. I am calculating values for ylim >>> and for the order of the variable entry (bottom up) like this: >>> >>> positives<-which(colSums(my.data[2:ncol(my.data)])>0) # which vars >>> have positive column sums? >>> negatives<-which(colSums(my.data[2:ncol(my.data)])<0) # which vars >>> have negative column sums? >>> >>> y.max<-1.1*max(rowSums(my.data[names(positives)])) # the max on the y >>> axis of the chart >>> y.min<-1.1*min(rowSums(my.data[names(negatives)])) # the min on the y >>> axis of the chart >>> ylim <- c(y.min, y.max) # ylim for the stacked area chart >>> >>> order.positives<-rev(rank(positives)) >>> order.negatives<-rev(rank(negatives)) >>> order<-c(order.negatives,order.positives) >>> order.of.vars<-names(order) # the order of variables on the chart - >>> bottom up >>> ### so, the bottom-most area should be for z, and the second from the >>> bottom area- for y (above z) - they'll be below zero >>> ### and above zero we'll have a first and x second (on top of a). >>> >>> Thanks a lot for your advice! >>> >>> -- >>> Dimitri Liakhovitski >>> Ninah Consulting >>> www.ninah.com >>> >> >> >> >> -- >> Dimitri Liakhovitski >> Ninah Consulting >> www.ninah.com >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > > > -- > Ista Zahn > Graduate student > University of Rochester > Department of Clinical and Social Psychology > http://yourpsyche.org >
-- Dimitri Liakhovitski Ninah Consulting www.ninah.com ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.