2013-06-04 7 views
5

Nel follow-up della discussione sulla stackexchange ho cercato di implementare il seguente graficoCome per tracciare valori assoluti e le differenze tra gli intervalli di confidenza

Cumming Finch Plot da

Cumming, G., & Finch, S. (2005). [Inferenza dell'occhio: intervalli di confidenza e come leggere le immagini dei dati] [5]. Psicologo americano, 60 (2), 170-180. doi: 10.1037/0003-066X.60.2.170

Condivido l'antipatia di alcune persone del doppio asse, ma penso che sia un uso corretto.

Sotto il mio tentativo parziale, manca ancora il secondo asse. Sto cercando alternative più eleganti, sono benvenute variazioni intelligenti.

library(lattice) 
library(latticeExtra) 
d = data.frame(what=c("A","B","Difference"), 
       mean=c(75,105,30), 
       lower=c(50,80,-3), 
       upper = c(100,130,63)) 

# Convert Differences to left scale 
d1 = d 
d1[d1$what=="Difference",-1] = d1[d1$what=="Difference",-1]+d1[d1=="A","mean"] 

segplot(what~lower+upper,centers=mean,data=d1,horizontal=FALSE,draw.bands=FALSE, 
     lwd=3,cex=3,ylim=c(0,NA),pch=c(16,16,17), 
     panel = function (x,y,z,...){ 
      centers = list(...)$centers 
      panel.segplot(x,y,z,...) 
      panel.abline(h=centers[1:2],lty=3) 
     }) 
## How to add the right scale, close to the last bar? 

enter image description here

+0

Nel codice, penso che sia necessario caricare il pacchetto 'latticeExtra' per ottenere la funzione' segplot() '. – smillig

+0

Grazie, corretto. –

risposta

4
par(mar=c(3,5,3,5)) 
plot(NA, xlim=c(.5,3.5), ylim=c(0, max(d$upper[1:2])), bty="l", xaxt="n", xlab="",ylab="Mean") 
points(d$mean[1:2], pch=19) 
segments(1,d$mean[1],5,d$mean[1],lty=2) 
segments(2,d$mean[2],5,d$mean[2],lty=2) 
axis(1, 1:3, d$what) 
segments(1:2,d$lower[1:2],1:2,d$upper[1:2]) 
axis(4, seq((d$mean[1]-30),(d$mean[1]+50),by=10), seq(-30,50,by=10), las=1) 
points(3,d$mean[1]+d$mean[3],pch=17, cex=1.5) 
segments(3,d$lower[3]+d$lower[2],3,d$lower[3]+d$upper[2], lwd=2) 
mtext("Difference", side=4, at=d$mean[1], line=3) 

enter image description here

+0

Gli appassionati di grafica di base abbondano.Questo sembra davvero buono. Probabilmente le linee tratteggiate dovrebbero andare come nella trama originale (la mia è sbagliata), e sposterei il secondo asse un po 'più a destra. –

+0

Le linee orizzontali sono facili da uccidere, e se vuoi che l'asse si muova leggermente, cambierei semplicemente il limite superiore di 'xlim' in' plot', che dovrebbe lasciare tutto il resto allo stesso modo. – Thomas

+0

Questo è il più vicino all'originale come uno potrebbe venire. Tuttavia, sto ancora pensando ai modi per rendere evidente a prima vista che si è differenza, l'altro assoluto. Forse meglio posizionare il secondo asse lasciato alla barra delle differenze? –

1

penso che si può fare anche con la base R, che dire:

d = data.frame(what=c("A","B","Difference"), 
       mean=c(75,105,30), 
       lower=c(50,80,-3), 
       upper = c(100,130,63)) 

plot(-1,-1,xlim=c(1,3),ylim=c(0,140),xaxt="n") 

lines(c(1,1),c(d[1,3],d[1,4])) 
points(rep(1,3),d[1,2:4],pch=4) 

lines(c(1.5,1.5),c(d[2,3],d[2,4])) 
points(rep(1.5,3),d[2,2:4],pch=4) 

lines(c(2,2),c(d[3,3],d[3,4])) 
points(rep(2,3),d[3,2:4],pch=4) 

lines(c(1.5,2.2),c(d[2,2],d[2,2]),lty="dotted") 

axis(1, at=c(1,1.5,2), labels=c("A","B","Difference")) 
axis(4,at=c(40,80,120),labels=c(-1,0,1),pos=2.2) 

ho semplificato alcune cose e non hanno scritto come funzione, ma penso che il l'idea è chiara e potrebbe essere facilmente estesa a una funzione.

+0

Sì, il grafico di base va bene, ed è facile usare un secondo asse con esso. Sono un po 'aggressivo, perché spero di poterlo usare con i pannelli. –

+0

La differenza è posizionata in modo errato, ma potrebbe essere facilmente modificata utilizzando il set di dati d1 derivato invece di d –

+0

Uh, forse ho scelto gli elementi errati da 'd', ho pensato di scrivere righe che simboleggiano l'idea, quindi ho rifugio Controlliamo se l'output ha senso, come pensavo quando ti si addice, devi comunque aggiustarlo. E mi dispiace chiedere, ma cosa intendi con "usalo con i pannelli"? Finora non ho usato il reticolo, quindi sono un po 'confuso su quale sia il vantaggio. –

3

Come punto di partenza un'altra soluzione R base con Hmisc:

library(Hmisc) 

with(d1, 
    errbar(as.integer(what),mean,upper,lower,xlim=c(0,4),xaxt="n",xlab="",ylim=c(0,150)) 
    ) 
points(3,d1[d1$what=="Difference","mean"],pch=15) 
axis(1,at=1:3,labels=d1$what) 
atics <- seq(floor(d[d$what=="Difference","lower"]/10)*10,ceiling(d[d$what=="Difference","upper"]/10)*10,by=10) 
axis(4,at=atics+d1[d1=="A","mean"],labels=atics,pos=3.5) 

+0

La presenza di 0 sull'asse aggiuntivo è importante. –

+1

Aggiornato di conseguenza. – Roland

3

Vorrei anche andare con il grafico di base, in quanto include la possibilità di effettivamente avere due assi y, vedere the answer here:

Ecco il mio soultion che utilizza solo d:

xlim <- c(0.5, 3.5) 

plot(1:2, d[d$what %in% LETTERS[1:2], "mean"], xlim = xlim, ylim = c(0, 140), 
    xlab = "", ylab = "", xaxt = "n", bty = "l", yaxs = "i") 
lines(c(1,1), d[1, 3:4]) 
lines(c(2,2), d[2, 3:4]) 

par(new = TRUE) 
plot(3, d[d$what == "Difference", "mean"], ylim = c(-80, 130), xlim = xlim, 
    yaxt = "n", xaxt = "n", xlab = "", ylab = "", bty = "n") 
lines(c(3,3), d[3, 3:4]) 
Axis(x = c(-20, 60), at = c(-20, 0, 20, 40, 60), side = 4) 
axis(1, at = c(1:3), labels = c("A", "B", "Difference")) 

che dà:
enter image description here

per renderlo più chiaro che la differenza è qualcosa di diverso, è possibile aumentare la distanza dagli altri due punti:

xlim <- c(0.5, 4) 
plot(1:2, d[d$what %in% LETTERS[1:2], "mean"], xlim = xlim, ylim = c(0, 140), 
    xlab = "", ylab = "", xaxt = "n", bty = "l", yaxs = "i") 
lines(c(1,1), d[1, 3:4]) 
lines(c(2,2), d[2, 3:4]) 

par(new = TRUE) 
plot(3.5, d[d$what == "Difference", "mean"], ylim = c(-80, 130), xlim = xlim, 
    yaxt = "n", xaxt = "n", xlab = "", ylab = "", bty = "n") 
lines(c(3.5,3.5), d[3, 3:4]) 
Axis(x = c(-20, 60), at = c(-20, 0, 20, 40, 60), side = 4) 
axis(1, at = c(1,2,3.5), labels = c("A", "B", "Difference")) 
+0

Grazie per il puntatore a quel foglio. Riporterò su stackexchange dopo aver trovato una buona soluzione. –

+0

Probabilmente hai bisogno di giocare con il posizionamento del secondo asse y (fatto tramite il secondo argomento 'ylim'). E sono sempre felice di aiutare con gli indicatori di letteratura che mi sono piaciuti. – Henrik

+0

Non sono sicuro che la soluzione (asse sulla scatola) o quella originale sia migliore. Mi piace la forma a L della grafica sulla carta con il posizionamento non ortodosso dell'asse; è un puntatore che c'è qualcosa di speciale. @ Thomas arriva più vicino. –