我正在绘制一个geom_path()并且我希望它在图中有箭头,但在图例中没有箭头.谷歌搜索表明形式的东西
guides(color=guide_legend(override.aes = list(..))
Run Code Online (Sandbox Code Playgroud)
会有答案,但我找不到list()预期的文件.帮助文件guide_legend()说"查看示例"以了解更多信息,override.aes但只有一个示例显示如何在图例中设置alpha级别.
为了使我想做的具体,这里的代码产生带箭头的图,
data <- data.frame(x=c(1, 1, 1, 2),
y=c(1, 2, 1, 1),
color=c('color1', 'color1', 'color2', 'color2'))
library(ggplot2)
ggplot(data, aes(x=x, y=y, color=color, group=color)) +
geom_path(size=2,
arrow = arrow(angle = 30,
length = unit(0.1, "inches"),
ends = "last", type = "closed")) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)
但我正在寻找的是没有箭头版本的传奇,如
ggplot(data, aes(x=x, y=y, color=color, group=color)) +
geom_path(size=2) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)
谢谢!
一个稍微粗暴的方法就是使用由geom_line箭头而不是箭头创建的图例.在这里,我打电话geom_path与show.legend = FALSE隐藏箭头传奇.然后我使用geom_line,它只是在现有线的顶部绘制线条(因此情节不会改变),但给我们一个没有箭头的图例.
library(tidyverse)
data = tibble(x=c(1, 1, 1, 2),
y=c(1, 2, 1, 1),
color=c('color1', 'color1', 'color2', 'color2'))
ggplot(data, aes(x=x, y=y, color=color, group=color)) +
geom_path(
size=2,
arrow = arrow(
angle = 30,
length = unit(0.1, "inches"),
ends = "last", type = "closed"
),
show.legend = FALSE
) +
geom_line(size = 2) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)

从理论上讲,这应该起作用:
ggplot(data, aes(x=x, y=y, color=color, group=color)) +
geom_path(size=2,
arrow = arrow(angle = 30,
length = unit(0.1, "inches"),
ends = "last", type = "open")) +
theme_bw() +
guides(color=guide_legend(override.aes = list(arrow = NULL)))
Run Code Online (Sandbox Code Playgroud)
但是,事实并非如此。
替代方法是提供GeomPath一个新的图例绘制功能,该功能不会绘制箭头:
# legend drawing function that ignores arrow setting
# modified from ggplot2 function `draw_key_path`,
# available here: https://github.com/tidyverse/ggplot2/blob/884fdcbaefd60456978f19dd2727ab698a07df5e/R/legend-draw.r#L108
draw_key_line <- function(data, params, size) {
data$linetype[is.na(data$linetype)] <- 0
grid::segmentsGrob(0.1, 0.5, 0.9, 0.5,
gp = grid::gpar(
col = alpha(data$colour, data$alpha),
lwd = data$size * .pt,
lty = data$linetype,
lineend = "butt"
)
)
}
# override legend drawing function for GeomPath
GeomPath$draw_key <- draw_key_line
ggplot(data, aes(x=x, y=y, color=color, group=color)) +
geom_path(size=2,
arrow = arrow(angle = 30,
length = unit(0.1, "inches"),
ends = "last", type = "closed")) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)
请注意,这将GeomPath在您的R会话的其余时间发生变化。要恢复到原始行为,可以设置:
GeomPath$draw_key <- draw_key_path
Run Code Online (Sandbox Code Playgroud)