ggplot2 객체에 대한 플롯 축의 범위를 어떻게 추출 할 수 있습니까?


88

에서 개체가 있습니다 ggplot2. 예 myPlot를 들어 x 및 y 축의 범위를 어떻게 식별 할 수 있습니까?

플롯 크기를 재조정하고 축 범위를 수정할 수 있기 때문에 데이터 값 범위의 단순한 배수가 아닌 것 같습니다. findFn(부터 sos) 및 Google은 축 범위를 설정하는 방법 외에 관련 결과를 표시하지 않는 것 같습니다.


1
플롯 객체 자체에서 직접 추출 할 수는 없지만 데이터와 expand. 를 참조하십시오 여기 .
joran

1
expandscale_*함수에 대한 인수를 언급 했습니다 ggplot. 예를 들어 여기에 나열된 기본값을 참조 하십시오 .
joran

6
당신은 ... 다음 버전을 추출 할 수 있습니다
해들리

1
대신 Alex Holcombe의 답변을 받아 주시겠습니까? Paul Hiemstra 's는 3 년 전의 ggplot2 버전에만 관련이 있습니다.
Max

4
** 2018 년 8 월부터 다음을 사용하여 x 및 y 축 범위를 추출합니다. ** ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Michael

답변:


41

최신 버전의 ggplot2에서는의 출력에서이 정보를 찾을 수 있습니다 . ggplot_build(p)여기서 pggplot 객체는 어디에 있습니까?

이전 버전의 ggplot (<0.8.9)의 경우 다음 솔루션이 작동합니다.

그리고 Hadley가 새 버전을 출시 할 때까지 이것은 도움이 될 수 있습니다. 플롯에서 제한을 설정하지 않으면 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

34
특히 최신 버전의 ggplot2에서는 ggplot_build (ggobj) $ panel $ ranges [[1]] $ y.range로 yrange를, ggplot_build (ggobj) $ panel $ ranges [[1]] $로 xrange를 가져올 수 있습니다. x.range
Alex Holcombe

11
들어 ggplot2버전 2.1.0.9001이 사용 R: 코드 ggplot_build(obj)$layout$panel_ranges[[1]]$x.range ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
GegznaV

17
대한 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
GegznaV

3
원래 플롯 호출 내에서 동적으로 수행 할 수있는 방법이 없습니까?
jzadra

4
2.2.1에서 당신은 또한 $ Y $ 범위 $ 범위 layer_scales (ggobj)를 사용할 수 있습니다
알렉스 홀콤

40

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

2
그리고 버전 3.1.0
r_alanb

2
이것은 플롯 할 데이터의 범위를 제공합니다. 전체 축 범위를 얻으려면 스케일 확장을 허용해야합니다. 한도가 설정되어있는 경우 또한, (예를 통해 ylim또는 coord_cartesian) 규모 확장은 오히려 여기에 주어진 코드에 의해 반환 된 것보다 이러한 제한이 적용됩니다.
Heather Turner

22

2018 년 11 월 업데이트

현재 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)

다음 업데이트까지 ...


1
편의 기능이있는 편집을 제안하고 마음에 들지 않으면 롤백합니다. ;-)
PatrickT 2018

1
@PatrickT 업데이트는 정말 편리합니다. 정말 감사합니다 :)
GegznaV

20

yrange 가져 오기

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

그리고 xrange

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

2
이러한 솔루션은 연속 숫자 축에 적합하지만 날짜 (연속 척도) 또는 범주 값이있는 축을 어떻게 처리 할 수 ​​있습니까? 이 방법을 사용하면 geom_text를 사용하여 텍스트를 추가하기 위해 날짜 형식으로 변환해야하는 큰 숫자 값을 얻습니다.
Joseph Kreke

축 제한을 설정하지 않고 기본적으로 ggplot이 제안하는 것을 사용하면 어떻게됩니까? 내 사용 사례는 내가 플롯 1의 기본값을 좋아하지만 플롯 2가 플롯 1과 동일한 축 제한을
갖기를 원한다는 것입니다

16

버전 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

8

2018 년 8 월부터 다음을 사용하여 x 및 y 축 범위를 추출합니다.

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


2

여기에서 언급했듯이 : 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")
Frederik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.