我正在尝试为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的调用会起作用,但它不是很优雅。
答案 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))