使用ggplot的sec.axis进行非单调变换

时间:2017-06-16 12:39:31

标签: r ggplot2

我想使用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 )。

2 个答案:

答案 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 - .) ) 
 )