我想使用ggplot
的{{1}}选项来生成辅助X轴(称为Z),显示转换Z = X + sqrt(X ^ 2 - X)。这种变换通常不是单调的,但在我的应用中可能的X范围内是单调的(X> 1)。
我尝试了以下内容:
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 - .) ) )
这两个都表明它正试图计算X< 1,即使这对情节来说不是必需的。
如何绘制有效的单调变换?我需要一个相当通用的解决方案,因为这是一个函数,其中X的范围部分是用户指定的(但总是> 1 )。
答案 0 :(得分: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)
很好,但它会缩短绘图区域。
答案 1 :(得分: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 - .) )
)