2012-03-28 6 views
2

Gibt es eine Möglichkeit, die Linien so zu zeichnen, dass sie auf der Seite der Punkte beginnen würden, oder die Symbole im Vordergrund zulassen?R Legende Problem, Symbole von Punkten werden durch Linien maskiert

Meine Lösung war, die Symbole größer und sichtbarer zu machen.

Edit 1: es ist für die Grafik {Grafik} des R-Programms.

Edit 2: der Code pro beliebter Anfrage.

legend(2,.4,bty='n', c('sugar','citrus','none'), pch=c('s','c','u'), pt.bg='white',lty= c(1,2,3), lwd=1.5, title="Condition",pt.cex=c(1.5),cex=1.5) 

Edit 3: Dies ist für Plot (type = 'b') gelöst, aber irgendwie nicht für die Legende.

Danke fürs Lesen!

+1

Nicht gehen nach unten Abstimmung, aber Sie müssen die Grafiksystem Sie verwenden ... bei mindestens angeben! –

+0

Benötigen Sie Daten und Code. Dies ist eine Coding-Website um Himmels willen. –

+0

Oder Sie könnten die Linien dünner machen, anstatt die Symbole größer zu machen. –

Antwort

1

mit dem Vorschlag von @JeffAllen gehen, hier ist eine Art und Weise zu bekommen, was ich glaube, Sie wollen könnten. Es erfordert die Änderung der legend() Funktion, um die Position der Punkte (diese sind gegeben durch x1 und y1 in body(legend)[[46]]).

legend2 <- legend 
body(legend2)[[49]] <- quote(
    invisible(list(rect = list(w = w, h = h, left = left, top = top), 
    text = list(x = xt, y = yt), points = list(x = x1, y = y1))) 
) 

Machen Sie einen Plan:

plot(-100:100, -100:100, type = "b") 

Während die Legende zeichnen, weißen Kreise (pch = 21 mit pt.bg = 'white') über die Linien zeichnen, und die Werte unsichtbar zurück von legend2() zu einem Objekt zuweisen. Beachten Sie auch die Änderungen zu pt.lwd und pt.cex.

myLegend <- legend2(1, .8, bty = 'n', c('sugar','citrus','none'), pch = 21, 
    pt.bg = 'white', pt.lwd = 0, lty = c(1, 2, 3), lwd = 1.5, title = "Condition", 
    pt.cex = c(1.8), cex = 1.5) 

Schließlich ziehen Sie die angezeigten Zeichen in der Legende verwenden möchten points() verwenden, myLegend die x- und y-Werte aus dem Objekt zu liefern.

points(myLegend$points$x, myLegend$points$y, pch = c('s','c','u'), cex = 1.5) 

Und das sollten Sie wie etwas bekommen:

An example plot

+0

Wenn ich bereits eine neue Legendenfunktion mache, wäre es nicht einfacher, die Legende zu bitten, die weißen Kreise zuerst zu setzen und dann die beabsichtigten Symbole zu zeichnen. etwa beim Ändern [46] und Zeichnen der weißen Kreise vor dem Aufruf von Funktionspunkten2 p.s. Wow, danke! Das ist wie eine Operation. –

+0

Um Ihre Frage zu beantworten und die chirurgische Analogie zu behalten, wäre dies eine minimal invasive Lösung. Wenn Sie eine umfangreichere Operation ausführen möchten und Ihren Vorschlag oben übernehmen (und vielleicht sogar zusammenpacken möchten), wäre das großartig! – BenBarnes

2

Das einzige, was ich mir vorstellen kann ist, die Dash-Längen manuell zu finalisieren, bis sie am Ende so aussehen, wie Sie es wollen. Zum Beispiel:

> plot(1,1) 
> legend(c("A", "B"), col = 1:2, x = 1, y = .8, lty="99", pch=1:2) 

erzeugt das Bild unten.

Mit dem Parameter lty können Sie die Länge von Linien und Bindestrichen als Hexadezimalzeichen angeben. In diesem Fall heißt es, eine Zeile mit der Länge 9 zu erstellen und dann ein Leerzeichen der Länge 9 zu erstellen und dann zu wiederholen. Es sieht so aus, als wäre 9 die beste Anpassung an den Raum um ein normales PCH-Symbol.

Beachten Sie, dass Sie dies wahrscheinlich abhängig von der Größe des Bildes, des Symbols usw. anpassen müssen. Mein Rat wäre letztendlich, das Bild aus R zu exportieren und das Bild nach Ihren Bedürfnissen in der Grafikbearbeitungssoftware zu bearbeiten .

graph with manual dash lengths

+1

Wenn Sie den Charakter wirklich reproduzierbar in den Vordergrund bringen möchten, müssen Sie wahrscheinlich ein weißes Polygon hinter dem Symbol über der Linie zeichnen. Um dies zu tun, wäre es wahrscheinlich am besten, wenn Sie die Funktion 'legend()' anpassen, um Ihre Anforderungen zu erfüllen. Es ist keine kompilierte oder eingebaute Funktion, daher können Sie die Quelle erhalten, indem Sie einfach "legende" eingeben und diesen Code in einen Editor kopieren. –

+0

Das ist ein wirklich cooler Workaround. Nicht sehr portabel oder reproduzierbar (z. B. abhängig von lwd), aber ein einfacher Hack für eine einzige Legende! – BurninLeo

1

Sie könnten auch die ausgefüllten Punkte von R angeboten verwenden (pch = 21: 25) und geben Sie die Füllfarbe pc.bg verwendet, die an den points Aufruf übergeben wird, wenn eine Legende zu schaffen.

plot(1,1) 
legend(c("A", "B"), col = 1:2, x = 1, y = .8, lty=1, pt.bg=1:2, pch=21:22) 

generiert die folgende:

graph with filled points

Verwandte Themen