2017-06-16 36 views
3

我希望使用ggplotsec.axis選項來生成顯示轉換的第二個X軸(稱爲Z)Z = X + sqrt(X^2 - X )。這種轉換通常不是單調的,但在我的應用程序中可能存在的X範圍內單調(X> 1)。使用ggplot的sec.axis進行非單調轉換

我試過如下:

x1 = seq(1, 3.5, .1) 
y = rnorm(n = length(x1)) 

d = data.frame(x1, y) 

library(ggplot2) 
ggplot(d, aes(x=x1, y=y)) + geom_point() + 
    scale_x_continuous(sec.axis = sec_axis(~ . + sqrt(.^2 - .))) 

結果不但與錯誤和警告:

Error in f(..., self = self) : 
    transformation for secondary axes must be monotonous 
In addition: Warning message: 
In sqrt(.^2 - .) : NaNs produced 

這兩表明,它正試圖以計算值的轉變與X < 1即使這對情節不是必要的。

如何繪製我的有效單調變換?我需要一個合理的通用解決方案,因爲這是一個函數,X的範圍部分是用戶指定的(但總是> 1)。

回答

3

嗯,你可以欺騙ggplot相信它的單調:

f <- Vectorize(function(x) { 
    if (x < 1) return(x/1e10) 
    x + sqrt(x^2 - x) 
}) 

ggplot(d, aes(x=x1, y=y)) + geom_point() + 
scale_x_continuous(sec.axis = sec_axis(~f(.))) 

使用expand = c(0, 0)是好的,但它削減繪圖區域。

2

此問題是由第一個x值之前的空格造成的。您可以使用expand參數將其刪除。

ggplot(d, aes(x=x1, y=y)) + 
geom_point() + 
scale_x_continuous(
    expand = c(0, 0), 
    sec.axis = sec_axis(~ . + sqrt(.^2 - .)) 
)