18 Stimmen

Dynamische Position für ggplot2-Objekte (insbesondere geom_text)?

Wenn Sie ArcGIS zur Erstellung von Karten verwenden, verschiebt die Software standardmäßig Punkt- und Polygonbeschriftungen automatisch, um Überschneidungen mit Hilfe eines proprietären Algorithmus zu vermeiden. Sie bezeichnen dies als dynamische Beschriftung . ggplot2 tiene position_jitter was für Punkte hervorragend ist (da dynamische Beschriftungen zu systematischen Verzerrungen führen können), aber weniger gut für Beschriftungen mit geom_text .

Hier ein Beispiel für einige Probleme mit Jitter, die ein dynamischer Kennzeichnungsalgorithmus lösen könnte:

library(ggplot2)
ggplot( mtcars,aes( x=wt, y=mpg, label=rownames(mtcars) ) ) +
  geom_point() +
  geom_text( position=position_jitter(h=1,w=1) )

jittered labels with problems noted

Gibt es eine solche dynamische Beschriftungsfunktion bereits in ggplot2?

Wenn nicht, welche Algorithmen gibt es dafür und ist es möglich, eine position_dynamic in R?

12voto

Sukhi Punkte 766

Sehen Sie sich das neue Paket an ggrepel . ggrepel stellt Geoms für ggplot2 bereit, um überlappende Textbeschriftungen abzustoßen. Es funktioniert sowohl für geom_text als auch für geom_label.

enter image description here

Die Abbildung stammt aus dieser Blogbeitrag .

9voto

gregk Punkte 91

Ich bin auf ein ähnliches Problem bei einigen der Diagramme gestoßen, mit denen ich gearbeitet habe, und habe ein einfaches Paket geschrieben, das die Kraftfeldsimulation zur Anpassung der Objektposition verwendet. Obwohl viele Verbesserungen möglich sind, einschließlich der Integration mit ggplot usw., scheint es die Aufgabe zu erfüllen. Im Folgenden wird die Funktionalität veranschaulicht:

install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()

8voto

Andrie Punkte 169813

AFAIK ist das Beste, was es gibt directlabels , erhältlich bei R-Schmiede y CRAN und mit einer umfassenden Beispielseite .

Dies scheint ein guter Ausgangspunkt zu sein, hat aber meiner Meinung nach die folgenden negativen Aspekte:

  • Anders als die ggplot Philosophie der Trennung von Daten und Darstellung, directlabels gibt ein ggplot-Objekt anstelle eines geom
  • es funktioniert nur auf dem group Ästhetik, nicht einzelne Punkte

Ich habe vor einiger Zeit einen Blick auf den Quellcode geworfen, und ich denke, es sollte relativ einfach sein, den Code anzupassen, um die beiden von mir genannten Punkte zu beheben.

Es gibt ein Beispiel für die Verwendung dieser Methode mit ggplot en diese Frage zu SO

7voto

Gavin Simpson Punkte 163780

Dies ist nichts, was man direkt in Ggplot2 aber die ordipointlabel() Funktion im Paket vegan versucht, etwas Ähnliches zu tun. Es zeigt die Daten als Punkte an und versucht, jeden Punkt mit der entsprechenden Beschriftung zu versehen, wobei ein Optimierungsalgorithmus verwendet wird, um die Beschriftungen neben dem jeweiligen Punkt zu positionieren, ohne dass sich andere Beschriftungen und Punkte überschneiden.

?ordipointlabel erwähnt, dass es sich auf pointlabel() において maptools Paket, das ein weiterer Ort der Inspiration sein könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X