neversaint
neversaint

Reputation: 64004

How to create 2x2 bar plot - with side by side pairwise bar in R

I have the following data:

  Method    Metric        E0        E1        E2        E4
1     M1 Precision 0.9661017 0.9622642 1.0000000 0.9655172
2     M2 Precision 0.5330000 0.5350000 0.3780000 0.2140000
3     M1    Recall 0.9736842 0.9736842 0.9473684 0.9473684
4     M2    Recall 1.0000000 1.0000000 1.0000000 0.6670000

What I want to do is to create the above data into the following plot:

enter image description here

In this sketch the height of the bar doesn't reflect the data above, surely.

What's the way to do it? Prefferably without using external libraries like ggplot or lattice.

Upvotes: 0

Views: 2657

Answers (2)

jlhoward
jlhoward

Reputation: 59355

I realize you are trying to avoid external libraries, but ggplot was designed to make this easy.

library(ggplot2)
library(reshape2)

gg <- melt(df,id=1:2)
ggplot(gg) +
  geom_bar(aes(x=Method, y=value, fill=Metric), stat="identity",
           position="dodge")+facet_wrap(~variable)

Upvotes: 4

thelatemail
thelatemail

Reputation: 93813

Here you go:

Import:

dat <- read.table(text="Method  Metric  E0  E1  E2  E4
M1  Precision   0.9661017   0.9622642   1   0.9655172
M2  Precision   0.533   0.535   0.378   0.214
M1  Recall  0.9736842   0.9736842   0.9473684   0.9473684
M2  Recall  1   1   1   0.667",header=TRUE)

Define a layout and some colours:

layout(matrix(c(1,2,5,3,4,5),nrow=2,byrow = TRUE))
#     [,1] [,2] [,3]
#[1,]    1    2    5
#[2,]    3    4    5
barcols <- c("red","blue")

Generate some plots:

sapply(3:6, 
  function(x) {
    bp <- barplot(matrix(dat[,x],nrow=2,byrow=TRUE),beside=TRUE,col=barcols)
    title(main=names(dat[x]))
    axis(1,at=colMeans(bp),c("M1","M2"),lwd=0,lwd.tick=1)
    abline(h=0)
  }
)

Add a legend:

plot(NA,xlim=c(0,1),ylim=c(0,1),ann=FALSE,axes=FALSE)
legend(0,0.6,c("Precision","Recall"),fill=barcols,cex=1.5)

Result:

enter image description here

Upvotes: 3

Related Questions