web-dev-qa-db-fra.com

Comment extraire les plages des axes de tracé pour un objet ggplot2?

J'ai un objet de ggplot2, disons myPlot, comment identifier les plages des axes x et y?

Il ne semble pas s'agir d'un simple multiple de la plage des valeurs de données, car on peut redimensionner les tracés, modifier les plages des axes, etc. findFn (de sos) et Google ne semblent pas produire de résultats pertinents, autres que la façon de définir les plages des axes.

80
Iterator

Dans les versions plus récentes de ggplot2, vous pouvez trouver ces informations parmi la sortie de ggplot_build(p), où p est votre objet ggplot.

Pour les anciennes versions de ggplot (<0.8.9), la solution suivante fonctionne:

Et jusqu'à ce que Hadley publie la nouvelle version, cela pourrait être utile. Si vous ne définissez pas de limites dans le tracé, il n'y aura pas d'informations dans l'objet ggplot. Cependant, dans ce cas, vous pouvez utiliser les valeurs par défaut de ggplot2 et obtenir les xlim et ylim à partir des données.

> ggobj = ggplot(aes(x = speed, y = dist), data = cars) + geom_line()
> ggobj$coordinates$limits

$x
NULL

$y
NULL

Une fois que vous avez défini les limites, elles deviennent disponibles dans l'objet:

> bla = ggobj + coord_cartesian(xlim = c(5,10))
> bla$coordinates$limits
$x
[1]  5 10

$y
NULL
36
Paul Hiemstra

J'utilise ggplot2 Version 2, je ne sais pas s'il s'agit de la version précédente, supposons que vous ayez enregistré votre tracé sur l'objet plt. Il est facile d'extraire les gammes,

# y-range
layer_scales(plt)$y$range$range

# x-range
layer_scales(plt)$x$range$range

En cas de tracé de facettes, vous pouvez accéder aux échelles de facettes individuelles à l'aide de layer_scales(plot, row_idx, col_idx). Par exemple, pour accéder à la facette de la première ligne et de la deuxième colonne,

# y-range
layer_scales(plt, 1, 2)$y$range$range

# x-range
layer_scales(plt, 1, 2)$x$range$range
28
TheRimalaya

Obtenez le yrange avec

ggplot_build(myPlot)$panel$ranges[[1]]$y.range 

et la gamme x avec

ggplot_build(myPlot)$panel$ranges[[1]]$x.range
20
Alex Holcombe

Dans version 2.2. cela doit être fait comme suit:

# y-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$y.range
# x-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$x.range
16
pat-s

MISE À JOUR DE NOVEMBRE 2018

À partir du ggplot2version 3.1., les travaux suivants:

obj <- qplot(mtcars$disp, bins = 5)

# x range
ggplot_build(obj)$layout$panel_params[[1]]$x.range

# y range
ggplot_build(obj)$layout$panel_params[[1]]$y.range

Une fonction confort:

get_plot_limits <- function(plot) {
    gb = ggplot_build(plot)
    xmin = gb$layout$panel_params[[1]]$x.range[1]
    xmax = gb$layout$panel_params[[1]]$x.range[2]
    ymin = gb$layout$panel_params[[1]]$y.range[1]
    ymax = gb$layout$panel_params[[1]]$y.range[2]
    list(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)
}
get_plot_limits(p)

Jusqu'à la prochaine mise à jour ...

15
GegznaV

Depuis août 2018, vous extrayez les plages des axes x et y avec ce qui suit.

ggplot_build(obj)$layout$panel_scales_x[[1]]$range$rangeggplot_build(obj)$layout$panel_scales_y[[1]]$range$range

7
Michael

Comme mentionné ici: https://Gist.github.com/tomhopper/9076152#gistcomment-2624958 il y a une différence entre les deux options:

#get ranges of the data
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range 
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range

#get ranges of the plot axis
ggplot_build(obj)$layout$panel_params[[1]]$x.range
ggplot_build(obj)$layout$panel_params[[1]]$y.range

Voici un ensemble de fonctions pratiques pour prendre une liste de tracés, extraire la plage commune de l'axe y et la remplacer. J'en avais besoin parce que j'utilisais différents ensembles de données dans un graphique organisé via ggarange:

require(ggplot2)
#get the visible scales from single plots
get_plot_view_ylimits <- function(plot) {
  gb = ggplot_build(plot)
  ymin = gb$layout$panel_params[[1]]$y.range[1]
  ymax = gb$layout$panel_params[[1]]$y.range[2]
  message(paste("limits are:",ymin,ymax))
  list(ymin = ymin, ymax = ymax)
}

#change the limit of single plot, using list of limits
change_plot_ylimits <- function(plot, nlimits){
  p <- plot + ggplot2:::limits(unlist(nlimits, use.names =FALSE),"y")
}

#adjust the scales of multiple plots
#take a list of plots, passes back adjusted list of plots
adjust_plots_shared_ylimits <- function(plotList) {
  #read limits
  first <- TRUE
  for (plot in plotList) {
    if (first) {
      nlimits <- get_plot_view_ylimits(plot)
      first <- FALSE
    } else {
      altLimits <- get_plot_view_ylimits(plot)
      nlimits$ymin <- min(nlimits$ymin,altLimits$ymin)
      nlimits$ymax <- max(nlimits$ymax,altLimits$ymax)
    }
  }
  message(paste("new limits are:",nlimits$ymin,nlimits$ymax))
  #adjust limits
  lapply(plotList,change_plot_ylimits,nlimits)
}

J'ai pensé que cela pourrait également être utile pour d'autres.

0
Frederik