Search code examples
imagerimportstacked

How to assign picture to stacked bar plot


I am working on stacked bar plot but i need to assign image here hand on particular stack.

enter image description here

enter image description here

How can i do this in R.

DF = data.frame(names = c("tomato", "potato", "cabbage", 
                          "sukuma-wiki", "terere"),
                freq=c(7,4,5,8,20))
barplot(as.matrix(DF[,2]), col=heat.colors(length(DF[,2])), 
        legend=DF[,1], xlim=c(0,9), width=2)

enter image description here


Solution

  • Here is a way, how you could do it with grid.

    # libraries
    library(jpeg)
    library(grid)
    
    # a is your image
    a <- readJPG("foo.jpg")
    
    # ypos.img is at which height of the barchart you want to place the image
    ypos.img <- 10
    
    # Create a new polot
    grid.newpage()
    pushViewport(viewport(width=0.9, height=0.9))
    
    # add image
    pushViewport(viewport(yscale=c(0,sum(DF[,2])), xscale=c(0,1), x=0, y=0, width=0.4, height=1, just=c("left", "bottom")))
    grid.raster(a, y=unit(ypos.img, "native"))
    
    # add barplot
    popViewport()
    pushViewport(viewport(x=0.4, y=0, width=0.6, height=1, just=c("left", "bottom")))
    pushViewport(dataViewport(xscale=c(0,2), yscale=c(0, sum(DF[,2]))))
    cols <- heat.colors(length(DF[,2]))
    
    for (i in 1:nrow(DF)) {
     start <- 0 
     if (i > 1) start <- sum(DF[1:(i-1), 2])
     grid.rect(x=0, y=start, width=1, height=DF[i, 2], default.units="native", just=c("left", "bottom"), gp=gpar(fill=cols[i]))
    }
    
    popViewport(2)
    
    # Legend
    pushViewport(viewport(x=0.75, y=0, width=0.25, height=1, just=c("left", "bottom")))
    ypos <- 0.8
    for (i in 1:nrow(DF)) {
     grid.rect(x=0.05, y=ypos, width=0.1, height=0.05, just=c("left", "bottom"), gp=gpar(fill=cols[i]))
     grid.text(DF[i,1], x=0.2, y=ypos, just=c("left", "bottom"))
     ypos <- ypos - 0.05
    }
    
    popViewport()