On 05/02/2012 04:18 PM, Nicola Van Wilgen wrote:
Dear R-list
I am having some trouble drawing a bar-graph with two groups, both of
which are stacked.
Here are my data in the dput format:
cs.not.log.bp<- (
structure(c(168, 69, 16, 69, 41, 6, 148, 6, 5, 4, 7, 4, 4, 2, 7, 2, 4,
2, 4, 2, 1, 0, 2, 0), .Dim = c(4L, 6L), .Dimnames = list(
c("IUCN.Terrestrial", "IUCN.Marine", "National.CS.Terrestrial",
"National.CS.Marine"), c("NE", "LC", "NT", "VU", "EN", "CR"
))) )
The database format is shown below, where columns represent conservation
status and the rows are two classification methods each split into
marine and terrestrial:
NE LC NT VU EN CR
IUCN.Terrestrial 168 41 5 4 4 1
IUCN.Marine 69 6 4 2 2 0
National.CS.Terrestrial 16 148 7 7 4 2
National.CS.Marine 69 6 4 2 2 0
I would like to plot the conservation status according to two
classifications (i.e. my groups - IUCN status and national status), and
for each of those groups I would like data for the marine and
terrestrial species to be stacked.
I have tried the following code (where cs.not.log.bp is my data), but it
does not work:
barplot(cs.not.log.bp[c(1:2),], xlab = "Conservation status", ylab =
"Number of species", col = c("grey90","grey80"), ylim = c(0,250), space
= 2)
barplot(cs.not.log.bp[c(3:4),], col = c("grey60","grey30"), beside =
T,add = T,names.arg = NA)
legend("topright",c("IUCN Terrestrial","IUCN Marine","National CS
Terrestrial","National CS Marine"), col =
c("grey90","grey80","grey60","grey30"), pch = 15)
What happens is that some of the data in the second group stacks onto
the first group and then the remainder forms a second group. I would
like only "like" data (i.e. from the same database row) to stack within
a group.
There was one other similar post on the R-list
(http://r.789695.n4.nabble.com/barplot-question-td3670861.html ) where
the user had the same problem as I did, but it does not seem that this
was resolved.
Hi Nicola,
This is somewhat unusual. You can do a Q&D like this:
barstack<-function(x,y,heights,width,border=par("fg"),col=NA) {
nrect<-length(heights)
rect(rep(x-width/2,nrect),c(0,cumsum(heights[1:(nrect-1)])),
rep(x+width/2,nrect),cumsum(heights),border=border,col=col)
}
cs.not.log.bp <- (structure(c(168, 69, 16, 69, 41, 6, 148,
6, 5, 4, 7, 4, 4, 2, 7, 2, 4,
2, 4, 2, 1, 0, 2, 0), .Dim = c(4L, 6L),
.Dimnames = list(
c("IUCN.Terrestrial", "IUCN.Marine", "National.CS.Terrestrial",
"National.CS.Marine"), c("NE", "LC", "NT", "VU", "EN", "CR"))))
plot(0,xlim=c(0.5,6.5),ylim=c(0,240),type="n")
for(stack in 1:6) {
barstack(stack-0.2,0,cs.not.log.bp[1:2,stack],0.4,
col=c("lightblue","blue"))
barstack(stack+0.2,0,cs.not.log.bp[3:4,stack],0.4,
col=c("lightgreen","green"))
}
legend(4,200,c("IUCN Terrestrial","IUCN Marine",
"National Terrestrial","National Marine"),
fill=c("lightblue","blue","lightgreen","green"))
If you only need this one illustration, that is probably the easiest
thing to do. You can add the appropriate title, axis labels and x-axis
tick labels to finish it off. If you need to do a lot of this, it could
be wrapped up in a little function that would incorporate or call the
"barstack" function.
Jim
______________________________________________
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.