Bir ggplot2 nesnesi için çizim eksenlerinin aralıklarını nasıl çıkarabilirim?


90

Ben bir nesne var ggplot2diyelim ki myPlot, nasıl x ve y eksenleri için aralıkları belirleyebilir?

Veri değerleri aralığının basit bir katı gibi görünmüyor, çünkü çizimleri yeniden ölçeklendirebilir, eksen aralıklarını değiştirebilir vb. findFn(kimden sos) ve Google, eksen aralıklarının nasıl ayarlanacağı dışında alakalı sonuçlar vermiyor gibi görünüyor.


1
Bunun doğrudan çizim nesnesinin kendisinden çıkarılamayacağından oldukça eminim, ancak bunu (basit durumlarda) verilerinizden ve expand. Buraya bakın .
joran

1
İçindeki fonksiyonların expandargümanına atıfta scale_*bulunuyordum ggplot. Örneğin, burada listelenen varsayılanlara bakın .
joran

6
Bir sonraki sürümde ayıklayabileceksiniz ...
hadley

1
Bunun yerine lütfen Alex Holcombe'un cevabını kabul eder misiniz? Paul Hiemstra's, yalnızca ggplot2'nin üç yıldan daha eski sürümleriyle ilgilidir.
Max Ghenis

4
** Ağustos 2018 itibarıyla x ve y ekseni aralıklarını aşağıdakilerle çıkaracaksınız. ** ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
Michael

Yanıtlar:


41

Ggplot2'nin daha yeni sürümlerinde, bu bilgiyi ggplot nesneniz ggplot_build(p)nerede? pÇıkışında bulabilirsiniz.

Ggplot'un eski sürümleri için (<0.8.9) aşağıdaki çözüm işe yarar:

Hadley yeni sürümü yayınlayana kadar, bu yardımcı olabilir. Grafikte sınırları ayarlamazsanız, ggplot nesnesinde bilgi olmayacaktır. Bununla birlikte, bu durumda, ggplot2'nin varsayılanlarını kullanabilir ve verilerden xlim ve ylim'i alabilirsiniz.

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

$x
NULL

$y
NULL

Sınırları belirlediğinizde, bunlar nesnede kullanılabilir hale gelir:

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

$y
NULL

34
Özellikle, ggplot2'nin daha yeni sürümlerinde, yrange'i ggplot_build (ggobj) $ panel $ aralıkları [[1]] $ y.range ve xrange ile ggplot_build (ggobj) $ panel $ aralıkları [[1]] $ alabilirsiniz x.range
Alex Holcombe

11
İçin ggplot2sürümü 2.1.0.9001 bunu kullanın R: kod ggplot_build(obj)$layout$panel_ranges[[1]]$x.range ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
GegznaV

19
İçin ggplot2 sürümü 2.2.1.9000 ve (büyük olasılıkla) yeni kullanımı bu Rkodu: ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
GegznaV

3
Orijinal arsa çağrısında bunu dinamik olarak yapmanın bir yolu yok mu?
jzadra

4
2.2.1'de ayrıca layer_scales (ggobj) $ y $ range $ range
Alex Holcombe

41

ggplot2Sürüm 2'yi kullanıyorum , bunun önceki sürüm olup olmadığından emin değilim, Çiziminizi pltnesneye kaydettiğinizi varsayalım . Aralıkları çıkarmak kolaydır,

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

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

Façeta çizimi durumunda, kullanarak bireysel façetlerin ölçeklerine erişebilirsiniz layer_scales(plot, row_idx, col_idx). Örneğin ilk satır ve ikinci sütundaki fasete erişmek için,

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

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

2
Ve sürüm 3.1.0
r_alanb

2
Bunun size çizilecek veri aralığını verdiğini unutmayın - tam eksen aralığını elde etmek için ölçek genişletmeye izin vermeniz gerekir. Ayrıca, sınırlar belirlenmişse (örn. Aracılığıyla ylimveya coord_cartesian), burada verilen kod tarafından döndürülen sınırlar yerine ölçek genişletmesi bu sınırlara uygulanacaktır.
Heather Turner

22

Kasım 2018 GÜNCELLEME

İtibariyle ggplot2 sürümü 3.1.0 , şu çalışır:

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

Bir kolaylık işlevi:

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)

Bir sonraki güncellemeye kadar ...


1
Kolaylık işlevi olan bir düzenleme önerdi, beğenmediyseniz geri alın. ;-)
PatrickT

1
@PatrickT güncellemeniz gerçekten kullanışlıdır. Gerçekten minnettarım :)
GegznaV

20

İle yrange alın

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

ve xrange ile

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

2
Bu çözümler sürekli sayısal eksenler için iyi çalışır, ancak tarihler (sürekli ölçek) veya kategorik değerler içeren eksenler nasıl ele alınabilir? Bu yöntemi kullandığımda, geom_text kullanarak metin eklemek için tarih biçimine bir miktar dönüştürme gerektiren büyük sayısal değerler alıyorum.
Joseph Kreke

Ya eksen sınırlarını ayarlamıyorsam, ancak varsayılan olarak ggplot'un önerdiği şeyi kullanıyorsam? Benim kullanım durumum, arsa 1 için varsayılan değerleri sevdiğim, ancak arsa 2'nin çizim 1 ile aynı eksen sınırlarına sahip olmasını istiyorum.
NewNameStat

16

Gelen sürümü 2.2.0 Bu şöyle yapılmalıdır:

# 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

Ağustos 2018 itibarıyla x ve y ekseni aralıklarını aşağıdakilerle çıkaracaksınız.

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


3

Burada belirtildiği gibi: https://gist.github.com/tomhopper/9076152#gistcomment-2624958 iki seçenek arasında bir fark vardır:

#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

Grafiklerin bir listesini almak, ortak y ekseni aralığını çıkarmak ve onu değiştirmek için bir dizi kolaylık işlevi. İhtiyacım vardı çünkü tek bir grafikte farklı veri kümeleri kullanarak düzenlenmiştim 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)
}

Bunun başkaları için de yararlı olabileceğini düşündüm.


Bir sorun var, belki birisi nasıl başa çıkılacağını biliyor: Rapor edilen aralıklar, listedeki grafiklerden tüm aralıkları içerecek kadar "yeterince büyük", ancak bunlar gerçek maksimumdan çok daha büyükler (örneğin, bir listede arsalar kullanarakstat_smooth( method = "lm")
Frederik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.