1) Gibt es eine R-Bibliothek / Funktion, die die Platzierung von INTELLIGENT-Labels im R-Plot implementieren würde? Ich habe einige ausprobiert, aber sie sind alle problematisch - viele Beschriftungen überlappen sich entweder oder andere Punkte (oder andere Objekte in der Handlung, aber ich sehe, dass dies viel schwieriger zu handhaben ist).
2) Wenn nicht, gibt es eine Möglichkeit, den Algorithmus bei der Platzierung des Etiketts für bestimmte problematische Punkte KOMFORTABL zu unterstützen? Die bequemste und effizienteste Lösung gesucht.
Sie können mit meinem reproduzierbaren Beispiel andere Möglichkeiten spielen und testen und sehen, ob Sie bessere Ergebnisse erzielen können als ich:
# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012,
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542,
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho",
"SaxRub", "TurMer", "TurPil", "TurPhi")
# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")
Zum Etikettieren habe ich dann diese Möglichkeiten ausprobiert, niemand ist wirklich gut:
1) dieser ist schrecklich:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) Diese ist gut, wenn Sie nicht alle Punkte beschriften möchten, sondern nur die Ausreißer. Trotzdem werden die Beschriftungen häufig falsch platziert:
identify(x, y, labels = ShortSci, cex = 0.7)
3) dieser sah vielversprechend aus, aber es gibt das Problem, dass Etiketten zu nahe an den Punkten sind; Ich musste sie mit Leerzeichen auffüllen, aber das hilft nicht viel:
require(maptools)
pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)
4)
require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)
5)
require(calibrate)
textxy(x, y, labs=ShortSci, cx=0.7)
Vielen Dank im Voraus!
EDIT: todo: versuche labcurve {Hmisc} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Antworten:
Hier sind die Ergebnisse meiner Lösung für dieses Problem:
Ich habe dies von Hand in der Vorschau (sehr einfacher PDF / Bild-Viewer unter OS X) in nur wenigen Minuten gemacht. ( Bearbeiten: Der Workflow war genau das, was Sie erwartet hatten: Ich habe das Diagramm als PDF aus R gespeichert, es in der Vorschau geöffnet und Textfelder mit den gewünschten Beschriftungen (9pt Helvetica) erstellt und sie dann einfach mit der Maus herumgezogen, bis sie aussahen gut. Dann habe ich in ein PNG exportiert, um es auf SO hochzuladen.)
Bevor Sie dem starken Drang erliegen, dies in Vergessenheit zu bringen und bissige Kommentare darüber zu hinterlassen, wie es darum geht, diesen Prozess zu automatisieren, hören Sie mich an!
Die Suche nach algorithmischen Lösungen ist völlig in Ordnung und (IMHO) wirklich interessant. Für mich fallen Punktkennzeichnungssituationen in ungefähr drei Kategorien:
text
) nicht , dass viel Aufwand.: Klettern auf Seifenkiste:
Da Leute wie wir die Automatisierung lieben , denke ich, dass wir oft in die Falle tappen, dass fast jeder Aspekt der Erstellung einer guten statistischen Grafik automatisiert werden sollte. Ich bin respektvoll (demütig!) Nicht einverstanden.
Es gibt keine vollkommen allgemeine statistische Darstellungsumgebung, die automatisch das Bild erstellt, das Sie in Ihrem Kopf haben. Dinge wie R, ggplot2, Gitter usw. erledigen den größten Teil der Arbeit; Aber dieses zusätzliche kleine Optimieren, hier eine Linie hinzufügen und dort einen Rand anpassen, ist wahrscheinlich besser für ein anderes Werkzeug geeignet.
: von der Seifenkiste herunterklettern:
Ich würde auch bemerken, dass ich denke, wir könnten alle Streudiagramme mit <10-15 Punkten erstellen, die selbst von Hand kaum sauber zu beschriften sind, und diese werden wahrscheinlich jede automatische Lösung zerstören, die jemand entwickelt.
Abschließend möchte ich noch einmal betonen, dass ich weiß, dass dies nicht die Antwort ist, nach der Sie suchen. Und ich sage nicht , dass algorithmische Versuche nutzlos oder dumm sind. Ich habe diese Frage positiv bewertet und werde gerne interessante algorithmische Lösungen bewerten!
Der Grund, warum ich diese Antwort gepostet habe, ist, dass ich denke, dass diese Frage die kanonische Frage "Punktkennzeichnung in R" für zukünftige Duplikate sein sollte, und ich denke, dass Lösungen mit Handkennzeichnung einen Platz am Tisch verdienen, das ist alles.
quelle
ggrepel
sieht vielversprechend aus, wenn es aufggplot2
Streudiagramme angewendet wird .quelle
Haben Sie das directlabels- Paket ausprobiert ?
Übrigens können die Argumente pos und offset Vektoren verwenden, damit Sie sie an die richtigen Positionen bringen können, wenn in nur wenigen Plotläufen eine angemessene Anzahl von Punkten vorhanden ist.
quelle
plot()
Plot verwendet werden? Ich habe es nicht erfolgreich versucht ... Danke! PS: @SpacedMan & Ben, ich habe meine Kommentare zum R-Update bereinigt, da sie nicht so interessant sind - Sie können das Gleiche tun.Ich habe eine Lösung gefunden! Es ist leider nicht ultimativ und ideal, aber es ist das, was jetzt am besten für mich funktioniert. Es ist halb algoritmisch, halb manuell, also spart es Zeit im Vergleich zu einer von Joran entworfenen reinen manuellen Lösung.
Ich habe einen sehr wichtigen Teil der Hilfe übersehen !
?identify
Wenn Sie also die
identify()
Lösung verwenden, wie ich sie in meiner Frage geschrieben habe, können Sie die Position des Etiketts beeinflussen, indem Sie nicht direkt auf diesen Punkt klicken , sondern indem Sie relativ in die gewünschte Richtung neben diesen Punkt klicken !!! Funktioniert einfach super!Der Nachteil ist, dass es nur 4 Positionen gibt (oben, links, unten, rechts), aber ich würde die anderen 4 (oben links, oben rechts, unten links, unten rechts) mehr schätzen ... Also ich Verwenden Sie diese Option, um Punkte zu kennzeichnen, die mich nicht stören, und den Rest der Punkte, die ich direkt in meiner Powerpoint-Präsentation beschrifte, wie von joran vorgeschlagen :-)
PS: Ich habe die Gitter- / ggplot-Lösung von directlabels noch nicht ausprobiert. Ich bevorzuge immer noch die Verwendung der grundlegenden Plotbibliothek.
quelle
Ich würde vorschlagen, dass Sie sich das
wordcloud
Paket ansehen . Ich weiß, dass sich dieses Paket nicht genau auf die Punkte konzentriert, sondern auf die Etiketten selbst, und auch der Stil scheint ziemlich fest zu sein. Trotzdem waren die Ergebnisse, die ich mit der Verwendung erzielt habe, ziemlich beeindruckend. Beachten Sie auch, dass die betreffende Paketversion zu dem Zeitpunkt veröffentlicht wurde, als Sie die Frage gestellt haben. Sie ist also noch sehr neu.http://blog.fellstat.com/?cat=11
quelle
Ich habe eine R-Funktion geschrieben, die
addTextLabels()
in einem Paket aufgerufen wirdplotteR
. Das Paket kann mit dem folgenden Code direkt in Ihre R-Bibliothek installiert werden:Für das bereitgestellte Beispiel habe ich den folgenden Code verwendet, um die unten verlinkte Beispielfigur zu generieren.
Es funktioniert, indem automatisch ein alternativer Ort aus einem feinen Punktraster ausgewählt wird. Die nächstgelegenen Punkte im Raster werden zuerst besucht und ausgewählt, wenn sie sich nicht mit gezeichneten Punkten oder Beschriftungen überschneiden. Werfen Sie einen Blick auf die Quelle - Code , wenn Sie interessiert sind.
quelle
Keine Antwort, aber zu lang für einen Kommentar. Ein sehr einfacher Ansatz, der in einfachen Fällen zwischen der Nachbearbeitung von Joran und den komplexeren Algorithmen, die vorgestellt wurden
in-place
, funktionieren kann, besteht darin, einfache Transformationen in den Datenrahmen vorzunehmen.Ich illustriere dies mit,
ggplot2
weil ich mit dieser Syntax besser vertraut bin als mit Basis-R-Plots.Wie Sie sehen können, ist das Ergebnis in diesem Fall nicht ideal, aber es kann für einige Zwecke gut genug sein. Und es ist ziemlich mühelos, normalerweise reicht so etwas
within(df, y <- y+.01)
quelle
df
Verwendung zu ändernwithin
, mache ich dies oft, indem ich die Ästhetik anpasse:geom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
Scheint sauberer.