有誰知道里面的哪個引數geom_abline()負責不影響 x 和 y 尺度?
draw_panel()w/i函式GeomAbline獲取潛在的“范圍”,但該線通常應位于原始比例之外:
GeomAbline <- ggproto("GeomAbline", Geom,
draw_panel = function(data, panel_params, coord) {
ranges <- coord$backtransform_range(panel_params)
data$x <- ranges$x[1]
data$xend <- ranges$x[2]
data$y <- ranges$x[1] * data$slope data$intercept
data$yend <- ranges$x[2] * data$slope data$intercept
GeomSegment$draw_panel(unique(data), panel_params, coord)
},
default_aes = aes(colour = "black", size = 0.5, linetype = 1, alpha = NA),
required_aes = c("slope", "intercept"),
draw_key = draw_key_abline
)
我的猜測是引數/功能ggplot2::StatIdentity和ggplot2::PositionIdentity中集ggplot2:layer()的geom_abline()。但我不明白這是如何作業的?我的動機是寫一個新的geom_*,也不會影響 x 和 y 尺度。
uj5u.com熱心網友回復:
根據@teunbrand 的評論,解決方案如下:
在內部,ggplot2::scale_x_continuous()只有以下美學會影響 x 縮放:c("x", "xmin", "xmax", "xend", "xintercept", "xmin_final", "xmax_final", "xlower", "xmiddle", "xupper", "x0"). 但是,由于geom_abline()不包含任何這些美學,因此比例不受影響。
這同樣適用于 y 縮放。順便說一下,變數對應于ggplot2:::ggplot_global$x_aes和 中的字符ggplot2:::ggplot_global$y_aes,但由于我不知道的原因,這些變數沒有使用。
為了說明,我重寫了geom_point(),但具有美學意義c("x_new", "y")。
geom_my_point <- function(mapping = NULL, data = NULL, stat = "identity",
position = "identity", na.rm = FALSE,
show.legend = NA, inherit.aes = TRUE, ...) {
ggplot2::layer(
geom = GeomMyPoint, mapping = mapping,
data = data, stat = stat, position = position,
show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}
GeomMyPoint <- ggplot2::ggproto("GeomMyPoint", ggplot2::GeomPoint,
required_aes = c("x_new", "y"),
draw_panel = function(data, panel_scales, coord) {
if (is.character(data$shape)) {
data$shape <- translate_shape_string(data$shape)
}
## Transform the data first
coords <- coord$transform(data, panel_scales)
## Construct a grid grob
grid::pointsGrob(
x = coords$x_new,
y = coords$y,
pch = coords$shape,
gp = grid::gpar(
col = alpha(coords$colour, coords$alpha),
fill = alpha(coords$fill, coords$alpha),
fontsize = coords$size * ggplot2::.pt coords$stroke * ggplot2::.stroke / 2,
lwd = coords$stroke * ggplot2::.stroke / 2
)
)
}
)
geom_my_point()沒有x美學的輸出對應于圖形“gg2”;因此紅點不會影響 x 尺度:
d <- data.frame(x = runif(200))
d$y <- 1 * d$x rnorm(200, 0, 0.2)
d$x2 <- d$x * 2
require("ggplot2")
gg1 <- ggplot(d) geom_point(aes(x, y)) geom_point(aes(x = x2, y = y), col = 2) ggtitle("gg1")
gg2 <- ggplot(d) geom_point(aes(x, y)) geom_my_point(aes(x_new = x2, y = y), col = 2) ggtitle("gg2")

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/338264.html
上一篇:R按組顯示資料和趨勢線的圖例
