Wie man in ggplot2 saubere Polygone um Streudiagramm-Regionen zeichnet [closed]

32

Wie füge ich ein ordentliches Polygon um eine Gruppe von Punkten in einem Streudiagramm hinzu? Ich verwende ggplot2, bin aber von den Ergebnissen von enttäuscht geom_polygon.

Der Datensatz befindet sich dort als tabulatorgetrennte Textdatei. Die folgende Grafik zeigt zwei Kennzahlen zur Einstellung gegenüber Gesundheit und Arbeitslosigkeit in einer Reihe von Ländern:

Streudiagramm mit Dichte2d

Ich würde gerne von geom_density2dweniger schick, aber empirisch korrekt wechseln geom_polygon. Das Ergebnis für unsortierte Daten ist nicht hilfreich:

Bildbeschreibung hier eingeben

Wie zeichne ich "ordentliche" Polygone, die sich als Konturpfade um die Min-Max-YX-Werte verhalten? Ich habe versucht, die Daten ohne Erfolg zu sortieren.

Code:

print(fig2 <- ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
geom_point() + geom_density2d(alpha=.5) + labs(x = "Efficiency", y = "Mandate"))

Das dObjekt wird mit dieser CSV-Datei erhalten .

Lösung:

Vielen Dank an Wayne , Andy W und andere für ihre Hinweise! Die Daten, der Code und die Grafiken wurden auf GitHub gepostet . Das Ergebnis sieht so aus:

Ergebnis

Fr.
quelle
6
Der Begriff, nach dem Sie möglicherweise suchen, ist die konvexe Hülle der Punkte (oder möglicherweise die Alpha-Hülle). Sie sollten in der Lage sein, eine R-Funktion zu finden, um diese zu berechnen und sie dann als Layer zum Plot hinzuzufügen.
Andy W
Vielen Dank für den Hinweis auf die richtige Terminologie! Ich habe zu Verwendung gescheitert ?chullmit ggplot2bisher. Ich bin mir nicht sicher, ob ich es richtig codiere und hoffe, dass jemand es bereits getan hat.
Fr.
Könnten Sie Ihren R-Code zur Frage hinzufügen?
Yuriy Petrovskiy
Eine Sache zu beachten: Was Sie anzeigen, sind die Maxima, die "Ausreißer" sein können. Ich glaube, das R-Paket alphahullfunktioniert ähnlich wie das Finden der konvexen Hülle, aber Sie können es nach innen / außen anpassen, um zu versuchen, so etwas wie Konfidenzintervalle zu machen.
Wayne
@ Wayne, ein Alpha-Rumpf ist kein Konfidenzintervall (in keiner Weise vorstellbar). In dieser gis.se-Frage finden Sie eine kurze Beschreibung und einige Referenzen, was ein Alpha-Rumpf ist. Vielleicht denken Sie an bivariate Vertrauensellipsen oder sogar an Bagplots (bi-variable Boxplots zur Identifizierung von Ausreißern).
Andy W

Antworten:

33

Mit ein wenig googeln bin ich auf die Website von Gota Morota gestoßen, die ein Beispiel dafür bereits auf ihrer Website hat . Das folgende Beispiel bezieht sich auf Ihre Daten.

Bildbeschreibung hier eingeben

library(ggplot2)
work <- "E:\\Forum_Post_Stuff\\convex_hull_ggplot2"
setwd(work)

#note you have some missing data
mydata <- read.table(file = "emD71JT5.txt",header = TRUE, fill = TRUE)
nomissing <- na.omit(mydata) #chull function does not work with missing data

#getting the convex hull of each unique point set
df <- nomissing
find_hull <- function(df) df[chull(df$eff, df$man), ]
hulls <- ddply(df, "issue", find_hull)

