Comment puis-je obtenir les coordonnées x , y d'un geom_point dans un ggplot , où le cadre de référence est la totalité de l'image tracée?
Je peux créer un ggplot avec quelques geom_point en utilisant:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Cela donne:
En convertissant cela en un grob , je peux extraire des informations supplémentaires sur ce ggplot , comme les coordonnées par rapport au panneau de tracé, marquées par la flèche violette. Cependant, cela ignore l'espace occupé par les axes.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Comment puis-je obtenir les valeurs des coordonnées x , y lorsque je commence à mesurer à partir du coin inférieur gauche de l'image entière, marquée par la flèche verte?
Si c'est possible, j'aimerais que la solution prenne en compte le thème du ggplot . L'ajout d'un thème comme + theme_void()
affecte les axes et décale également l'emplacement des points par rapport à l'ensemble de l'image tracée.
Mise à jour : j'ai réalisé que la taille de police des axes change en fonction de la largeur et de la hauteur du tracé, affectant la taille relative du panneau de tracé . Il ne sera donc pas trivial de fournir l'emplacement en unités npc sans définir la largeur et la hauteur du tracé . Si possible, indiquez l'emplacement des geom_points en fonction de la largeur et de la hauteur du tracé .
Réponses:
Lorsque vous redimensionnez un ggplot, la position des éléments dans le panneau n'est pas à des positions fixes dans l'espace npc. En effet, certains composants du tracé ont des tailles fixes et certains d'entre eux (par exemple, le panneau) changent de dimensions en fonction de la taille de l'appareil.
Cela signifie que toute solution doit prendre en compte la taille de l'appareil et si vous souhaitez redimensionner le tracé, vous devrez réexécuter le calcul. Cela dit, pour la plupart des applications (y compris la vôtre, par le son des choses), ce n'est pas un problème.
Une autre difficulté consiste à s'assurer que vous identifiez les bons grobs dans le panneau grob, et il est difficile de voir comment cela pourrait facilement être généralisé. L'utilisation des fonctions de sous-ensemble de liste
[[6]]
et[[3]]
dans votre exemple n'est pas généralisable à d'autres tracés.Quoi qu'il en soit, cette solution fonctionne en mesurant la taille et la position du panneau dans le gtable, et en convertissant toutes les tailles en millimètres avant de les diviser par les dimensions du tracé en millimètres pour les convertir en espace npc. J'ai essayé de le rendre un peu plus général en extrayant le panneau et les points par nom plutôt que par index numérique.
Maintenant, nous pouvons le tester avec votre exemple:
Et nous pouvons confirmer que ces valeurs sont correctes en traçant des points de points sur vos points rouges, en utilisant nos valeurs comme coordonnées npc:
Créé le 2020-03-25 par le package reprex (v0.3.0)
la source
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
partie est la plus étrange. Pourriez-vous expliquer ce que vous résumez ici?panel_pos$t
donne la ligne de la grille dans laquelle se trouve le panneau (flexible), ainsi queseq(panel_pos$t -1)
tous les numéros de ligne au-dessus de celui-ci, et doncsum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
la somme des hauteurs de ces lignes.