2013-06-04 6 views
5

In der Folge der Diskussion über stackexchange Ich habe versucht, die folgende HandlungWie absolute Werte plotten und Unterschiede einschließlich Konfidenzintervall

Cumming Finch Plot von

Cumming, G., & Fink, S. (2005 umzusetzen). [Inferenz mit dem Auge: Konfidenzintervalle und wie man Bilder von Daten liest] [5]. Amerikanischer Psychologe, 60 (2), 170-180. Doi: 10.1037/0003-066X.60.2.170

Ich teile die Abneigung einiger Leute von Doppelachse, aber ich denke, das ist ein fairer Einsatz.

Unterhalb meines Teilversuchs fehlt noch die zweite Achse. Ich suche nach eleganteren Alternativen, intelligente Varianten sind willkommen.

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

In Ihrem Code, ich denke, Sie müssen das 'GitterExtra'-Paket laden, um die' segplot() 'Funktion zu erhalten. – smillig

+0

Danke, korrigiert. –

Antwort

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

Basis Grafik Liebhaber im Überfluss.Das sieht wirklich gut aus. Wahrscheinlich sollten die gestrichelten Linien wie in der ursprünglichen Zeichnung (meine ist falsch) gehen, und ich würde die zweite Achse ein bisschen mehr nach rechts verschieben. –

+0

Horizontale Linien sind einfach zu töten, und wenn Sie möchten, dass die Achse leicht bewegt wird, würde ich einfach die obere Grenze von "xlim" in "plot" ändern, was alles andere gleich lassen sollte. – Thomas

+0

Dies ist so nah an das Original, wie man kommen könnte. Ich denke jedoch immer noch über Möglichkeiten nach, auf den ersten Blick zu erkennen, dass der eine Unterschied, der andere absolut ist. Vielleicht die zweite Achse links besser zum Differenzbalken positionieren? –

1

denke ich, dass auch mit der Basis R tun können, was ist:

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) 

ich einige Dinge vereinfacht und hat schrieb es nicht als Funktion, aber ich denke, das Idee ist klar und könnte leicht zu einer Funktion erweitert werden.

+0

Ja, Grundfläche ist in Ordnung, und es ist einfach, eine zweite Achse damit zu verwenden. Ich bin ein bisschen gitterförmig, weil ich hoffe, dass ich es mit Panels verwenden kann. –

+0

Der Unterschied ist falsch platziert, aber es könnte leicht geändert werden, indem ich meinen abgeleiteten d1-Datensatz anstelle von d –

+0

Uh, vielleicht wählte ich die falschen Elemente aus "d", dachte ich, Zeilen zu schreiben, die die Idee symbolisieren, also ich habe Ich habe überprüft, ob die Ausgabe sinnvoll ist, wie ich dachte, wenn es Ihnen passt, Sie müssen es trotzdem anpassen. Und tut mir leid zu fragen, aber was meinst du mit "benutze es mit Panels"? Ich habe bisher kein Gitter verwendet, daher bin ich ein wenig verwirrt, was den Vorteil davon hat. –

3

Als Ausgangspunkt eine andere Basis R Lösung mit 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

Das Vorhandensein von 0 auf der Extra-Achse ist wichtig. –

+1

wurde entsprechend aktualisiert. – Roland

3

ich auch mit Basisgraphen gehen würde, da es die Möglichkeit, enthält tatsächlich habe zwei Y-Achsen, siehe the answer here:

Hier ist mein soultion, die nur d verwendet:

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")) 

Welche gibt:
enter image description here

Um es deutlicher, dass der Unterschied ist etwas anderes, können Sie erhöhen den Abstand von den anderen zwei Punkten:

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

Danke für den Zeiger auf dieses Papier. Ich werde auf Stackexchange zurückmelden, nachdem ich eine gute Lösung gefunden habe. –

+0

Wahrscheinlich müssen Sie mit der Positionierung der zweiten y-Achse herumspielen (über das zweite 'ylim'-Argument). Und ich bin immer froh, mit Hinweisen auf Literatur, die ich mochte, zu helfen. – Henrik

+0

Ich bin mir nicht sicher, ob Ihre Lösung (Achse auf der Box) oder die ursprüngliche besser ist. Ich mag die L-Form der Grafiken im Papier mit der unorthodoxen Positionierung der Achse; es ist ein Zeiger, dass es etwas Besonderes gibt. @Thomas kommt am nächsten. –