Mam obiekt z ggplot2
, powiedzmy myPlot
, jak mogę zidentyfikować zakresy dla osi X i Y?
Wydaje się, że nie jest to zwykła wielokrotność zakresu wartości danych, ponieważ można przeskalować wykresy, zmodyfikować zakresy osi i tak dalej. findFn
(from sos
) i Google nie wydają się zwracać odpowiednich wyników, poza tym, jak ustawić zakresy osi.
expand
. Zobacz tutaj .expand
argumentuscale_*
funkcji wggplot
. Na przykład zobacz wymienione tutaj wartości domyślne .ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Odpowiedzi:
W nowszych wersjach ggplot2 informacje te można znaleźć w wynikach polecenia
ggplot_build(p)
, gdziep
jest twój obiekt ggplot.W przypadku starszych wersji ggplot (<0.8.9) działa następujące rozwiązanie:
Może to być pomocne, dopóki Hadley nie wyda nowej wersji. Jeśli nie ustawisz granic w wykresie, w obiekcie ggplot nie będzie żadnych informacji. Jednak w takim przypadku możesz użyć wartości domyślnych ggplot2 i pobrać xlim i ylim z danych.
> ggobj = ggplot(aes(x = speed, y = dist), data = cars) + geom_line() > ggobj$coordinates$limits $x NULL $y NULL
Po ustawieniu granic stają się one dostępne w obiekcie:
> bla = ggobj + coord_cartesian(xlim = c(5,10)) > bla$coordinates$limits $x [1] 5 10 $y NULL
źródło
ggplot2
wersji 2.1.0.9001 użyj tegoR
kodu:ggplot_build(obj)$layout$panel_ranges[[1]]$x.range
ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
ggplot2
wersji 2.2.1.9000 i (najprawdopodobniej) nowszych użyj tegoR
kodu:ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Używam
ggplot2
wersji 2, nie jestem pewien, czy to jest ta sama wersja, co poprzednia. Załóżmy, że zapisałeś swój wykres naplt
obiekcie. Wyodrębnienie zakresów jest łatwe,# y-range layer_scales(plt)$y$range$range # x-range layer_scales(plt)$x$range$range
W przypadku wykresu fasetek można uzyskać dostęp do skal poszczególnych aspektów za pomocą
layer_scales(plot, row_idx, col_idx)
. Na przykład, aby uzyskać dostęp do aspektu w pierwszym wierszu i drugiej kolumnie,# y-range layer_scales(plt, 1, 2)$y$range$range # x-range layer_scales(plt, 1, 2)$x$range$range
źródło
ylim
lubcoord_cartesian
), rozszerzenie skali zostanie zastosowane do tych limitów, a nie do tych zwróconych przez kod podany tutaj.AKTUALIZACJA z listopada 2018 r
Od
ggplot2
wersji 3.1.0 działa: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
Wygodna funkcja:
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)
Do następnej aktualizacji ...
źródło
Zdobądź yrange z
ggplot_build(myPlot)$panel$ranges[[1]]$y.range
a xzakres z
ggplot_build(myPlot)$panel$ranges[[1]]$x.range
źródło
W wersji 2.2.0 należy to zrobić w następujący sposób:
# y-range ggplot_build(plot.object)$layout$panel_ranges[[1]]$y.range # x-range ggplot_build(plot.object)$layout$panel_ranges[[1]]$x.range
źródło
Począwszy od sierpnia 2018 r., Wyodrębniasz zakresy osi x i y w następujący sposób.
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
źródło
Jak wspomniano tutaj: https://gist.github.com/tomhopper/9076152#gistcomment-2624958 istnieje różnica między tymi dwiema opcjami:
#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
Oto zestaw wygodnych funkcji do pobrania listy wykresów, wyodrębnienia wspólnego zakresu osi Y i zastąpienia go. Potrzebowałem tego, ponieważ użyłem różnych zestawów danych w ramach jednego wykresu uporządkowanego za pomocą
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) }
Pomyślałem, że może to być przydatne również dla innych.
źródło
stat_smooth( method = "lm")