我正在尝试使用squared
为y轴创建scales::trans_new
转换,但是遇到错误。
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)))
给出错误
if(zero_range(as.numeric(limits))){:
缺少需要TRUE / FALSE的值
我尝试添加limits
和domain
,但遇到相同的错误。
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))
似乎是导致错误的inverse
参数-但是y
的所有值都是正值,所以我不明白。我该怎么办?
答案 0 :(得分:8)
似乎ggplot正在使用反函数来设置y轴限制和轴标签。如果y接近零,则gglot将填充下限并正在计算负值。这是美化限制的“负面”副作用。
这是一种变通方法,通过修改反函数使用小于零的值,可以防止负数的平方根。
现在,轴的下限始终大于或等于零。
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上的错误报告。