giovedì 10 maggio 2007

Barplots of two sets

x <- c(0.0001, 0.0059, 0.0855, 0.9082)
y <- c(0.54, 0.813, 0.379, 0.35)
# create a two row matrix with x and y
height <- rbind(x, y)
# Use height and set 'beside = TRUE' to get pairs
# save the bar midpoints in 'mp'
# Set the bar pair labels to A:D
mp <- barplot(height, beside = TRUE,
ylim = c(0, 1), names.arg = LETTERS[1:4])
# Nel caso generale, i.e., che si usa di
# solito (height MUST be a matrix)
mp <- barplot(height, beside = TRUE)
# Draw the bar values above the bars
text(mp, height, labels = format(height, 4),
pos = 3, cex = .75)


16 commenti:

  1. Salve Paolo, come stai?
    Senti, sono stanca di tentare a fare un barplot! Con Excel lo faccio subito, ma se lo voglio fare in R... non ci riesco... non capisco come farlo. :(
    Devo fare un barplot come questo http://img360.imageshack.us/i/barplot.jpg/? Ma se faccio barplot con Stack=TRUE mi viene un graffico tutto diverso! sai come si fa?? non voglio perdere più tempo con questo maledetto barplot hahaha... grazie!!

    RispondiElimina
  2. mmmm.... penso che sono riuscita finalmente... che fastidio a volte!!! :S grazie!!

    RispondiElimina
  3. Sono contento che tu sia riuscita a risolvere il tuo problema da sola! :-)
    Se hai tempo e volessi condividere il tuo codice con gli altri lettori del blog non esitare a postarlo di seguito!
    In effetti R, a volte, può risultare un poco stressante! ;-)
    A tale proposito ti consiglio la lettura di R-Inferno (vedi i links accanto) penso che la troverai molto interessante!

    RispondiElimina
  4. Hi Paolo!!

    The code was really easy at the end, but as usual, it took more than it should have :-)

    For your data, it would be like this:

    barplot(height, space=0, border=NA, main="without tick lines")

    or:

    barplot(height, space=0, border=NA, main="with tick lines")
    axis(1, tck=1)

    In my case, what I wanted was to plot one of the outputs from the Structure software
    (http://pritch.bsd.uchicago.edu/software/structure2_2.html), like this one:
    http://img411.imageshack.us/i/barplot.jpg/

    In that case, the code is like this:

    barplot("mydata" border=NA, main="barplot like the one produced by Structure software")
    axis(1, at=c(0, 10, 20, 30, 40, 47, 51, 55, 65, 75), tck=1, labels= c(NA, c(1:9)))

    I still don't know how to put the labels before the tick line, like in the structure plot, but I don't care that much...

    Here are the plots: http://img695.imageshack.us/i/onetip.jpg/

    RispondiElimina
  5. Dear Consu, very nice contribution! Thank you!

    RispondiElimina
  6. You're welcome!! My pleasure!!

    By the way, do you know how can I change the tick position? my boss told me to move them to the middle!! hahaha!!

    PS. What were you doing online at 7:30?? sunday morning?

    RispondiElimina
  7. well... not the tick lines really, the labels...

    RispondiElimina
  8. Dear Consu, I think you should set the axisnames parameter to FALSE then start tinkering the labels using text(). See the examples in ?barplot help page.

    HIH

    RispondiElimina
  9. yeap... I'm trying that now, but instead of text, with leyend... I was not able to insert text outside the plot. Thanks Paolo!

    RispondiElimina
  10. Done! :-)

    barplot(aver2, col=c("green", "blue"), space=0, border=NA, cex.axis=1)

    axis(1, at=c(0, 10, 20, 30, 40, 47, 51, 55, 65, 75), tck=1, labels= NA)

    mtext (c("BI", "PT", "AF", "MA", "BC","NA", "SI", "BA", "CR"), side=1, at=c(5, 15, 25, 35, 43, 49, 53, 61, 71), cex=0.8)

    RispondiElimina
  11. Very good and Thanks for sharing! :-)

    RispondiElimina
  12. Ciao Paolo,
    sono in preda a una crisi di nervi, causa: grouped barplot!
    Io ho il file "stem" di 495 righe e 8 colonne tra cui quelle di mio interesse sono: "Date", "Exp_Flux" e "D". Vorrei tanto fare un barplot in cui sull'asse delle x ci siano le date, sull'asse delle y gli Exp_Flux e le barre dovrebbero essere una per ogni classe diametrica (D).
    Non riesco proprio a capire come gestire i dati, ho usato il comando cut per creare le classi diametriche

    bin <- cut(stem$D, breaks = c(5,10,15,20,25,30),include.lowest=TRUE)
    cond1 <- cond & (bin == levels(bin)[1])
    e così via...
    poi ho usato aggregate per creare degli oggetti che contenessero le medie di 5 misure giornaliera per ogni pianta ma questo script funziona solo se tolgo ":(stem [cond1,"Pianta",])"

    aggregate (stem [cond1,"Exp_Flux",], by=list(stem[cond1,"Date",]):(stem [cond1,"Pianta",]), mean.na.rm )

    Comunque è inutile che vado avanti con i 10000 tentativi che ho fatto, non so proprio gestire i barplot, sarà colpa del fatto che sono 10 ore che sto davanti al pc e del tempo che mi corre dietro ma se tu mi dessi qualche suggerimento te ne sarei immensamente grata :) ... come una delle tue commentartrici ha già detto, con excel ci metterei 2 secondi ma proprio non ce la faccio a tornare indietro...

    RispondiElimina
  13. Scusa se ti ho disturbato inutilmente
    Sembra incredibile ma quando senti che stai per affogare, chiedi aiuto e all'improvviso emergi da quel profondo mare di disperazione!
    Ce l'ho fatta :)
    Non ci stavo capendo veramente nulla, lavoRaRe tRoppo = lavoRaRe male!
    ciao ciao

    RispondiElimina
  14. Non sia mai che tu sia costretta a tornare ad Excel!

    Onestamente non mi è chiaro (è tardi anche per me ;-) ) come tu intenda organizzare i dati per visualizzarli con un barplot.
    Per questo tipo di barplot con fattori i pacchetti plyr e ggplot2 mi sembrano i più adatti.
    Per un barplot che raggruppa le barre per un fattore a scelta (mettiamo la colonna D nel tuo caso) qualcosa di simile dovrebbe (spero) indirizzarti verso la retta via:

    library(ggplot2)
    ggplot(stem, aes(x=Date,y=Exp_Flux, fill=D)) + geom_bar(position="dodge")

    e per uno stacked:

    ggplot(stem, aes(x=Date,y=Exp_Flux, fill=D)) + geom_bar(position="identity")

    Ovviamente questo non funzionerà "as it is" quindi il riferimento al manuale di ggplot2 è d'obbligo:
    http://docs.ggplot2.org/0.9.3/geom_bar.html

    Ci sono diversi esempi che sono certo ti aiuteranno a trovare la soluzione al tuo problema.

    Buon Lavoro!

    RispondiElimina
  15. Ops, ci siamo sovrapposti! ;-) Sono contento, ma non stupito, che l'effetto auto-maieutico ( come mi piace chiamare quando una persona chiede aiuto e prima di ricevere risposta trova da solo la soluzione al suo problema) abbia funzionato ancora una volta! ;-) Se ritieni che sia possibile pubblicare la tua soluzione (con dati fittizi magari) per aiutare altri che SICURAMENTE si scontreranno col tuo stesso problema non esitare a farlo di seguito! Grazie!

    RispondiElimina
  16. Thank's so much, your example was very useful to me :)

    RispondiElimina