2012-05-07 5 views
7

Sto cercando di capire come determinare i valori dei punti centrali delle barre raggruppate, ovvero le posizioni X effettive del centro di ciascuna barra. Questo è facilmente fatto nella funzione R barplot di base, tuttavia mi piacerebbe poterlo fare in reticolo 's barchart. Il mio obiettivo è visualizzare i valori della colonna di testo in cima alla barra corrispondente.Ottenimento dei valori dei punti medi delle barre raggruppate nella funzione del diagramma a barre tratteggiato

Il codice seguente consente di posizionare il testo sopra le barre finché non utilizzo i sottogruppi. Ho provato a cercare su Internet la soluzione, ma nulla sembra funzionare. Come puoi vedere dal grafico, i punti medi sono determinati solo per il centro dell'intero gruppo.

Grazie!

library(lattice) 

test= data.frame(
    group=c("WK 1", "WK 1", "WK 1", "WK 2", "WK 2", "WK 2", "WK 3", "WK 3", "WK 3"), 
    subgroup=c(1,2,3,1,2,3,1,2,3) , 
    percent=c(60,50,80,55,56,65,77,65,86), 
    text=c("n=33", "n=37","n=39","n=25","n=27","n=22","n=13","n=16","n=11") 
) 

barchart(data=test, 
     percent~group, 
     groups=subgroup, 

      panel = function(x,y,...){ 
       panel.barchart(x, y, ...) 
       panel.text(x=unique(test$group), 
          y=test$percent, 
          label=unique(test$text) 
         ) 

      } 
     ) 

enter image description here

+0

Non necessariamente la risposta, ma ho avuto la stessa domanda circa ggplot che avrebbe funzionato per voi trovato [(QUI)] (http://stackoverflow.com/questions/10327267/annotation-above-bars) –

+0

sì, lo so quel ggplot può fare qualcosa del genere ma a questo punto sono un po 'riluttante a usare GGPLOT. Mi piacerebbe essere in grado di farlo in TRELLIS. Ho un programma in R base che risolve anche questo problema. Grazie mille. –

risposta

7

Un modo veloce-and-dirty sarebbe quello di cambiare il corpo di panel.barchart dove i bar sono attratte da includere testo tracciando nei luoghi appropriati.

Creare una nuova funzione del pannello (in generale una buona idea, perché poi la funzione originale è ancora lì, in caso di necessità di ricominciare da capo tutte le volte che faccio io)

myPanelBarchart <- panel.barchart 

Modifica la parte corrispondente della funzione pannello (tieni presente che se non hai più gruppi, se passi in orizzontale, o se impili, questo non funzionerà più). Qui, ho aggiunto una chiamata a panel.text se è stato passato un argomento myPanelBarchart a printVals e non è FALSE. Questo argomento sarà il vettore di caratteri che desideri stampare sopra ogni barra. Deve avere la stessa lunghezza del numero di barre che sono tracciate e nell'ordine corrispondente ai tuoi dati. Non ho aggiunto nulla per verificare che tutto ciò sia vero.

body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]]<-substitute(for (i in unique(x)) { 
    ok <- x == i 
    nok <- sum(ok, na.rm = TRUE) 
    panel.rect(x = (i + width * (groups[ok] - (nvals + 1)/2)), 
     y = rep(origin, nok), col = col[groups[ok]], border = border[groups[ok]], 
     lty = lty[groups[ok]], lwd = lwd[groups[ok]], width = rep(width, 
      nok), height = y[ok] - origin, just = c("centre", 
      "bottom"), identifier = identifier) 
# This is the added part (adjust parameters as you see fit): 
    if(!identical(printVals, FALSE)){ 
     panel.text(x = (i + width * (groups[ok] - (nvals + 1)/2)), y = y[ok], 
     label = printVals[ok], adj = c(0.5, -1), identifier = identifier) 
    }   

}) 

Modifica la lista degli argomenti formale della nuova funzione per aggiungere l'argomento printVals e dare un valore predefinito.

formals(myPanelBarchart) <- c(formals(panel.barchart), printVals = FALSE) 

Trama i dati con la nuova funzione del pannello con il nuovo argomento

barchart(data=test, 
     percent~group, 
     groups=subgroup, 

      panel = function(x,y,...){ 
       myPanelBarchart(x, y, ..., printVals = test$text,) 
      } 
     ) 

che dovrebbe dare

Modified barchart

Così il lungo e breve di esso è che la x le posizioni sono determinate in base all'orientamento e alla composizione della trama. Nel caso di barre verticali, non impilate, raggruppate, le posizioni x sono determinate in body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]].

+0

Questo è geniale !!! Grazie mille. –