每当将垂直/水平线添加到 ggplot 时,如何将标签添加到 x / y 轴?
How to add a label to the x / y axis whenever a vertical / horizontal line is added to a ggplot?
x 和 y 轴是根据 ggplot 设置的特定间隔标记的。
如果将水平线或垂直线添加到图中,目标是将 x 或 y 轴标记为线的精确值。
如何做到这一点?
这并不完全简单,但有可能。我可能会使用这两个小函数来自动化棘手的部分:
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)
geom_hline
的 y 截距可以用类似的方式获得,希望从 add_x_intercepts
的代码中可以看出这一点
x 和 y 轴是根据 ggplot 设置的特定间隔标记的。
如果将水平线或垂直线添加到图中,目标是将 x 或 y 轴标记为线的精确值。
如何做到这一点?
这并不完全简单,但有可能。我可能会使用这两个小函数来自动化棘手的部分:
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)
geom_hline
的 y 截距可以用类似的方式获得,希望从 add_x_intercepts