2010-01-27 17 views
7

Vorrei posizionare il valore per ogni barra nel diagramma a barre (reticolo) nella parte superiore di ciascuna barra. Tuttavia, non riesco a trovare alcuna opzione con cui posso raggiungere questo obiettivo. Posso solo trovare le opzioni per l'asse.aggiungi etichette al diagramma a barre reticolo

risposta

19

Creare una funzione di pannello personalizzata, ad es.

library("lattice") 
p <- barchart((1:10)^2~1:10, horiz=FALSE, ylim=c(0,120), 
       panel=function(...) { 
       args <- list(...) 
       panel.text(args$x, args$y, args$y, pos=3, offset=1) 
       panel.barchart(...) 
       }) 
print(p) 

lattice barchart with labels

+1

Fantastico al massimo! –

0

Avrei suggerito di utilizzare il nuovo directlabels package, che può essere utilizzato sia con lattice sia con ggplot (e rende la vita molto facile per questi problemi di etichettatura), ma sfortunatamente non funziona con i diagrammi a barre.

-1

Se si utilizza il parametro groups si trovano le etichette in @ codice di RCS tutte le terre uno sopra l'altro. Questo può essere risolto estendendo panel.text per funzionare come panel.barchart, che è abbastanza facile se si conosce R.

Non riesco a pubblicare il codice della correzione qui per motivi di licenza, mi spiace.

+0

Che cosa significa? Stai sviluppando strumenti proprietari (che dovrebbero essere in-house per essere legali) basati sul reticolo? (Solo curioso.) –

+0

perché una versione con patch di 'panel.text 'sarebbe un'opera derivata. Sono sempre felice di pubblicare esempi di codice che scrivo completamente da solo. Inoltre, potrei avere in qualsiasi momento contratti con il mio datore di lavoro che hanno un impatto sul contributo a GPL. –

0

Dal momento che dovevo farlo comunque, ecco un esempio di codice simile a quello che è abbastanza vicino alla figura, sulla falsariga di ciò che suggerisce @Alex Brown (i punteggi sono un array 2D di qualche tipo, che verrà trasformato in un vettore raggruppate):

barchart(scores, horizontal=FALSE, stack=FALSE, 
    xlab='Sample', ylab='Mean Score (max of 9)', 
    auto.key=list(rectangles=TRUE, points=FALSE), 
    panel=function(x, y, box.ratio, groups, errbars, ...) { 
     # We need to specify groups because it's not actually the 4th 
     # parameter 
     panel.barchart(x, y, box.ratio, groups=groups, ...) 
     x <- as.numeric(x) 
     nvals <- nlevels(groups) 
     groups <- as.numeric(groups) 
     box.width <- box.ratio/(1 + box.ratio) 
     for(i in unique(x)) { 
      ok <- x == i 
      width <- box.width/nvals 
      locs <- i + width * (groups[ok] - (nvals + 1)/2) 
      panel.arrows(locs, y[ok] + 0.5, scores.ses[,i], ...) 
     } 
    }) 

non hanno testato questo, ma i bit importanti (le parti che determinano le locs ecc all'interno della funzione pannello) fare lavoro. Questa è la parte difficile da capire. Nel mio caso, in realtà stavo usando panel.arrows per fare errors (l'orrore!). Ma scores.ses vuole essere una matrice della stessa dimensione dei punteggi.

Proverò a ripulirlo più tardi, ma se qualcun altro lo desidera, sono contento!

Problemi correlati