为ggplot定义新的比例轴转换

12

我尝试使用 scales::trans_new 创建一个沿y轴的squared转换,但出现错误。

MWE

data = data.frame(x = 1:10, y = runif(10), z=rnorm(10, 10))

library(ggplot2)
ggplot(data, aes(x, y, size=z)) +
geom_point() +
scale_y_continuous(trans=scales::trans_new("sq", function(x) x^2, function(x) x^(1/2)))

出错了

如果(zero_range(as.numeric(limits)))返回错误:
在TRUE/FALSE的位置缺失值

我试着添加了limitsdomain但还是得到了同样的错误。

scale_y_continuous(trans=scales::trans_new("sq", function(x) x^2, function(x) x^(1/2)), limits=c(0,1))
scale_y_continuous(trans=scales::trans_new("sq", function(x) x^2, function(x) x^(1/2), domain=c(0,1)), limits=c(0,1))

似乎是倒数参数导致了错误 - 但所有的y值都是正数,所以我不理解。请问我应该怎么做?


为什么你不能只是创建一个新的变量来存储y的平方值并绘制它呢? - Mike
1
@Mike;因为这会处理轴缩放/标签 - 这应该是更少的工作 ;) - user2957945
3
最后一个解决方案,否则我就放弃了。scale_y_continuous(trans = scales::trans_new("sq",function(x){x^2}, function(x){sqrt(abs(x))})) 的翻译如下:缩放y轴连续变量,使用scales::trans_new("sq",function(x){x^2}, function(x){sqrt(abs(x))}) - Mike
1
谢谢@mike。确实加上abs起作用了。看起来Dave2e也得出了同样的结论,但我认为有一个稍微更安全的解决方法。再次感谢你的帮助。 - user2957945
1个回答

13

看起来ggplot在使用反函数来设置y轴的限制和轴标签。如果y接近于零,ggplot将填充下限并计算一个负值。这是美化限制的“负面”(双关语)副作用。

以下是解决方法,修改反函数以防止其接受小于零的值,这将避免出现负数的平方根错误。轴的下限始终大于或等于零。

library(ggplot2)

#square function
sq<-function(x){
  x^2
}
#inverse square function (square root)
isq<-function(x){
  print(paste("isq",x))  #debug statement
  x<-ifelse(x<0, 0, x)
  sqrt(x)
}

data =  data.frame(x = 1:10, y = runif(10), z=rnorm(10, 10))

print(data$y)
ggplot(data, aes(x, y, size=z)) +
  geom_point() +
  scale_y_continuous(trans=scales::trans_new("sq", sq, isq))
注意:将代码转移到生产环境时请删除打印函数。 请查看下面评论中的链接以获取在Github上的错误报告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接