是否可以将其他参数传递给scale包的trans_new?

时间:2016-11-16 11:13:46

标签: r ggplot2

我正在尝试为ggplot2创建一个变换,它可以缩放x轴以获得统一的视觉分布。

this教程之后,我做了以下的简单实现:

q_trans <- function() trans_new(
  "quantile",
  transform = function(x, a) {mean (x >= a)},
  inverse   = function(x, a) {sort(a)[x*length(a)]}
)

但是当我跑步时

ggplot(mpg, aes(displ, hwy)) + geom_smooth() + coord_trans(x = "q")

我得到了一些预期的错误

  

平均值误差(x> = a):参数“a”缺失,没有默认值

?trans_new下的documentation没有提供任何信息我是否以及如何将其他参数传递给转换函数。
coord_trans文档似乎也没有表明传递其他参数的可能性。

为了我的目的,甚至可以访问基础样本 在JavaScript或许多其他语言中进行映射时,如何传递元素来源的数组 在那里你可以简单地通过在变换函数中添加另一个参数来完成它,就像我上面那样。

修改

RomanLuštrik的建议让我意识到变换本身是矢量化的所以我需要在下面假设a是一个全局变量:

q_trans <- function() trans_new(
  "quantile",
  transform = function(x) {sapply(x, function(x_i){mean (x_i >= a)})},
  inverse   = function(x) {sapply(x, function(x_i){sort(a)[x_i*length(a)]})}
)
a <- mpg$displ

如果我运行a <- mpg$displ,那么对ggplot2的调用会起作用,但它不是很优雅。

1 个答案:

答案 0 :(得分:3)

您可以添加a作为函数的参数。

q_trans <- function(a = NULL) trans_new(
    "quantile",
    transform = function(x) {sapply(x, function(x_i){mean (x_i >= a)})},
    inverse   = function(x) {sapply(x, function(x_i){sort(a)[x_i*length(a)]})}
)

然后在q_trans中使用"q"代替coord_trans,传递您要用于a的任何向量。

ggplot(mpg, aes(displ, hwy)) + 
    geom_smooth() + 
    coord_trans(x = q_trans(a = mpg$displ))