Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grouped barplot with cut y axis

Tags:

plot

r

I am trying to make a plot with grouped barplots and a cut y axis. However I don't seem to be able to get both. Using this data:

d = t(matrix( c(7,3,2,3,2,2,852,268,128,150,
              127,74,5140,1681,860,963,866,
              470,26419,8795,4521,5375,4514,2487),
            nrow=6, ncol=4 ))
colnames(d)=c("A", "B", "C", "D", "E", "F")

I can get the grouped barplots like:

barplot( d, beside = TRUE)

Example

I can then get the cut y-axis using:

# install.packages('plotrix', dependencies = TRUE)
require(plotrix)
gap.barplot( as.matrix(d), 
             beside = TRUE, 
             gap=c(9600,23400), 
             ytics=c(0,3000,6000,9000,24000,25200,26400) )

enter image description here

However, then I loose the grouping and the A, B, C... labeling. How can I get both?

like image 612
jonalv Avatar asked Jun 13 '14 09:06

jonalv


2 Answers

You could do this manually. Like barplot, ?gap.barplot returns the center positions of the bars. Use these to add the labels.

Using space for spacing between groups as in regular barplot does not seem to work. We can use a row of NAs to hack a space.

d = t(matrix( c(7,3,2,3,2,2,852,268,128,150,
                                127,74,5140,1681,860,963,866,
                                470,26419,8795,4521,5375,4514,2487),
                            nrow=6, ncol=4 ))
colnames(d)=c("A", "B", "C", "D", "E", "F")

# add row of NAs for spacing
d=rbind(NA,d)

# install.packages('plotrix', dependencies = TRUE)
require(plotrix)

# create barplot and store returned value in 'a'
a = gap.barplot(as.matrix(d), 
                gap=c(9600,23400), 
                ytics=c(0,3000,6000,9000,24000,25200,26400),
                xaxt='n') # disable the default x-axis

# calculate mean x-position for each group, omitting the first row 
# first row (NAs) is only there for spacing between groups
aa = matrix(a, nrow=nrow(d))
xticks = colMeans(aa[2:nrow(d),])

# add axis labels at mean position
axis(1, at=xticks, lab=LETTERS[1:6])
like image 199
koekenbakker Avatar answered Sep 23 '22 19:09

koekenbakker


With the help of the answer by koekenbakker I came up with this at last:

# install.packages('plotrix', dependencies = TRUE)
require(plotrix)

d = t(matrix( c(7,3,2,3,2,2,852,268,128,150,
                127,74,5140,1681,860,963,866,
                470,26419,8795,4521,5375,4514,2487),
              nrow=6, ncol=4 ))

# Hack for grouping (leaves the extra space at the end)
e = as.vector(rbind(d, rep(NA, 6)))[1:29]

a = gap.barplot(ceiling(as.matrix(e/60)), 
                gap=c(160,390),
                col=rep(c(grey.colors(4), 1), 6),
                #space=rep(c(rep(0,3), 1), 6),
                ytics=c(0,50,100,150,400,420,440),
                xaxt='n') # disable the default x-axis

xticks=c(2.5, 7.5, 12.5, 17.5, 22.5, 27.5)

# add axis labels at mean position
axis(1, at=xticks, LETTERS[1:6] )

legend("topright", LETTERS[7:10],
       bty="n",  
       fill=grey.colors(4)) 

enter image description here

like image 23
jonalv Avatar answered Sep 23 '22 19:09

jonalv