我正在尝试为 ggplot2 创建一个转换,缩放 x 轴以获得均匀的视觉分布。
下列的this http://www.numbertheory.nl/2012/08/14/custom-axis-transformations-in-ggplot2/教程我做了以下简单的实现:
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 >= an):缺少参数“a”,没有默认值
The 文档 https://cran.r-project.org/web/packages/scales/scales.pdf under ?trans_new
没有提供任何信息是否以及如何将附加参数传递给转换函数。
The 坐标变换 http://docs.ggplot2.org/current/coord_trans.html文档似乎也没有表明传递附加参数的可能性。
就我的目的而言,能够访问底层样本就足够了。
映射时如何传递元素来自的数组JavaScript https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map或许多其他语言。
您只需在转换函数中添加另一个参数即可完成此操作,就像我上面所做的那样。
Edit
Roman Luš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 的调用可以工作,但不是很优雅。