排除ggplot2

时间:2018-02-02 22:10:28

标签: r ggplot2

我正在绘制一个geom_path(),我希望它在图中有箭头,但在图例中没有箭头。谷歌搜索表明某种形式

guides(color=guide_legend(override.aes = list(..)) 

会得到答案,但我找不到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()

此输出 Plot with arrowheads

但我正在寻找的是没有箭头版本的传奇,如

ggplot(data, aes(x=x, y=y, color=color, group=color)) +
  geom_path(size=2) +
  theme_bw()

enter image description here

谢谢!

2 个答案:

答案 0 :(得分:6)

这样做的一个简单方法就是使用由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()

答案 1 :(得分:4)

理论上,这应该有效:

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))) 

但是,它没有。

另一种方法是给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()

enter image description here

请注意,这会为您的R会话的其余部分更改GeomPath。要恢复原始行为,您可以设置:

GeomPath$draw_key <- draw_key_path