2012-11-22 16 views
5

Ho una interruzione di riga in una legenda in R e il mio problema è che l'aspetto grafico non è quello previsto. mio esempio minimo è il seguente:Interruzione di riga nel comportamento della legenda del diagramma R

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black")) 

mi aspetterei che il margine superiore e inferiore della leggenda è uguale, ma questo non è il caso. enter image description here

Come si può vedere nell'immagine allegata, il margine inferiore è più piccolo della parte superiore.

Qualcuno ha un'idea su come ripararlo o qualcuno può dirmi qual è il problema?

Grazie.

+1

Mi arrendo anch'io. Potresti voler rimuovere la scatola con 'bty =" n "' e aggiungere un 'poligono'after. –

risposta

2

Grazie a @ 'Marc nella casella' ho trovato una buona soluzione di lavoro. Disabilitare la scatola come h e raccontata con bty="n" e poi

ld<-legend("top",legend=legendLabel, cex=0.65, fill=colorNames, horiz=TRUE,bty="n") 
    height<-(ld$rect$top-ld$text$y[1])*2 
    xs <- c(ld$rect$left, ld$rect$left, ld$rect$left+ld$rect$w, ld$rect$left+ld$rect$w) 
    ys <- c(ld$rect$top, ld$rect$top-height, ld$rect$top-height, ld$rect$top) 
    polygon(x = xs , y = ys) 

Così ho calcolato la distanza tra l'angolo superiore e la Datapoint e afterwords disegnare con queste informazioni un poligono. Le opere abbastanza generali hanno tutto quello che ho visto.

Grazie.

4

OK, credo di avere una soluzione per voi. Ho salvato le informazioni della posizione della legenda in un oggetto chiamato ld e quindi creo un polygon basato su queste coordinate. È un po 'difficile da capire, ma fondamentalmente sto espandendo il poligono di alcuni punti lunghi. Per fare questo, ho dovuto prima ottenere la dimensione del carattere in pollici con par()$cin e nascondere il punto a queste dimensioni (dividere per 72 e moltiplicare per par()$ps. Quindi, convertire questo alle unità del grafico ridimensionando con par()$usr per ottenere larghezza del carattere in unità (penso che sia corretto - in ogni caso funziona!). Ho aggiunto 3 di queste unità a sinistra delle coordinate ld, 2 a destra, 1 su e 1 giù. Ecco il risultato e il codice:

enter image description here

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
ld <- legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black"), bty="n") 

CIN <- par()$cin 
PS <- par()$ps 
USR <- par()$usr 
CIN.USR <- c((CIN[1]/72*PS)/(USR[2]-USR[1]), (CIN[2]/72*PS)/(USR[4]-USR[3])) 

xs <- c(ld$text$x[1], ld$text$x[1], ld$text$x[length(ld$text$x)], ld$text$x[length(ld$text$x)]) 
ys <- c(ld$text$y[1], ld$text$y[1], ld$text$y[length(ld$text$x)], ld$text$y[length(ld$text$x)]) 

polygon(
x = xs + c(-3*CIN.USR[1], -3*CIN.USR[1], 2*CIN.USR[1], 2*CIN.USR[1]), 
y = ys+c(-1*CIN.USR[2], 1*CIN.USR[2], 1*CIN.USR[2], -1*CIN.USR[2]) 
) 
+0

grazie per la tua risposta, in base al tuo ho trovato una soluzione di lavoro per me. Il problema con il tuo è stato che utilizzo 'barplot (matrice (dati, nr = 6), nomi.arg = nome, accanto = FALSE, xlim = intervallo (0,100), ylim = intervallo (0,12), horiz = TRUE) 'e il tuo codice disegna solo una linea continua. – steffenmauch

Problemi correlati