2012-11-22 14 views
5

Ich habe einen Zeilenumbruch in einer Legende in R und mein Problem ist, dass die Grafik nicht wie erwartet aussieht. Mein minimal Beispiel ist wie folgt:Line Break in R-Diagramm Legende Verhalten

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

Ich würde erwarten, dass die oberen und unteren Rand der Legende gleich ist, aber dies ist nicht der Fall. enter image description here

Wie Sie im angehängten Bild sehen können, ist der untere Rand kleiner als der obere.

Hat jemand eine Idee, wie man es reparieren kann oder kann mir jemand sagen, was das Problem ist?

Danke.

+1

Ich gebe auch auf. Vielleicht möchten Sie die Box lieber mit 'bty =" n "' entfernen und anschließend ein 'Polygon' hinzufügen. –

Antwort

2

Dank @ 'Marc im Feld' fand ich eine gute Arbeitslösung. Deaktivieren Sie die Box als h e sagte mit bty="n" und dann

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) 

ich also zuerst den Abstand zwischen der oberen Ecke und der Datenpunkt und anschliessend ziehen mit dieser Information ein Polygon berechnet. Arbeiten ganz allgemein hat weit wie ich gesehen habe.

Danke.

4

OK, ich glaube, ich habe eine Lösung für Sie. Ich habe die Informationen der Legendenposition in einem Objekt namens ld gespeichert und dann basierend auf diesen Koordinaten ein polygon erstellt. Es ist ein bisschen schwierig zu verstehen, aber ich erweitere das Polygon grundsätzlich um ein paar Punktlängen. Um dies zu tun, musste ich zuerst die Zeichengröße in Zoll mit par()$cin bekommen und die Punktgröße auf diese Abmessungen umwandeln (dividiere durch 72 und multipliziere mit). Dann konvertiere diese in die Einheiten des Plots durch Skalierung mit par()$usr Zeichenbreite in Einheiten (ich denke, das ist richtig - auf jeden Fall funktioniert es!). Ich habe 3 dieser Einheiten auf der linken Seite der ld Koordinaten, 2 auf der rechten Seite, 1 nach oben und 1 nach unten. Hier ist das Ergebnis und Code:

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

Danke für deine Antwort, basierend auf deiner Antwort fand ich eine funktionierende Lösung für mich. Das Problem mit Deinem war, dass ich 'barplot (Matrix (Daten, nr = 6), names.arg = Name, neben = FALSE, xlim = Bereich (0,100), ylim = Bereich (0,12), horiz = TRUE) verwende 'und Ihr Code zeichnet nur eine durchgezogene Linie. – steffenmauch