Quelle est la largeur de l'argument dans position_dodge?
La documentation n'explique pas ce que c'est exactement ce width
argument
- Dont la largeur est-il le préciser?
- Ce qui est l ' "unité"?
- Ce qui est la valeur par défaut?
La valeur par défaut est width = NULL
, mais l'essai et l'erreur montre que width = 0.9
semble produire l'effet par défaut (voir postscript). Cependant, Je ne pouvais pas trouver où cette valeur par défaut est définie à ggplot2
code source. Ainsi,
- Pourriez-vous expliquer comment la valeur par défaut dodge est mis en œuvre dans
ggplot2
code?
L'esprit de la question est de permettre ggplot2
les utilisateurs à trouver les width
valeurs, sans essai et d'erreur.
PS:
ggplot(data = df) +
geom_bar(aes(x, y, fill = factor(group)),
position = position_dodge(), stat = "identity")
ggplot(data = df) +
geom_bar(aes(x, y, fill = factor(group)),
position = position_dodge(0.9), stat = "identity")
Vous devez vous connecter pour publier un commentaire.
Je vais d'abord donner des réponses très brèves à vos trois questions principales. Puis-je marcher à travers plusieurs exemples pour illustrer les réponses de manière plus approfondie.
La largeur des éléments à être esquivé.
La réelle ou le virtuel largeur dans les unités de données des éléments d'être esquivé.
Si vous n'avez pas ensemble la esquivant
width
explicitement, mais dépendent de la valeur par défaut,position_dodge(width = NULL)
(ou justeposition = "dodge"
), la dodge largeur qui est utilisée est la largeur réelle en unités de données de l'élément à être esquivé.Je crois que votre quatrième question est trop large DONC. Veuillez consulter le code de
collision
etdodge
et, si nécessaire, demandez à un nouveau, plus spécifique, question.Basé sur l'esquive de la largeur de l'élément (avec son original en position horizontale et le nombre d'éléments qui sont empilés), le nouveau centre de positions (
x
) de chaque élément, et de nouvelles largeurs (xmin
,xmax
positions) sont calculés. Les éléments sont décalés horizontalement juste assez loin pour ne pas se chevauchent avec les éléments adjacents. De toute évidence, à l'échelle des éléments doit être changé plus que les éléments dans l'ordre pour éviter les chevauchements.Pour obtenir une meilleure sensation à esquiver en général et de l'utilisation de la
width
argument en particulier, je montre quelques exemples. Nous commençons avec un simple esquivé diagramme en barres, avec par défaut en esquivant; on peut utiliser soitposition = "dodge"
ou le plus expliciteposition = position_dodge(width = NULL)
Donc (1) qui est
width
est-il dansposition_dodge
et (2) quelle est l'unité?Dans
?position_dodge
on peut lire:Ainsi, si nous utilisons la par défaut
width
, c'est à direNULL
, l'esquivant calulations sont base sur la largeur des éléments individuels.Donc une simple réponse à votre première question, "Dont la largeur ne précise pas?, serait: la largeur des éléments individuels.
Mais bien sûr, nous avons alors se demander, qu'est-ce que "la largeur des éléments individuels"? Commençons avec les barres. De
?geom_bar
:Une nouvelle question se pose: quelle est la résolution? Nous allons vérifier
?ggplot2::resolution
:Nous essayons:
Ainsi, la valeur par défaut la largeur de la barre dans cet exemple est
0.9 * 1 = 0.9
Nous pouvons le vérifier en consultant les données
ggplot
utilise pour rendre les bars sur la parcelle à l'aide deggplot_build
. Nous créons une parcelle objet avec un empilées barplot, avec des barres de largeur par défaut.L'emplacement correspondant dans l'objet est
$data
, qui est une liste avec un seul élément pour chaque couche dans l'intrigue, dans le même ordre qu'ils apparaissent dans le code. Dans cet exemple, nous n'avons qu'une seule couche, c'est à diregeom_bar
, regardons donc le premier emplacement:Chaque ligne contient les données de 'tirer' une seule barre. Comme vous pouvez le voir, la largeur de la des bars sont tous à 0,9 (
xmax - xmin = 0.9
). Ainsi, la largeur de la empilés les bars, pour être utilisé dans les calculs de la nouvelle esquivé les positions et les largeurs, est0.9
.Dans l'exemple précédent, nous avons utilisé la valeur par défaut la largeur de la barre, avec la valeur par défaut dodge largeur. Maintenant, nous allons faire la barre légèrement plus large que la largeur par défaut ci-dessus (0.9). Utiliser le
width
argument engeom_bar
explicitement ensemble l' (empilé) la largeur de la barre de l'e.g 1. Nous essayons d'utiliser les mêmes dodge largeur comme ci-dessus (position_dodge(width = 0.9)
). Ainsi, alors que nous avons ensemble la réelle la largeur de la barre à 1, la dodge calculs sont effectués comme si les barres sont de 0,9 large. Voyons ce qui se passe:Les bars se chevauchent, car ggplot changements bars horizontalement comme si ils ont un (empilés) largeur de 0,9 (ensemble dans
position_dodge
), alors qu'en fait, les bars ont une largeur de 1 (ensemble dansgeom_bar
).Si nous utilisons le par défaut esquiver les valeurs, les barres sont déplacés horizontalement de manière précise en fonction de la ensemble la largeur de la barre:
Ensuite, nous essayons d'ajouter du texte à notre parcelle à l'aide de
geom_text
. Nous commençons avec la valeur par défaut en esquivantwidth
(c'est à direposition_dodge(width = NULL)
), c'est à dire en esquivant est basé sur la taille d'élément par défaut.La esquivant du texte n'est pas. Quel est le message d'avertissement? "La largeur n'est pas défini?". Légèrement énigmatique. Nous avons besoin de consulter la section des Détails de
?geom_text
:Donc pour
geom_text
, la largeur des éléments individuels est égale à zéro. C'est aussi la première "officielle ggplot référence" à votre deuxième question: L'unité dewidth
est dans unités de données.Regardons les données utilisées pour rendre le texte des éléments sur l'intrigue:
En effet,
xmin == xmax
; Ainsi, la largeur de l'élément de texte dans les unités de données est zéro.Comment parvenir à corriger en esquivant de l'élément de texte avec une largeur de zéro? À partir d'Exemples dans
?geom_text
:Ainsi, pour esquiver l'utilisation de la même largeur pour
geom_text
éléments que legeom_bar
éléments lorsque de nouveaux postes sont calculés, nous avons besoin de ensemble "le virtuel en esquivant largeur dans les unités de données" de l'élément de texte à la même largeur que les bars. Nous utilisons lewidth
argument deposition_dodge
à ensemble le virtuel largeur de l'élément de texte à 0,9 (c'est à dire la largeur de la barre dans l'exemple ci-dessus):Vérifier les données utilisées pour le rendu
geom_text
:Maintenant les éléments de texte ont une largeur en unités de données:
xmax - xmin = 0.9
, c'est à dire de la même largeur que les bars. Ainsi, la dodge calculs seront maintenant comme si les éléments de texte ont une certaine largeur, ici 0.9. Le rendu de la parcelle:Le texte est esquivé correctement!
Semblable à du texte, la largeur en unités de données de points (
geom_point
) et des barres d'erreur (par exemple,geom_errorbar
) est égale à zéro. Ainsi, si vous avez besoin d'esquiver ces éléments, vous devez spécifier un virtuels pertinents largeur, sur laquelle esquiver les calculs sont alors en fonction. Voir, par exemple, l'Exemple de l'article de?geom_errorbar
:Voici un exemple avec plusieurs valeurs de x sur une échelle continue:
Disons que nous voulons créer un esquivé barplot avec un peu de texte au-dessus de chaque barre. D'abord, il suffit de vérifier barplot uniquement à l'aide de la valeur par défaut en esquivant largeur:
Qu'il fonctionne comme prévu. Ensuite, ajouter le texte. Nous essayons de définir le virtuel largeur de l'élément de texte à la même que la largeur des barres dans l'exemple ci-dessus, c'est à dire on "suppose" que les barres de toujours avoir la largeur de 0,9, et que nous avons besoin d'esquiver les éléments de texte comme si ils ont une largeur de 0,9 ainsi:
Clairement, l'esquivant de calcul pour les barres est maintenant basé sur une largeur différente de 0,9 et de réglage de l'virtuel largeur de 0,9 pour l'élément de texte est une mauvaise proposition. Donc, ce que est la largeur de la barre ici? Encore une fois, la largeur de la barre est "[e]n par défaut, réglé à 90% de la résolution des données". Vérifiez la résolution:
Ainsi, la largeur de l' (par défaut empilés) les bars, sur lequel leur nouveau, esquivé la position est calculée, est maintenant
0.9 * 10 = 9
. Ainsi, pour esquiver les bars et leurs correspondants texte "main dans la main", nous avons besoin de définir le virtuel largeur de la également des éléments de texte à 9:Dans notre dernier exemple, nous avons une catégorie de l'axe x, juste un "facteur de la version' des valeurs de x à partir de ci-dessus.
Dans R, les facteurs qui sont à l'interne un ensemble de codes entier avec un "niveaux" de l'attribut. Et à partir de
?resolution
:Maintenant, nous savons que, lorsque
resolution
est 1, la valeur par défaut de la largeur des barres est de 0,9. Ainsi, sur un catégorique de l'axe x, la largeur par défaut pourgeom_bar
est de 0,9, et nous avons besoin de définir le esquivantwidth
pourgeom_text
en conséquence:aes(y = y / 2)
àgeom_text
.