2010-04-02 23 views
11

In R, dato un vettoreCome tracciare dati raggruppati da un fattore, ma non come un grafico a scatole

casp6 <- c(0.9478638, 0.7477657, 0.9742675, 0.9008372, 0.4873001, 0.5097587, 0.6476510, 0.4552577, 0.5578296, 0.5728478, 0.1927945, 0.2624068, 0.2732615) 

ed un fattore:

trans.factor <- factor (rep (c("t0", "t12", "t24", "t72"), c(4,3,3,3))) 

Voglio creare un grafico in cui i dati i punti sono raggruppati come definito dal fattore. Quindi le categorie dovrebbero essere sull'asse x, i valori nella stessa categoria dovrebbero avere la stessa coordinata x.

Semplicemente facendo plot(trans.factor, casp6) fa quasi quello che voglio, produce un boxplot, ma voglio vedere i singoli punti di dati.

+0

sei legato a tracciare? So che questo è possibile usando ggplot2. – PaulHurleyuk

+0

Niente affatto. In quale pacchetto è ggplot2? – amarillion

+2

Come ha risposto Jonathan, ggplot2 ti consentirà di fare ciò, inoltre ti consentirà di modificare i punti in modo che due punti non si sovrappongano se hanno lo stesso valore y. Controlla il sito Web di Hadley http://had.co.nz/ggplot2/ – PaulHurleyuk

risposta

12
require(ggplot2) 
qplot(trans.factor, casp6) 
+0

Breve e dolce, grazie :) – amarillion

4

si può fare con ggplot2, utilizzando facets. Quando leggo "Voglio creare un grafico in cui i punti dati sono raggruppati come definito dal fattore", la prima cosa che mi è venuta in mente è stata facets.

Ma in questo caso particolare, alternativa più veloce dovrebbe essere:

plot(as.numeric(trans.factor), casp6) 

e si può giocare con le opzioni di scena dopo (type, fg, bg ...), ma vi consiglio di attaccare con ggplot2, dal momento che ha un codice molto più pulito, una grande funzionalità, è possibile evitare la sovrapposizione ... ecc. ecc.

Scopri come gestire i fattori. Hai barplot in sede di valutazione plot(trans.factor, casp6) perche' trans.factor era classe di factor (ironia della sorte, è anche denominato in tale maniero) ... e trans.factor, come tale, è stato dichiarato prima una variabile continua (numerico) entro plot() funzione di ... quindi plot() "sente" la necessità di suddividere i dati e disegnare il boxplot in base a ciascuna parte (se dichiari prima la variabile continua, otterrai un grafico ordinario, giusto?). ggplot2, d'altra parte, interpreta fattore in un modo diverso ... come , variabile numerica "un normale" (questo l'acronimo di sintassi fornita da Jonathan Chang, è necessario specificare geom quando si fa qualcosa di più complesso in ggplot2) .

Ma, supponiamo di avere una variabile continua e un fattore e si desidera applicare l'istogramma su ciascuna parte della variabile continua, definita dai livelli dei fattori. È qui che le cose si complicano con le funzionalità del grafico di base.

# create dummy data 
> set.seed(23) 
> x <- rnorm(200, 23, 2.3) 
> g <- factor(round(runif(200, 1, 4))) 

Utilizzando i grafici di base (package:graphics):

par(mfrow = c(1, 4)) 
tapply(x, g, hist) 

ggplot2 modo:

qplot(x, facets = . ~ g) 

Prova a fare questo con graphics in una riga di codice (punto e virgola e funzioni personalizzate sono considerati barare!):

qplot(x, log(x), facets = . ~ g) 

Speriamo che non ti abbia annoiato a morte, ma ti abbia aiutato!

Cordiali saluti,
aL3xa

3

Si può essere in grado di avvicinarsi a ciò che si vuole utilizzare la grafica reticolari facendo:

library(lattice)  
xyplot(casp6 ~ trans.factor, 
     scales = list(x = list(at = 1:4, labels = levels(trans.factor)))) 
3

Penso che ci sia una soluzione migliore (ho scritto per un workshop qualche giorno fa), ma mi è sfuggito di mente. Ecco un brutto sostituto con la grafica di base. Sentiti libero di annotare l'asse x ad libitum. Personalmente, mi piace la soluzione di Greg.

plot(0, 0, xlim = c(1, 4), ylim = range(casp6), type = "n") 
points(casp6 ~ trans.factor) 
2

Nessun pacchetto aggiuntivo necessario

Sono un po 'in ritardo alla festa, ma ho scoperto che si può ottenere il risultato desiderato molto facilmente con la trama di serie funzione - semplicemente convertire il fattore ad un valore numerico:

plot(as.numeric(trans.factor), casp6) 
+0

Semplice e veloce! Questo ha bisogno di più upvotes – theforestecologist

Problemi correlati