为ggplot定义新的刻度轴转换

时间:2018-10-29 19:56:13

标签: r ggplot2

我正在尝试使用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的值

我尝试添加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))

似乎是导致错误的inverse参数-但是y的所有值都是正值,所以我不明白。我该怎么办?

1 个答案:

答案 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上的错误报告。