7

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?

jonalv
  • 5,706
  • 9
  • 45
  • 64

2 Answers2

7

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])
koekenbakker
  • 3,524
  • 2
  • 21
  • 30
4

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

jonalv
  • 5,706
  • 9
  • 45
  • 64