Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

display values in stacked lattice barchart

I want to display the values of a 100% bar for each part of it. Unfortunately I don't know how to do it. The graph should be in lattice because of the legend position (I tried it with ggplot2, but you can't show the legend in one row). I'm pleased about any suggestions or ideas.

library(lattice)
data(postdoc, package = "latticeExtra")
colnames(postdoc) <- c("Legendtext 1", "2", "3", "4", "5")
colorset <- simpleTheme(col = c(rgb(166,27,30,maxColorValue = 255),
                                rgb(192,80,77,maxColorValue = 255), 
                                rgb(24,65,83,maxColorValue = 255),
                                rgb(60,143,167,maxColorValue = 255),
                                rgb(130,184,208,maxColorValue = 255)),
                                border = "white")
pl <- barchart(prop.table(postdoc, margin = 1),
               par.settings = colorset,
               auto.key = list(columns = 5, space = "bottom",
                               cex = 0.8, size = 1.4, between = 0.2,
                               between.columns = 0.1, adj = 1))
like image 343
SebastianW Avatar asked Jul 10 '10 20:07

SebastianW


1 Answers

This is achieved using a custom panel function:

library(lattice)
library(plyr)

data(postdoc, package="latticeExtra")
colnames(postdoc) <- c("Legendtext 1", "2", "3", "4", "5")
colors <- c(rgb(166,27,30,maxColorValue = 255),
            rgb(192,80,77,maxColorValue = 255),
            rgb(24,65,83,maxColorValue = 255),
            rgb(60,143,167,maxColorValue = 255),
            rgb(130,184,208,maxColorValue = 255))
colorset <- simpleTheme(col=colors,
                        border="white")

pl <- barchart(prop.table(postdoc, margin=1),
               par.settings=colorset,
               panel=function(...) {
                 panel.barchart(...) 
                 tmp <- list(...)
                 tmp <- data.frame(x=tmp$x, y=tmp$y)
                 # calculate positions of text labels
                 df <- ddply(tmp, .(y),
                             function(x) {
                               data.frame(x, pos=cumsum(x$x)-x$x/2)
                             })
                 panel.text(x=df$pos, y=df$y,
                            label=sprintf("%.02f", df$x),
                            cex=0.7)
               },
               auto.key=list(columns=5, space="bottom",
                             cex=0.8, size=1.4, adj=1,
                             between=0.2, between.colums=0.1))

lattice plot

like image 94
rcs Avatar answered Sep 21 '22 22:09

rcs