2011-10-09 109 views
56

我有一個對象ggplot2,比如myPlot,我如何確定x軸和y軸的範圍?如何提取ggplot2對象的繪圖軸範圍?

它似乎不是數據值範圍的簡單倍數,因爲可以重新繪製圖,修改座標軸的範圍等等。 findFn(來自sos)和谷歌似乎沒有提出相關結果,除了如何設置軸的範圍。

+1

我相當肯定,不能直接從劇情對象本身提取,但你可以推斷它(在簡單的情況下)從你的數據和'expand'的默認值。見[這裏](http://stackoverflow.com/questions/7611691/relative-positioning-of-geom-text-in-ggplot2/7617377#7617377)。 – joran

+0

@joran謝謝 - 看起來很有趣。你的意思是'expand_range'?我無法按照鏈接中的建議「擴展」。 – Iterator

+1

我指的是'ggplot'中'scale_ *'函數的'expand'參數。例如,請參閱[此處](http://had.co.nz/ggplot2/scale_continuous.html)中列出的默認值。 – joran

回答

28

在較新版本的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 
+0

看起來不錯,謝謝! – Iterator

+0

我通過調用ggplot對象上的str函數來獲取此信息。當你需要找到一個R對象的結構時,這是一個真正乾淨的函數。 –

+0

同意。這可能是我最喜歡的命令。 :) – Iterator

18

獲取yrange與

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

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

這些解決方案適用於連續的數字軸,但是如何處理具有日期(連續比例)或分類值的軸?當我使用這種方法時,我會得到大數字值,需要一些轉換爲日期格式才能使用geom_text添加文本。 –

16

我的x範圍我正在使用ggplot2版本2,我不確定這是否與以前版本相同, 假設您已將您的繪圖保存在plt對象上。這是很容易提取範圍,

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

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

版本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 
6

UPDATE

我目前使用ggplot2版本2.2.1.9000(開發版)以及如何提取繪製的x軸和y軸值範圍的方式已更改一次更多:

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 

OLDER ANSWER

我目前使用ggplot2版本2.1.0.9001,我注意到,該範圍可以使用稍微不同的片碼R提取:

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

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

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