У меня есть объект ggplot2
, скажем myPlot
, как я могу определить диапазоны для осей x и y?
Это не похоже на простое кратное диапазону значений данных, потому что можно масштабировать графики, изменять диапазоны осей и так далее. findFn
(from sos
) и Google, похоже, не дают релевантных результатов, кроме как установить диапазоны осей.
expand
. Смотрите здесь .expand
аргументscale_*
функций вggplot
. Например, см. Перечисленные здесь значения по умолчанию .ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Ответы:
В более новых версиях ggplot2 вы можете найти эту информацию среди выходных данных
ggplot_build(p)
, гдеp
находится ваш объект ggplot.Для более старых версий ggplot (<0.8.9) работает следующее решение:
И пока Хэдли не выпустит новую версию, это может быть полезно. Если вы не установите ограничения на графике, в объекте ggplot не будет информации. Однако в этом случае вы можете использовать значения по умолчанию для ggplot2 и получить xlim и ylim из данных.
> ggobj = ggplot(aes(x = speed, y = dist), data = cars) + geom_line() > ggobj$coordinates$limits $x NULL $y NULL
Как только вы установите лимиты, они станут доступны в объекте:
> bla = ggobj + coord_cartesian(xlim = c(5,10)) > bla$coordinates$limits $x [1] 5 10 $y NULL
источник
ggplot2
версии 2.1.0.9001 используйте этотR
код:ggplot_build(obj)$layout$panel_ranges[[1]]$x.range
ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
ggplot2
версии 2.2.1.9000 и (скорее всего) более новой используйте этотR
код:ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Я использую
ggplot2
версию 2, я не уверен, совпадает ли она с предыдущей версией. Предположим, вы сохранили свой график наplt
объекте. Диапазоны легко извлечь,# y-range layer_scales(plt)$y$range$range # x-range layer_scales(plt)$x$range$range
В случае построения фасетов вы можете получить доступ к шкалам отдельных фасетов, используя
layer_scales(plot, row_idx, col_idx)
. Например, чтобы получить доступ к фасету в первой строке и втором столбце,# y-range layer_scales(plt, 1, 2)$y$range$range # x-range layer_scales(plt, 1, 2)$x$range$range
источник
ylim
илиcoord_cartesian
), расширение шкалы будет применяться к этим пределам, а не к тем, которые возвращаются приведенным здесь кодом.Ноябрь 2018 ОБНОВЛЕНИЕ
Начиная с
ggplot2
версии 3.1.0 , работает следующее: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
Удобная функция:
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)
До следующего обновления ...
источник
Получите диапазон с
ggplot_build(myPlot)$panel$ranges[[1]]$y.range
и xrange с
ggplot_build(myPlot)$panel$ranges[[1]]$x.range
источник
В версии 2.2.0 это нужно сделать следующим образом:
# y-range ggplot_build(plot.object)$layout$panel_ranges[[1]]$y.range # x-range ggplot_build(plot.object)$layout$panel_ranges[[1]]$x.range
источник
По состоянию на август 2018 вы извлекаете диапазоны осей x и y следующим образом.
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
источник
Как уже упоминалось здесь: https://gist.github.com/tomhopper/9076152#gistcomment-2624958, есть разница между двумя вариантами:
#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
Вот набор удобных функций для получения списка графиков, извлечения общего диапазона оси Y и его замены. Мне это было нужно, потому что я использовал разные наборы данных в одном графике, организованном с помощью
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) }
Я подумал, что это может быть полезно и другим.
источник
stat_smooth( method = "lm")