2013-06-04 25 views
5

W obserwacji dyskusji na stackexchange starałem się realizować następujące działkiJak wykreślić wartości i różnice bezwzględne tym przedziałem ufności

Cumming Finch Plot z

Cumming, G., & Finch, S. (2005). [Wnioskowanie przez oko: przedziały ufności i jak czytać zdjęcia danych] [5]. Amerykański psycholog, 60 (2), 170-180. doi: 10.1037/0003-066X.60.2.170

Dzielę się niechęcią niektórych ludzi do podwójnej osi, ale myślę, że jest to dozwolony użytek.

Pod moją częściową próbą nadal brakuje drugiej osi. Poszukuję bardziej eleganckich alternatyw, mile widziane są inteligentne odmiany.

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

W twoim kodzie, myślę, że musisz załadować pakiet 'latticeExtra', aby uzyskać funkcję' segplot() '. – smillig

+0

Dzięki, poprawione. –

Odpowiedz

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

Mnóstwo miłośników grafiki bazowej.To wygląda naprawdę dobrze. Prawdopodobnie linie przerywane powinny przebiegać tak, jak na pierwotnym wykresie (moje jest złe), a drugą oś przesunę nieco bardziej w prawo. –

+0

Poziome linie są łatwe do zabicia, a jeśli chcesz, aby oś lekko się przesunęła, po prostu zmieniłbym górny limit 'xlim' w' plot', co powinno pozostawić wszystko inne tak samo. – Thomas

+0

To jest tak blisko oryginału, jak tylko można przyjść. Nadal jednak myślę o sposobach, aby na pierwszy rzut oka zauważyć, że jedna jest różnicą, a druga absolutna. Może lepiej ustawić drugą oś na pasku różnicy? –

1

myślę, że można to zrobić również z podstawy R, co na temat:

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) 

I uprościć pewne rzeczy i nie napisał ją jako funkcję, ale myślę, że pomysł jest jasny i można go łatwo rozszerzyć na funkcję.

+0

Tak, wykres bazowy jest w porządku i łatwo jest z nim korzystać z drugiej osi. Jestem trochę latticish, ponieważ mam nadzieję, że będę mógł go używać z panelami. –

+0

Różnica jest umieszczona niepoprawnie, ale można ją łatwo zmienić za pomocą mojego wyprowadzonego zestawu danych d1 zamiast d –

+0

Uh, może wybrałem niewłaściwe elementy z 'd', myślałem, że piszę linie, które symbolizują ten pomysł, stąd mam 't sprawdzone, czy wyjście ma sens, jak myślałem, kiedy ci pasuje, i tak musisz to zmienić. I przepraszam, że pytam, ale co masz na myśli mówiąc "użyj go z panelami"? Do tej pory nie stosowałem krat, więc jestem nieco zdezorientowany, co jest tego zaletą. –

3

Jako punkt wyjścia drugiego roztworze bazowym R z 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

Ważna jest obecność 0 na dodatkowej osi. –

+1

Zaktualizowano odpowiednio. – Roland

3

ja również wybrać z wykresu bazowej, jako że wiąże się z możliwością faktycznie mają dwie osie y, patrz the answer here:

Oto moja soultion że używa tylko 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")) 

Co daje:
enter image description here

Żeby było jasne, że różnica jest coś innego, można zwiększyć odległość od pozostałych dwóch punktów:

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

Dzięki za wskaźnik do tego papieru. Po znalezieniu dobrego rozwiązania powrócę do raportu stackexchange. –

+0

Prawdopodobnie będziesz musiał zagrać z pozycjonowaniem drugiej osi Y (zrobione za pomocą drugiego argumentu 'ylim'). I zawsze chętnie pomagam w tworzeniu literatury do literatury, która mi się podobała. – Henrik

+0

Nie jestem pewien, czy twoje rozwiązanie (oś na pudełku), czy oryginalne jest lepsze. Podoba mi się forma L grafiki w pracy z niekonwencjonalnym pozycjonowaniem osi; to wskaźnik, że jest coś wyjątkowego. @Thomas jest najbliżej. –