2016-06-04 34 views
5

Ho un grafico R in cui utilizzo i valori come simboli. I punti hanno anche barre di errore: Sfondo simbolo R per simboli personalizzati

Il problema è, ovviamente, che le barre di errore (io uso le frecce per quello) attraversano i numeri e che sembra solo brutto e li rende difficili da leggere.

Questo è il mio codice, qualche idea?

x = c(45.58333, 89.83333, 114.03333,138.65000,161.50000,185.15000,191.50000) 
y_mean = c(3.350000,6.450000,7.200000,7.033333,8.400000,7.083333,6.750000) 
y_sd = c(0.1802776,0.1732051,0.2500000,0.2020726,0.3500000,0.2020726,0.1000000) 

values = data.frame(x, y_mean, y_sd) 

plot(values$x, values$y_mean, type="n") 

arrows(values$x, values$y_mean - values$y_sd, 
    values$x, values$y_mean + values$y_sd, 
    length=0.05, angle=90, 
    code=3, col="red") 

lines(values$x, values$y_mean, type="b", 
    pch=" ", 
    col="red", bg="white") 

text(values$x, values$y_mean, label=round(values$y_mean), col="red") 

EDIT: Ho eseguito il codice esatto mostrato sopra come chiesto: enter image description here

+0

tutti i dati riproducibili con cui giocare? – 989

+0

Sì, certo, l'ho aggiunto :-). –

+0

'valori $ y_mean',' valori $ y_sd'? – 989

risposta

2

Un'idea è di rendere bianco il contenuto della trama in cui il testo verrà disegnato, prima del che disegna il testo. Questo può essere fatto con rect(). Anche se rischi di azzannare completamente le barre di errore con questo approccio.

Possiamo usare strwidth() and strheight() per ottenere le dimensioni appropriate per i rettangoli di attenuazione.

x <- c(45.58333, 89.83333, 114.03333,138.65000,161.50000,185.15000,191.50000); 
y_mean <- c(3.350000,6.450000,7.200000,7.033333,8.400000,7.083333,6.750000); 
y_sd <- c(0.1802776,0.1732051,0.2500000,0.2020726,0.3500000,0.2020726,0.1000000); 
xlim <- range(x); 
ylim <- c(min(y_mean-y_sd),max(y_mean+y_sd)); 
plot(NA,xlim=xlim,ylim=ylim,xlab='x',ylab='y'); 
arrows(x,y_mean-y_sd,x,y_mean+y_sd,length=0.05,angle=90,code=3,col='red'); 
lines(x,y_mean,type='b',pch=' ',col='red',bg='white'); 
ls <- as.character(round(y_mean)); 
ex <- 0.4; ## whiteout expansion factor 
lsw <- strwidth(ls); w <- lsw/2*(1+ex); 
lsh <- strheight(ls); h <- lsh/2*(1+ex); 
rect(x-w,y_mean-h,x+w,y_mean+h,col='white',border=NA); 
text(x,y_mean,ls,col='red'); 

plot

+0

Grazie, è perfetto! :-D –

3

vorrei giocare con la giustificazione orizzontale e aggiungere piccoli punti per tenere traccia della posizione originaria

points(values$x, values$y_mean, pch=19, col="red", cex=0.5) 
text(values$x, values$y_mean, label=round(values$y_mean), col="red", adj = -0.2) 

enter image description here

2

applicare Proprio questi cambiamenti:

plot(values$x, values$y_mean, type="n", 
xlim = c(min(values$x), max(values$x) + 20), 
ylim = c(min(values$y_mean)-1, max(values$y_mean)+1)) 

text(values$x, values$y_mean, label=round(values$y_mean), col="blue", pos = 3) 

+0

Non esattamente quello che volevo ma un altro modo per risolverlo :-). –

+0

beh, modifiche minori hanno dato origine a una soluzione. Hai dichiarato il tuo problema come segue: "Il problema è, ovviamente, che le barre di errore (io uso le frecce per quello) attraversano i numeri e che sembrano solo brutte e le rendono difficili da leggere". E ora, non sembra brutto ed è facile da leggere. Missione compiuta :) – 989