Comme le titre l'indique: Comment puis-je tracer une légende en dehors de la zone de traçage lors de l'utilisation de graphiques de base?
J'ai pensé à bidouiller layout
et à produire un tracé vide pour ne contenir que la légende, mais je serais intéressé d'une manière en utilisant uniquement les fonctionnalités du graphe de base et par exemple, par(mar = )
pour obtenir de l'espace à droite du tracé pour la légende.
Voici un exemple:
plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2))
lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")
legend(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))
produit:
Mais comme dit, je voudrais que la légende soit en dehors de la zone de traçage (par exemple, à droite du graphe / tracé.
Réponses:
Peut-être que vous avez besoin
par(xpd=TRUE)
de permettre aux objets d'être dessinés en dehors de la zone de tracé. Donc, si vous faites l'intrigue principale avec,bty='L'
vous aurez de l'espace sur la droite pour une légende. Normalement, cela serait découpé dans la région du tracé, mais faites-lepar(xpd=TRUE)
et avec un peu d'ajustement, vous pouvez obtenir une légende aussi loin que possible:la source
par(xpd=NA)
est encore plus puissante (c.-à-d. parcelles vers plus de régions).par
appel séparé juste avant la légende. Dans mon intrigue, j'ai utilisépar(new=T)
à plusieurs autres occasions et je voulais simplement ajouter lexpd
paramètre dans le même appel, ce qui cause des problèmes.Personne n'a mentionné l'utilisation de
inset
valeurs négatives pourlegend
. Voici un exemple, où la légende est à droite du graphique, alignée vers le haut (à l'aide du mot-clé"topright"
).La première valeur de
inset=c(-0.2,0)
peut nécessiter un ajustement en fonction de la largeur de la légende.la source
xpd
doit être réglé surTRUE
pour que l'encart négatif fonctionne. Mais parfois non. Avec la commandeargs.legend=list(x="bottom", horiz=TRUE, inset=-0.2)
dans un,barplot(...
il ne semble pas avoir besoinxpd=TRUE
mais avec justelegend(x="bottom", horiz=TRUE, inset=-0.2)
cela semble avoir besoinxpd=TRUE
. Des idées? Je suis juste confus en passant mes arguments?Une autre solution, en plus des ondes déjà mentionnées (en utilisant
layout
oupar(xpd=TRUE)
), consiste à superposer votre tracé avec un tracé transparent sur l'ensemble de l'appareil, puis à y ajouter la légende.L'astuce consiste à superposer un graphique (vide) sur toute la zone de traçage et à y ajouter la légende. Nous pouvons utiliser l'
par(fig=...)
option. Nous demandons d'abord à R de créer un nouveau tracé sur tout le périphérique de traçage:Réglage
oma
etmar
est nécessaire car nous voulons que l'intérieur de la parcelle recouvre l'ensemble de l'appareil.new=TRUE
est nécessaire pour empêcher R de démarrer un nouvel appareil. Nous pouvons ensuite ajouter le tracé vide:Et nous sommes prêts à ajouter la légende:
ajoutera une légende en bas à droite de l'appareil. De même, nous pouvons ajouter la légende dans la marge supérieure ou droite. La seule chose que nous devons nous assurer est que la marge de l'intrigue originale est suffisamment grande pour accueillir la légende.
Mettre tout cela en fonction;
Et un exemple. Commencez par créer l'intrigue en vous assurant que nous avons suffisamment d'espace en bas pour ajouter la légende:
Puis ajoutez la légende
Résultant en:
la source
Désolé d'avoir ressuscité un vieux fil, mais j'étais avec le même problème aujourd'hui. Le moyen le plus simple que j'ai trouvé est le suivant:
Trouvé ici: http://www.harding.edu/fmccown/R/
la source
J'aime le faire comme ça:
Le seul ajustement requis est de définir la marge de droite pour qu'elle soit suffisamment large pour accueillir la légende.
Cependant, cela peut également être automatisé:
la source
Récemment, j'ai trouvé une fonction très simple et intéressante pour imprimer la légende en dehors de la zone de tracé où vous le souhaitez.
Créez la marge extérieure sur le côté droit du tracé.
Créer un tracé
Ajoutez une légende et utilisez simplement la fonction locator (1) comme ci-dessous. Ensuite, vous devez simplement cliquer où vous voulez après le chargement du script suivant.
Essayez-le
la source
Je ne peux offrir qu'un exemple de la solution de mise en page déjà indiquée.
la source
Ajout d'une autre alternative simple qui est assez élégante à mon avis.
Votre intrigue:
Légende:
Résultat:
Ici, seule la deuxième ligne de la légende a été ajoutée à votre exemple. À son tour:
inset=c(0,1)
- déplace la légende par fraction de zone de tracé dans les directions (x, y). Dans ce cas, la légende est en"bottomright"
position. Il est déplacé par 0 région de traçage dans la direction x (donc reste à «droite») et par 1 région de traçage dans la direction y (de bas en haut). Et il se trouve qu'il apparaît juste au-dessus de l'intrigue.xpd=TRUE
- la légende apparaît en dehors de la région de traçage.horiz=TRUE
- demande de produire une légende horizontale.bty="n"
- un détail de style pour se débarrasser de la boîte englobante de légende.Il en va de même lors de l'ajout d'une légende sur le côté:
Ici, nous avons simplement ajusté les positions des légendes et ajouté un espace de marge supplémentaire sur le côté droit du tracé. Résultat:
la source
Vous pouvez le faire avec l' API Plotly R , avec du code, ou à partir de l'interface graphique en faisant glisser la légende où vous le souhaitez.
Voici un exemple. Le graphique et le code sont également ici .
Vous pouvez positionner la légende en dehors du graphique en affectant l'une des valeurs x et y à 100 ou -100.
Voici les autres options:
list("x" = 100, "y" = 0)
pour l'extérieur en bas à droitelist("x" = 100, "y"= 1)
Extérieur droit en hautlist("x" = 100, "y" = .5)
Extérieur droit milieulist("x" = 0, "y" = -100)
Sous gauchelist("x" = 0.5, "y" = -100)
Sous le centrelist("x" = 1, "y" = -100)
Sous la droitePuis la réponse.
response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));
Renvoie tracé une URL avec votre graphique lorsque vous passez un appel. Vous pouvez y accéder plus rapidement en appelant
browseURL(response$url)
pour qu'il ouvre votre graphique dans votre navigateur pour vous.Cela nous donne ce graphique. Vous pouvez également déplacer la légende à partir de l'interface graphique, puis le graphique sera mis à l'échelle en conséquence. Divulgation complète: je fais partie de l'équipe Plotly.
la source
Essayez
layout()
ce que j'ai utilisé pour cela dans le passé en créant simplement un tracé vide ci-dessous, correctement mis à l'échelle à environ 1/4 et en y plaçant manuellement les parties de la légende.Il y a ici des questions plus anciennes sur
legend()
lesquelles devraient vous aider à démarrer.la source