display values in stacked lattice barchart

2019-01-23 06:55发布

问题:

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))

回答1:

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 http://img819.imageshack.us/img819/894/panelbarchart.png