我有一個geom_foo()將對輸入資料進行一些轉換并且我有一個比例轉換。geom_*我的問題是,就縮放而言,這些作業與我所期望的不一樣。
為了說明行為,請考慮foo()將在問題末尾定義的setup_data方法中使用哪個。GeomFoo
foo <- function(x, y) {
data.frame(
x = x 2,
y = y 2
)
}
foo(1, 1)
變壓器是:
foo_trans <- scales::trans_new(
name = "foo",
transform = function(x) x / 5,
inverse = function(x) x * 5
)
鑒于此輸入資料:
df1 <- data.frame(x = c(1, 2), y = c(1, 2))
這是一個基本的情節:
library(ggplot2)
ggplot(df1, aes(x = x, y = y))
geom_foo()

當我將轉換應用于垂直比例時,我得到了這個
ggplot(df1, aes(x = x, y = y))
geom_foo()
scale_y_continuous(trans = foo_trans)

我能說的是,y 軸限制是計算為11 = 1 (2*5)and 12 = 2 (2*5), where1和2are df1$y,并且(2 * 5)取自setup_datamethod 和 from trans_foo。
我真正的問題是,我想添加一個帶有標簽的文本層。這些標簽及其坐標來自另一個資料框,如下所示。
df_label <- foo(df1$x, df1$y)
df_label$label <- c("A", "B")
標簽和點圖層在相同的 xy 位置上,沒有比例變換
p <- ggplot(df1, aes(x = x, y = y))
geom_foo(color = "red", size = 6)
geom_text(data = df_label, aes(x, y, label = label))
p

但是當我應用轉換時,坐標不再匹配
p
scale_y_continuous(trans = foo_trans)

轉換后如何使 to 圖層在 xy 坐標中匹配?謝謝
ggproto目的:
GeomFoo <- ggproto("GeomFoo", GeomPoint,
setup_data = function(data, params) {
cols_to_keep <- setdiff(names(data), c("x", "y"))
cbind(
foo(data$x, data$y),
data[, cols_to_keep]
)
}
)
geom建構式:
geom_foo <- function(mapping = NULL, data = NULL, ...,
na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE) {
layer(
data = data,
mapping = mapping,
stat = "identity",
geom = GeomFoo,
position = "identity",
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(
na.rm = na.rm,
...
)
)
}
uj5u.com熱心網友回復:
進行資料轉換實際上并不是 geom 的任務,而是 stat 的任務。也就是說,更大的問題是在GeomFoo$setup_data()呼叫方法之前應用了比例轉換。我可以看到有兩種方法可以完成這項任務。
foo()在比例轉換之前應用。我認為 geoms 或 stats在比例轉換之前無法訪問資料。一個可能的地方是在ggplot2:::Layer$setup_layer()方法中。但是,這不會被匯出,這可能意味著開發人員甚至在我們嘗試之前就想阻止它。反轉比例變換,應用
foo(),然后再次變換。為此,您需要一種可以訪問秤的方法。AFAIK,沒有 geom 方法具有此訪問權限。但是Stat$compute_panel()確實有訪問權限,所以我們可以使用它。
舉一個(2)的例子,我認為你可以擺脫以下:
StatFoo <- ggproto(
"StatFoo", Stat,
compute_panel = function(self, data, scales) {
cols_to_keep <- setdiff(names(data), c("x", "y"))
food <- foo(scales$x$trans$inverse(data$x),
scales$y$trans$inverse(data$y))
cbind(
data.frame(x = scales$x$trans$transform(food$x),
y = scales$y$trans$transform(food$y)),
data[, cols_to_keep]
)
}
)
geom_foo <- function(mapping = NULL, data = NULL, ...,
na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE) {
layer(
data = data,
mapping = mapping,
stat = StatFoo,
geom = GeomPoint,
position = "identity",
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(
na.rm = na.rm,
...
)
)
}
如果其他人有更好的想法來做到這一點,我也想知道!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/453821.html
