npc coordonnées de geom_point dans ggplot2

LBogaardt:

Comment puis - je obtenir le x , y coordonnées d'un geom_point dans un ggplot , où le cadre de référence est l'ensemble de l' image tracée?

Je peux créer un ggplot avec quelques geom_point s 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:

entrez la description d'image ici

En convertissant cela en une Grob , je peux extraire des informations supplémentaires sur ce ggplot , comme les coordonnées par rapport au panneau de tracé, marqué par la flèche violette. Toutefois, cela ne tient pas compte de 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 de x , y coordonnées quand je commence à mesurer à partir du coin inférieur gauche de l'image entière, marquée par la flèche verte?

S'il est possible, je voudrais la solution à prendre en compte le thème de la ggplot . 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 : je me suis aperçu que la taille de la police des axes change en fonction de la largeur et la hauteur de la parcelle, affectant la taille relative du panneau de parcelle . Donc , il ne sera pas trivial de fournir l'emplacement dans npc unités sans définir la largeur de la parcelle et la hauteur de la parcelle . Si possible, à l'emplacement des geom_points en fonction de la largeur de la parcelle et la hauteur de la parcelle .

Allan Cameron:

Lorsque vous redimensionnez une ggplot, la position des éléments dans le panneau ne sont pas à des positions fixes dans l'espace npc. En effet, certains des composants de la parcelle ont des dimensions fixes, et certains d'entre eux (par exemple, le panneau) Modifier les dimensions en fonction de la taille de l'appareil.

Cela signifie que toute solution doit prendre la taille de l'appareil en compte, et si vous voulez redimensionner la parcelle, vous auriez à courir à nouveau le calcul. Cela dit, pour la plupart des applications (y compris le vôtre, par les sons des choses), ce n'est pas un problème.

Une autre difficulté est de vous désignez les Grobs correct dans le panneau Grob, et il est difficile de voir comment cela pourrait facilement être généralisée. En utilisant les fonctions de sous - ensemble de la liste [[6]]et [[3]]dans votre exemple ne sont pas généralisables à d' autres parcelles.

Quoi qu'il en soit, cette solution fonctionne en mesurant la taille du panneau et la position dans le gtable, et la conversion de toutes tailles milimètres avant de diviser par les dimensions des parcelles en milimètres pour convertir l'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 l'index numérique.

library(ggplot2)
library(grid)
require(gtable)

get_x_y_values <- function(gg_plot)
{
  img_dim      <- grDevices::dev.size("cm") * 10
  gt           <- ggplot2::ggplotGrob(gg_plot)
  to_mm        <- function(x) grid::convertUnit(x, "mm", valueOnly = TRUE)
  n_panel      <- which(gt$layout$name == "panel")
  panel_pos    <- gt$layout[n_panel, ]
  panel_kids   <- gtable::gtable_filter(gt, "panel")$grobs[[1]]$children
  point_grobs  <- panel_kids[[grep("point", names(panel_kids))]]
  from_top     <- sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
  from_left    <- sum(to_mm(gt$widths[seq(panel_pos$l - 1)]))
  from_right   <- sum(to_mm(gt$widths[-seq(panel_pos$l)]))
  from_bottom  <- sum(to_mm(gt$heights[-seq(panel_pos$t)]))
  panel_height <- img_dim[2] - from_top - from_bottom
  panel_width  <- img_dim[1] - from_left - from_right
  xvals        <- as.numeric(point_grobs$x)
  yvals        <- as.numeric(point_grobs$y)
  yvals        <- yvals * panel_height + from_bottom
  xvals        <- xvals * panel_width + from_left
  data.frame(x = xvals/img_dim[1], y = yvals/img_dim[2])
}

Maintenant, nous pouvons le tester avec votre exemple:

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

my.points <- get_x_y_values(my.plot)
my.points
#>           x         y
#> 1 0.1252647 0.1333251
#> 2 0.5004282 0.2330669
#> 3 0.9479917 0.9442339

Et nous pouvons confirmer ces valeurs sont correctes en traçant des points Grobs sur vos points rouges, en utilisant nos valeurs npc coordonnées:

my.plot
grid::grid.draw(pointsGrob(x = my.points$x, y = my.points$y, default.units = "npc"))

Créé le 25/03/2020 par le paquet reprex (v0.3.0)

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=370043&siteId=1
conseillé
Classement