2013-10-17 19 views
5

Ho un grafico con 12 variabili diviso in due gruppi. Non posso usare sfaccettature, ma usando colori e forme, sono stato in grado di rendere la visualizzazione facile da capire. Tuttavia, ci sono alcuni punti che si sovrappongono (parzialmente o totalmente). Sto usando jitter per gestire questi, ma come puoi vedere dal grafico allegato, questo porta a spostare tutti i punti, non solo quelli con sovrapposizione. enter image description hereUso condizionale del jitter in ggplot2 con geom_point

C'è un modo di usare jitter o schivare condizionatamente? Ancora meglio, c'è un modo per mettere i punti parzialmente sovrapposti fianco a fianco? Come puoi vedere, il mio asse x è costituito da categorie discrete e un leggero spostamento verso sinistra/destra non ha importanza. Ho provato a usare dotplot con binaxis='y', ma questo rovina completamente l'asse x.

Modifica: This graph è riuscito a fare esattamente quello che sto cercando.

Ulteriori modifiche: aggiunta del codice alla base di questa visualizzazione.

disciplines <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)", "Pol.Sc.\n(40.4%)", "Psychology\n(69.8%)") 

# To stop ggplot from imposing alphabetical ordering on x-axis 
disciplines <- factor(disciplines, levels=disciplines, ordered=T) 

# involved aspects 
intensive <- c(0.660, 0.438, 0.515, 0.028, 0.443) 
comparative <- c(0.361, 0.928, 0.270, 0.285, 0.311) 
wh_adverbs <- c(0.431, 0.454, 0.069, 0.330, 0.577) 
past_tense <- c(0.334, 0.229, 0.668, 0.566, 0.838) 
present_tense <- c(0.680, 0.408, 0.432, 0.009, 0.996) 
conjunctions <- c(0.928, 0.207, 0.162, -0.299, -0.045) 
personal  <- c(0.498, 0.521, 0.332, 0.01, 0.01) 
interrogative <- c(0.266, 0.202, 0.236, 0.02, 0.02) 
sbj_objective <- c(0.913, 0.755, 0.863, 0.803, 0.913) 
possessive <- c(0.896, 0.802, 0.960, 0.611, 0.994) 
thrd_person <- c(-0.244, -0.265, -0.310, -0.008, -0.384) 
nouns  <- c(-0.602, -0.519, -0.388, -0.244, -0.196) 

df1 <- data.frame(disciplines, 
       "Intensive Adverbs"=intensive, 
       "Comparative Adverbs"=comparative, 
       "Wh-adverbs (WRB)"=wh_adverbs, 
       "Verb: Past Tense"=past_tense, 
       "Verb: Present Tense"=present_tense, 
       "Conjunctions"=conjunctions, 
       "Personal Pronouns"=personal, 
       "Interrogative Pronouns"=interrogative, 
       "Subjective/Objective Pronouns"=sbj_objective, 
       "Possessive Pronouns"=possessive, 
       "3rd-person verbs"=thrd_person, 
       "Nouns"=nouns, 
       check.names=F) 

df1.m <- melt(df1) 
grp <- ifelse(df1.m$variable %in% c('3rd-person verbs','Nouns'), 'Informational Features', 'Involved Features') 
g <- ggplot(df1.m, aes(group=grp, disciplines, value, shape=grp, colour=variable)) 
g <- g + geom_hline(yintercept=0, size=9, color="white") 
g <- g + geom_smooth(method=loess, span=0.75, level=0.95, alpha=I(0.16), linetype="dashed") 
g <- g + geom_point(size=4, alpha=I(0.7), position=position_jitter(width=0.1, height=0)) 
g <- g + scale_shape_manual(values=c(17,19)) 
+0

si dovrebbe fornire un esempio riproducibile (dati + codice) di lasciare che gli altri giocare con esso ... – agstudy

+0

codice aggiunto. Speriamo che questo aiuti :-) –

+1

Grazie per il codice. Post scriptum la tua trama non sarà pulita come nell'esempio biomedico perché i tuoi valori Y sono dappertutto, ma puoi ancora allineare i valori x in ordine con lo qui sotto. – beroe

risposta

3

Sono curioso quello che gli altri potrebbero pensare, ma per ottenere l'effetto side-by-side, è possibile codificare le principali categorie asse x come numeri (10, 20, 50 ..) più/meno un piccola quantità come (0..10)/2 in base alle categorie che si stanno utilizzando per il colore. Quindi potresti ottenere l'asse x come 9,6, 9,8, 10,0, 10,2 ... e poi 20,0, 20,2, 20,4. Questo potrebbe creare una trama organizzata invece di assegnare questi aggiustamenti frazionari casualmente.

Ecco una rapida implementazione di questa idea per il set di dati. Compensa la variabile x principale disciplines di un sesto della sottocategoria variable e usa che senza jitter per il valore x ...

M = df1.m 
ScaleFactor = 6 
xadj = as.numeric(M$variable)/ScaleFactor 
xadj = xadj - mean(xadj) # shift it to center around zero 
x10 = as.numeric(M$disciplines) * 10 
M$x = x10 + xadj 
g = ggplot(M, aes(group=grp, x, value, shape=grp, colour=variable)) 
g + geom_point(size=4,alpha=I(0.7)) + scale_x_discrete(breaks=x10,labels=disciplines) 

noti che i valori all'interno di ciascuna categoria verificano uniformemente distanziati e nella stessa ordine. (Questo codice non include tutto il fitting della curva, ecc. Che è mostrato nella figura).

enter image description here

Variante: Si può vedere l'effetto ancora più chiaramente se si "quantizzare" tuoi valori y, quindi più di loro lato trama a fianco.

M$valmod = M$value - M$value %% 0.2 + .1 

Quindi utilizzare valmod al posto di value nella dichiarazione aes() per vedere l'effetto.

Per ripristinare le etichette delle categorie, impostare manualmente con scale_x_discrete. Questa versione utilizza un diverso ScaleFactor per la spaziatura più ampia e l'asse y quantizzato:

M=df1.m 
ScaleFactor = 3 
# Note this could just be xadj instead of adding to data frame 
M$xadj = as.numeric(M$variable)/ScaleFactor 
M$xadj = M$xadj - mean(M$xadj) # shift it to center around zero 
M$x10 = as.numeric(M$disciplines) * 10 
M$x = M$x10 + M$xadj 

Qfact = 0.2 # resolution to quantize y values 
M$valmod = M$value - M$value %% Qfact + Qfact/2 # clump y to given resolution 

g = ggplot(M, aes(group=grp, x, valmod, shape=grp, colour=variable)) + 
    scale_x_discrete(limits = M$x10, breaks=unique(M$x10),labels=levels(M$disciplines)) 
g + geom_point(size=3,alpha=I(0.7)) 

quantized

+0

Sto usando 'height = 0' nel mio jitter. Le posizioni verticali di tutti i punti sono direttamente dai dati. Semplicemente non mi piace come la posizione orizzontale viene spostata anche quando non ci sono altri punti dati vicino. –

+0

Sembra fantastico! Ma ...c'è un modo per recuperare i nomi delle categorie originali sull'asse x invece dei valori numerici? –

+0

Sì, era "un esercizio per il lettore" ma l'ho aggiunto in ... Mi piacerebbe vedere questo "jitter uniforme" aggiunto alla base ggplot2. Forse anche alcuni dei guru R avrebbero un altro approccio. – beroe

Problemi correlati