x 和 y 軸根據 ggplot 設定的特定間隔進行標記。
如果將水平線或垂直線添加到繪圖中,目標是在該線的確切值處標記 x 或 y 軸。
如何才能做到這一點?
uj5u.com熱心網友回復:
這并不完全簡單,但它是可能的。我可能會使用這兩個小功能來自動化棘手的部分:
add_x_break <- function(plot, xval) {
p2 <- ggplot_build(plot)
breaks <- p2$layout$panel_params[[1]]$x$breaks
breaks <- breaks[!is.na(breaks)]
plot
geom_vline(xintercept = xval)
scale_x_continuous(breaks = sort(c(xval, breaks)))
}
add_y_break <- function(plot, yval) {
p2 <- ggplot_build(plot)
breaks <- p2$layout$panel_params[[1]]$y$breaks
breaks <- breaks[!is.na(breaks)]
plot
geom_hline(yintercept = yval)
scale_y_continuous(breaks = sort(c(yval, breaks)))
}
這些將像這樣作業。從一個基本情節開始:
library(ggplot2)
set.seed(1)
df <- data.frame(x = 1:10, y = runif(10))
p <- ggplot(df, aes(x, y))
geom_point()
ylim(0, 1)
p

添加一條垂直線add_x_break
p <- add_x_break(p, 6.34)
p

添加一條水平線add_y_break:
p <- add_y_break(p, 0.333)
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
p

附錄
如果由于某種原因您沒有生成繪圖的代碼,或者 vline 已經存在,您可以使用以下函式提取 xintercept 并將其添加到軸中斷:
add_x_intercepts <- function(p) {
p2 <- ggplot_build(p)
breaks <- p2$layout$panel_params[[1]]$x$breaks
breaks <- breaks[!is.na(breaks)]
vals <- unlist(lapply(seq_along(p$layers), function(x) {
d <- layer_data(p, x)
if('xintercept' %in% names(d)) d$xintercept else numeric()
}))
p scale_x_continuous(breaks = sort(c(vals, breaks)))
}
因此,例如:
set.seed(1)
df <- data.frame(x = 1:10, y = runif(10))
p <- ggplot(df, aes(x, y))
geom_point()
geom_vline(xintercept = 6.34)
ylim(0, 1)
p

然后我們可以這樣做:
add_x_intercepts(p)

的 y 截距geom_hline可以以類似的方式獲得,希望從代碼中可以明顯看出add_x_intercepts
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/437575.html
