105 votes

Emplacement de l’étiquette intelligente point r

1) Est-il R bibliothèque/fonction qui permettrait de mettre en œuvre INTELLIGENTE de placement des étiquettes dans la R de la parcelle? J'ai essayé un peu, mais elles sont toutes problématique, de nombreuses étiquettes sont la superposition soit les uns les autres ou à d'autres points (ou d'autres objets dans l'intrigue, mais je vois que c'est beaucoup plus difficile à gérer).

2) Si non, est-il de toute façon comment CONFORTABLEMENT à l'aide de l'algorithme avec le placement des étiquettes pour certains points problématiques? Plus confortable et efficace solution voulais.

Vous pouvez jouer et de tester d'autres possibilités avec mon reproductible exemple et voir si vous êtes en mesure d'obtenir de meilleurs résultats que j'ai:

# 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 des étiquettes pour tous les points, mais juste pour le les valeurs aberrantes, mais encore, les étiquettes sont souvent mal placé:

identify(x, y, labels = ShortSci, cex = 0.7)

3) cette fois on a regardé prometteur mais il y a le problème des étiquettes d'être trop près de la points; j'ai eu à le pavé avec des espaces, mais cela ne l'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)

Je vous remercie à l'avance!

EDIT: todo: essayez labcurve {Hmisc}.

48voto

joran Points 68079

Tout d'abord, voici les résultats de ma solution à ce problème:

enter image description here

Je l'ai fait à la main dans l'Aperçu (très basique PDF/visionneuse d'image sur OS X) en seulement quelques minutes. (Edit: Le flux de travail a été exactement ce que vous attendez: j'ai sauvé l'intrigue en tant que fichier PDF à partir de R, ouvert en avant-première et créé des zones de texte avec les étiquettes (9pt Helvetica) et ensuite venez de glisser autour de ma souris, jusqu'à ce qu'ils avait l'air bien. J'ai ensuite exporté en PNG pour le téléchargement.)

Maintenant, avant de succomber à la forte envie de bas de vote, c'est dans l'oubli et laisser sarcastique des commentaires sur la façon dont le point est d'automatiser ce processus, écoutez-moi!

La recherche de solutions algorithmiques est tout à fait bien, et (à mon humble avis) vraiment intéressant. Mais, pour moi, point d'étiquetage des situations de tomber dans à peu près trois catégories:

  1. Vous avez un petit nombre de points, aucun, qui sont terriblement proches ensemble. Dans ce cas, une des solutions que vous avez énumérés dans la question est susceptible de travailler avec assez minime de peaufinage.
  2. Vous avez un petit nombre de points, dont certains qui sont trop serrées pour le type des solutions algorithmiques pour donner de bons résultats. Dans ce cas, puisque vous n'avez qu'un petit nombre de points, à l'étiquetage à la main (avec un éditeur d'image ou affiner votre appel à l' text) n'est pas que beaucoup d'efforts.
  3. Vous avez un assez grand nombre de points. Dans ce cas, vous ne devriez pas être à l'étiquetage de toute façon, depuis qu'il est difficile de traiter un grand nombre de labels visuellement.

:monter sur scène:

Car des gens comme nous de l'amour de l'automatisation, je pense que nous tombent souvent dans le piège de penser que presque tous les aspects de la production d'une bonne statistique graphique devrait être automatisé. Je suis d' (humblement!) en désaccord.

Il n'est pas parfaitement statistique générale de traçage de l'environnement qui crée automatiquement l'image que vous avez dans votre tête. Des choses comme R, ggplot2, treillis, etc. faire la plupart du travail; mais que le surplus de peu de peaufinage, l'ajout d'une ligne ici, l'ajustement d'une marge de là, est probablement mieux adapté à un autre outil.

:l'escalade vers le bas à partir de la boîte à savon:

Je voudrais aussi souligner que je pense que nous pourrions tous venir avec les nuages de points avec <10-15 points qui vous sera presque impossible à proprement étiquette, même à la main, et risquent de pause automatique de la solution de quelqu'un arrive avec.

Enfin, je tiens à répéter que je sais que ce n'est pas la réponse que vous cherchez. Et je suis pas en disant que algorithmiques tentatives sont inutiles ou stupides. I-a voté cette question, et sera heureux de upvote intéressant solutions algorithmiques!

La raison que j'ai posté cette réponse, c'est que je pense que cette question devrait être la canoniques "point d'étiquetage dans R" question pour l'avenir des doublons, et je pense que des solutions de main-d'étiquetage méritent une place à la table, c'est tout.

10voto

John Points 11714

Avez-vous essayé le paquet de directlabels ?

Et BTW, les pos et les arguments de décalage peuvent prendre des vecteurs pour vous permettre d’obtenir dans les positions de droite quand il y a un nombre raisonnable de points en seulement quelques descentes de parcelle.

6voto

TMS Points 17522

J'ai trouvé une solution! C'est pas ultime et idéal malheureusement, mais c'est celui qui fonctionne le mieux pour moi maintenant. C'est la moitié algoritmic, la moitié manuel, il permet de gagner du temps par rapport à la pure manuel de la solution esquissée par joran.

J'ai négligé très importante partie de l' ?identify de l'aide!

L'algorithme utilisé pour placer les étiquettes est le même que celui utilisé par le texte si pos est spécifié, la différence étant que la position de l' pointeur par rapport identifiés point détermine pos dans les identifier.

Donc, si vous utilisez l' identify() solution comme je l'ai écrit dans ma question, alors vous pouvez affecter la position de l'étiquette par pas en cliquant directement sur ce point, mais en cliquant sur à côté de ce point relativement à la direction de votre choix!!! Fonctionne tout simplement génial!

L'inconvénient, c'est qu'il y a seulement 4 positions (haut, gauche, bas, droite), mais j'ai plus apprécier les 4 autres (haut-gauche, haut-droite, bas-gauche, bas-droite)... j'ai Donc l'utiliser pour les étiquettes des points où ça ne me dérange pas et le reste des points, je l'étiquette directement dans ma présentation Powerpoint, comme joran proposés :-)

P. S.: je n'ai pas essayé le directlabels treillis/ggplot solution pour le moment, je préfère encore utiliser l'intrigue de base de la bibliothèque.

4voto

maj Points 321

Je suggère que vous jetez un oeil à la `` paquet. Je sais que ce paquet porte pas exactement sur les points, mais sur les étiquettes elles-mêmes, et aussi le style semble être plutôt fixe. Mais encore, les résultats que j’ai eu de l’utiliser sont assez étonnants. Notez également que la version du package en question a été publiée à l’heure que vous a posé la question, donc c’est encore tout nouveau.

http://blog.fellstat.com/?Cat=11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X