1) Existe-t-il une bibliothèque / fonction R qui implémenterait le placement d'étiquettes INTELLIGENT dans le tracé R? J'en ai essayé mais ils sont tous problématiques - de nombreuses étiquettes se chevauchent ou se chevauchent (ou d'autres objets dans l'intrigue, mais je vois que c'est beaucoup plus difficile à gérer).
2) Si non, y a-t-il un moyen d'aider CONFORTABLEMENT l'algorithme avec le placement des étiquettes pour des points problématiques particuliers? La solution la plus confortable et la plus efficace recherchée.
Vous pouvez jouer et tester d'autres possibilités avec mon exemple reproductible et voir si vous êtes en mesure d'obtenir de meilleurs résultats que moi:
# 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")
Pour l'étiquetage, j'ai ensuite essayé ces possibilités, personne n'est vraiment bon:
1) celui-ci est terrible:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) celui-ci est bon si vous ne voulez pas placer d'étiquettes pour tous les points, mais juste pour les valeurs aberrantes, mais quand même, les étiquettes sont souvent mal placées:
identify(x, y, labels = ShortSci, cex = 0.7)
3) celui-ci avait l'air prometteur mais il y a le problème des étiquettes trop proches des points; J'ai dû les remplir d'espaces mais cela n'aide pas beaucoup:
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)
Merci d'avance!
EDIT: todo: essayez labcurve {Hmisc} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Réponses:
Tout d'abord, voici les résultats de ma solution à ce problème:
Je l'ai fait à la main dans Preview (visionneuse PDF / image très basique sur OS X) en quelques minutes. ( Modifier: Le flux de travail était exactement ce à quoi vous vous attendiez: j'ai enregistré le tracé au format PDF à partir de R, je l'ai ouvert dans Aperçu et créé des zones de texte avec les étiquettes souhaitées (9pt Helvetica), puis je les ai simplement traînés avec ma souris jusqu'à ce qu'ils aient l'air bien. Ensuite, j'ai exporté vers un PNG pour le téléchargement vers SO.)
Maintenant, avant de succomber à la forte envie de rejeter cela dans l'oubli et de laisser des commentaires sournois sur la façon dont le but est d'automatiser ce processus, écoutez-moi!
La recherche de solutions algorithmiques est tout à fait bien et (à mon humble avis) vraiment intéressante. Mais, pour moi, les situations d'étiquetage de points se répartissent en trois catégories environ:
text
) n'est pas si compliqué.: grimper sur la caisse à savon:
Puisque les gens comme nous aiment automatisation, je pense que nous tombons souvent dans le piège de penser que presque tous les aspects de la production d'un bon graphique statistique devraient être automatisés. Je suis respectueusement (humblement!) En désaccord.
Il n'y a pas d'environnement de traçage statistique parfaitement général qui crée automatiquement l'image que vous avez dans votre tête. Des choses comme R, ggplot2, lattice etc. font la plupart du travail; mais ce petit ajustement supplémentaire, ajouter une ligne ici, ajuster une marge là-bas, est probablement mieux adapté à un outil différent.
: descente de la caisse à savon:
Je voudrais également noter que je pense que nous pourrions tous proposer des nuages de points avec <10-15 points qu'il sera presque impossible d'étiqueter proprement, même à la main, et ceux-ci briseront probablement toute solution automatique que quelqu'un trouvera.
Enfin, je tiens à répéter que je sais que ce n'est pas la réponse que vous recherchez. Et je ne suis pas dis que les tentatives algorithmiques sont inutiles ou stupides. J'ai voté pour cette question et je serai heureux de voter pour des solutions algorithmiques intéressantes!
La raison pour laquelle j'ai posté cette réponse est que je pense que cette question devrait être la question canonique «étiquetage de point dans R» pour les futurs doublons, et je pense que les solutions impliquant un étiquetage manuel méritent une place à la table, c'est tout.
la source
ggrepel
semble prometteur lorsqu'il est appliqué à desggplot2
nuages de points.la source
Avez-vous essayé le package directlabels ?
Et, BTW, les arguments pos et offset peuvent prendre des vecteurs pour vous permettre de les placer dans les bonnes positions lorsqu'il y a un nombre raisonnable de points en seulement quelques séries de tracé.
la source
plot()
tracé normal ? Je n'ai pas réussi à essayer donc ... Merci! PS: @SpacedMan & Ben, j'ai nettoyé mes commentaires concernant la mise à jour R, car ils ne sont pas tellement intéressants - vous pouvez faire de même.J'ai trouvé une solution! Ce n'est malheureusement pas ultime et idéal, mais c'est celui qui fonctionne le mieux pour moi maintenant. C'est à moitié algoritmique, à moitié manuel, ce qui fait gagner du temps par rapport à la solution manuelle pure esquissée par joran.
J'ai négligé une partie très importante de l'
?identify
aide!Donc, si vous utilisez la
identify()
solution comme je l'ai écrit dans ma question, alors vous pouvez affecter la position de l'étiquette en ne cliquant pas directement sur ce point, mais en cliquant à côté de ce point relativement dans la direction souhaitée !!! Fonctionne très bien!L'inconvénient est qu'il n'y a que 4 positions (en haut, à gauche, en bas, à droite), mais j'apprécierais plus les 4 autres (en haut à gauche, en haut à droite, en bas à gauche, en bas à droite) ... utilisez ceci pour étiqueter les points où cela ne me dérange pas et le reste des points que j'étiquette directement dans ma présentation Powerpoint, comme l'a proposé joran :-)
PS: Je n'ai pas encore essayé la solution de directlabels lattice / ggplot, je préfère toujours utiliser la bibliothèque de tracés de base.
la source
Je vous suggère de jeter un oeil à la
wordcloud
ensemble. Je sais que ce package ne se concentre pas exactement sur les points mais sur les étiquettes elles-mêmes, et le style semble également être plutôt fixe. Mais quand même, les résultats que j'ai obtenus en l'utilisant étaient assez étonnants. Notez également que la version du package en question a été publiée à peu près au moment où vous avez posé la question, elle est donc encore très récente.http://blog.fellstat.com/?cat=11
la source
J'ai écrit une fonction R appelée
addTextLabels()
dans un packageplotteR
. Le package peut être directement installé dans votre bibliothèque R à l'aide du code suivant:Pour l'exemple fourni, j'ai utilisé le code suivant pour générer l'exemple de figure lié ci-dessous.
Il fonctionne en sélectionnant automatiquement un emplacement alternatif à partir d'une fine grille de points. Les points les plus proches de la grille sont visités en premier et sélectionnés s'ils ne se chevauchent pas avec des points ou des étiquettes tracés. Jetez un œil au code source , si cela vous intéresse.
la source
Pas de réponse, mais trop long pour un commentaire. Une approche très simple qui peut fonctionner sur des cas simples, quelque part entre le post-traitement de joran et les algorithmes plus sophistiqués qui ont été présentés est de faire
in-place
des transformations simples dans le dataframe.J'illustre cela
ggplot2
parce que je suis plus familier avec cette syntaxe que les tracés de base R.Comme vous pouvez le voir, dans ce cas, le résultat n'est pas idéal, mais il peut être suffisant à certaines fins. Et c'est assez facile, généralement quelque chose comme ça suffit
within(df, y <- y+.01)
la source
df
usagewithin
, je le fais souvent en ajustant l'esthétique: çageom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
semble plus propre.