Comment dessiner des polygones nets autour des régions du diagramme de dispersion dans ggplot2 [fermé]

32

Comment ajouter un polygone net autour d'un groupe de points sur un diagramme de dispersion? J'utilise ggplot2 mais je suis déçu des résultats de geom_polygon.

Le jeu de données est - bas , sous forme de fichier texte délimité par des tabulations. Le graphique ci-dessous montre deux mesures d'attitude à l'égard de la santé et du chômage dans de nombreux pays:

nuage de points avec Densité2d

Je voudrais passer du geom_density2dmoins fantaisiste mais empiriquement plus correct geom_polygon. Le résultat sur des données non triées est inutile:

entrez la description de l'image ici

Comment dessiner des polygones "nets" se comportant comme des chemins de contour autour des valeurs min-max yx? J'ai essayé de trier les données en vain.

Code:

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

L' dobjet est obtenu avec ce fichier CSV .

Solution:

Merci à Wayne , Andy W et aux autres pour leurs conseils! Les données, codes et graphiques ont été publiés sur GitHub . Le résultat ressemble à ceci:

résultat

Fr.
la source
6
Le terme que vous recherchez peut-être est la coque convexe des points (ou éventuellement la coque alpha). Vous devriez pouvoir trouver une fonction R pour les calculer, puis pouvoir les ajouter en tant que calques au tracé.
Andy W
Merci d'avoir signalé la bonne terminologie! J'ai échoué à utiliser ?chullavec ggplot2jusqu'à présent. Je ne suis pas sûr de bien le coder et j'espère que quelqu'un l'a déjà fait.
Fr.
Pourriez-vous ajouter votre code R à la question?
Yuriy Petrovskiy
Une chose à noter: ce que vous affichez, ce sont les maxima, qui peuvent être des "valeurs aberrantes". Je pense que le package R alphahullfonctionne de manière similaire à la recherche de la coque convexe, mais vous permet de l’ajuster vers l’intérieur / vers l’extérieur pour essayer de faire quelque chose comme des intervalles de confiance.
Wayne
@Wayne, une coque alpha n'est pas un intervalle de confiance (en aucune manière imaginable). Voir cette question gis.se pour une brève description et quelques références de ce qu’est une coque alpha. Peut-être que vous pensez à des ellipses de confiance à deux variables, ou peut-être même à des intrigues de sac (intrigues bidimensionnelles pour identifier les valeurs aberrantes).
Andy W

Réponses:

33

Avec Google, je suis tombé sur le site Web de Gota Morota qui en a déjà un exemple sur son site Web . Vous trouverez ci-dessous cet exemple étendu à vos données.

entrez la description de l'image ici

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
la source
Merci, je vais réviser le code en conséquence. Malheureusement, votre fichier image ne semble pas se charger ici, mais le code est là.
Fr.
@Fr. , Quel est le problème exactement?
Andy W
@AndyW Malheureusement, le code ne prend pas en charge les valeurs manquantes et je n'ai pas trouvé de moyen de le modifier pour le faire.
Fr.
@Fr., Comment voulez-vous exactement que les valeurs de données manquantes soient gérées en plus d'éliminer ces observations? Toute technique d'imputation raisonnable aurait pour résultat que les points se trouvent à l' intérieur des coques convexes des observations non manquantes.
Andy W
@AndyW je veux dire que le NAtuer la chullfonction. Je m'attendrais à ce qu'il l'ignore simplement, mais cela a échoué et je n'ai pas trouvé le moyen na.omit()de le faire fonctionner. Je suis sûr que c'est possible, je n'ai tout simplement pas les compétences en hackery pour aller au-delà de la solution précédente.
Fr.
8

Si je comprends votre problème, vous recherchez la coque convexe de healthet de unemployment. Il y a probablement plusieurs paquets pour le faire dans R, dont un paquet geometry. J'imagine que les points sont classés dans l'ordre autour du périmètre, mais vous devez vérifier cela.

EDIT: Voici un exemple, qui n’utilise pas ggplot, mais j’espère que c’est utile. L'exemple dans la chulldocumentation semble être faux, ce qui pourrait vous jeter au dépourvu:

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, voici quelque chose utilisant ggplot2. Nous nous transformons Xen une data.frameavec des variables xet y. Ensuite:

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()

Notez que le geom_pointutilise les données ( X) et aes du ggplot, alors que je le remplace dans le geom_polygon.

Pour bien le comprendre, vous devez insérer les lettres x et y de la coque pour les deux problèmes bar, en utilisant une troisième colonne issuepour les différencier.

Wayne
la source
Correct à propos de la coque convexe. J'ai essayé d'utiliser chullpour générer la coque convexe mais je n'ai pas réussi à utiliser les résultats ggplot2.
Fr.
@Fr .: J'ai révisé ma réponse rapidement. Voyez si cela vous met sur la bonne voie.
Wayne
Je peux voir comment ça marche tout seul, mais je me demande comment obtenir cette dernière ligne ggplot2.
Fr.
@Fr .: OK, et maintenant?
Wayne
Ça a marché! Merci. Je devais ajouter na.omitpour me débarrasser de NA qui empêche chullde travailler. Merci encore.
Fr.
5

Depuis cet après-midi, j'ai chullintégré la fonction dans un package R en tant que geom_convexhullfonction.

Une fois que le paquet est chargé, il peut être utilisé comme n’importe quel autre géom. Dans votre cas, cela devrait ressembler à:

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

Le paquet est disponible sur github: https://github.com/cmartin/ggConvexHull

Charles Martin
la source
Merci beaucoup pour cela! Je devenais frustré par une sortie non désirée lorsque j'essayais d'appliquer chullun facteur de regroupement jusqu'à ce que je trouve cela.
Jogall