plot <- ggplot(data = nomissing, aes(x = eff, y = man, colour=issue, fill = issue)) +
geom_point() + 
geom_polygon(data = hulls, alpha = 0.5) +
labs(x = "Efficiency", y = "Mandate")
plot
Andy W
quelle
Danke, ich werde den Code entsprechend überarbeiten. Leider scheint Ihre Bilddatei hier nicht geladen zu werden, aber der Code ist da.
Fr.
@Fr. Was genau ist das Problem?
Andy W
@AndyW Leider unterstützt der Code keine fehlenden Werte, und ich habe keine Möglichkeit gefunden, ihn zu optimieren.
Fr.
@Fr., Wie genau möchten Sie fehlende Datenwerte behandeln und diese Beobachtungen eliminieren? Jede sinnvolle Imputationstechnik würde dazu führen, dass sich die Punkte innerhalb der konvexen Hüllen der nicht fehlenden Beobachtungen befinden.
Andy W
@AndyW Ich meine, dass die NAdie chullFunktion töten . Ich würde erwarten, dass es einfach ignoriert wird, aber es schlägt fehl und ich fand keine Möglichkeit, es zum Laufen na.omit()zu bringen. Ich bin mir sicher, dass es möglich ist. Ich habe einfach nicht die Hackerfähigkeiten, um über die vorherige Lösung hinauszugehen.
Fr.
8

Wenn ich Ihr Problem verstehe, suchen Sie nach der konvexen Hülle von healthund von unemployment. In R gibt es wahrscheinlich mehrere Pakete, von denen eines package ist geometry. Ich könnte mir vorstellen, dass die Punkte nach Umfang sortiert sind, aber das müsste man überprüfen.

EDIT: Hier ist ein Beispiel, das nicht verwendet wird ggplot, aber ich hoffe, es ist nützlich. Das Beispiel in der chullDokumentation scheint falsch zu sein, was Sie möglicherweise abschreckt:

X <- matrix(rnorm(2000), ncol = 2)
X.chull <- chull (X)
X.chull <- c(X.chull, X.chull[1])
plot (X)
lines (X[X.chull,])

EDIT 2: OK, hier ist etwas mit ggplot2. Wir verwandeln uns Xin ein data.framemit Variablen xund y. Dann:

library(ggplot2)
X <- as.data.frame(X)
hull <- chull(X)
hull <- c(hull, hull[1])
ggplot(X, aes(x=x, y=y)) + geom_polygon(data=X[hull,], fill="red") + geom_point()

Beachten Sie, dass das geom_pointdie Daten ( X) und aes vom ggplot verwendet, während ich es im überschreibe geom_polygon.

Um es vollständig zu erhalten, müssen Sie das x und das y für den Rumpf für beide Probleme in bareine dritte Spalte issueeinfügen, um sie zu unterscheiden.

Wayne
quelle
Richtig um den konvexen Rumpf. Ich habe versucht, chullden konvexen Rumpf zu erzeugen, aber die Ergebnisse mit nicht verwendet ggplot2.
Fr.
@Fr .: Ich habe meine Antwort schnell bearbeitet. Prüfen Sie, ob Sie damit auf dem richtigen Weg sind.
Wayne
Ich kann sehen, wie es von selbst funktioniert, aber ich frage mich, wie ich diese letzte Zeile mit erhalten kann ggplot2.
Fr.
@Fr .: OK, wie wäre es jetzt?
Wayne
Es funktionierte! Vielen Dank. Ich musste hinzufügen na.omit, um NA loszuwerden, die nicht mehr chullfunktionieren. Danke noch einmal.
Fr.
5

Ab heute Nachmittag habe ich die chullFunktion in einem R-Paket als geom_convexhullFunktion verpackt .

Sobald das Paket geladen ist, kann es wie jedes andere Geom verwendet werden. In Ihrem Fall sollte es ungefähr so ​​aussehen:

ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
  geom_convexhull(alpha=.5) + 
  geom_point() + 
  labs(x = "Efficiency", y = "Mandate"))

Das Paket ist auf github verfügbar: https://github.com/cmartin/ggConvexHull

Charles Martin
quelle
Vielen Dank dafür! Ich war frustriert von unerwünschten Ausgaben, als ich versuchte, sie chullüber einen Gruppierungsfaktor hinweg anzuwenden , bis ich dies fand.
Jogall