2012-11-22 14 views
5

Mam linebreak w legendzie R i moim problemem jest to, że grafika wygląda inaczej. Moje minimalne przykładem jest następujący:Linebreak w działaniu legendy plotowania R

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

Spodziewam się, że górna i dolna margines legendy jest równa, ale to nie jest przypadek. enter image description here

Jak widać na załączonym obrazie, dolny margines jest mniejszy niż górny.

Czy ktoś ma pomysł, jak to naprawić lub czy ktoś może mi powiedzieć, jaki jest problem?

Dzięki.

+1

Poddaję się też. Możesz raczej usunąć pole z 'bty =" n "' i dodać 'wielokąt' po drugiej. –

Odpowiedz

2

Dzięki @ 'Marc w polu' znalazłem dobre rozwiązanie roboczą. Wyłącz pole jako h e powiedział z bty="n" a następnie

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) 

Więc najpierw oblicza odległość między górnym rogu i DATAPOINT i posłowia wyciągnąć z tych informacji wielokąta. Działa całkiem ogólnie, o ile wiem.

Dzięki.

4

OK, wierzę, że mam dla ciebie rozwiązanie. Zapisałem informacje o pozycji legendy w obiekcie o nazwie ld, a następnie utworzyłem polygon na podstawie tych współrzędnych. To trochę trudne do zrozumienia, ale zasadniczo rozwijam wielokąt o kilka punktów długości. Aby to zrobić, musiałem najpierw uzyskać rozmiar czcionki w calach z par()$cin i zakodować punkty do tych wymiarów (podzielić przez 72 i pomnożyć przez par()$ps. Następnie przekonwertować to na jednostki wykresu, skalując za pomocą par()$usr, aby uzyskać szerokość znaków w jednostkach (myślę, że to jest poprawne - w każdym razie działa!). Dodałem 3 z tych jednostek na lewo od współrzędnych ld, 2 na prawo, 1 na górę i na 1. Poniżej jest wynik i kod:

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

dziękuję za odpowiedź, na podstawie Twojego znalazłem dla mnie działające rozwiązanie. Problem z twoją polegał na tym, że używam 'barplot (macierz (dane, nr = 6), names.arg = nazwa, obok = FALSE, xlim = zakres (0,100), ylim = zakres (0,12), poziom = PRAWDA) 'a twój kod rysuje tylko ciągłą linię. – steffenmauch

Powiązane problemy