5

以下代码会在图例中导致不需要的交叉效果。

ggplot() + 
  geom_vline(aes(xintercept=1,colour="vertical"), show.legend = NA) +
  geom_hline(aes(yintercept=1,colour="horizontal"), show.legend = NA)

在此处输入图像描述

我读了几篇文章说添加show.legend = NA可以使这种效果消失,但这在我的情况下不起作用。

编辑: 为避免混淆,我不希望传说消失!我只是想让传说中的“十字架”消失,所以它应该显示如下项目:

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

3

我同意修复传说可能会很棘手。对于此示例,只需将show.legend = FALSE您不想要的 ONE 线放入即可。

library(ggplot2)

ggplot() + 
  geom_vline(aes(xintercept=1,colour="vertical"), show.legend = F) +
  geom_hline(aes(yintercept=1,colour="horizontal"))

好的,这是尝试 2。它非常难看;它将两个传说塞进一个情节。它看起来非常接近你想要的。

library(ggplot2)

p1 <- ggplot() + 
  geom_vline(aes(xintercept=1,colour="vertical"))+
  scale_color_manual(values = "#619CFF")

p2 <- ggplot()+
  geom_hline(aes(yintercept=1,colour="horizontal"))

l1 <- cowplot::get_legend(p1)
l2 <- cowplot::get_legend(p2)

p3 <- ggplot() + 
  geom_vline(aes(xintercept=1,colour="vertical")) +
  geom_hline(aes(yintercept=1,colour="horizontal"))+
  theme(legend.position = "none")

l3 <- cowplot::plot_grid(l1, l2, ncol = 1, align = "v")
cowplot::plot_grid(p3, l3, nrow = 1, align = "h", rel_widths = c(1, 0.2))

于 2019-06-12T13:58:55.120 回答
2

如果您愿意深入了解底层网格(这总是很有趣),您可以手动删除指南中的垂直/水平条。

library(ggplot2)
library(grid)
library(gtable)

p <- ggplot() + 
   geom_vline(aes(xintercept = 1, color = "vertical")) + 
   geom_hline(aes(yintercept = 1, color = "horizontal"))

## First we create a gr(aphical)ob(ject) from the ggplot
g <- ggplotGrob(p)

## then we have to find out which child grob represents the legend
## the grob with the name "guide-box" is the one we are looking for
guide <- which(g$layout$name == "guide-box")

## the legend consists of guides and the background, go for the guides
guide_lines <- which(g$grobs[[guide]]$layout$name == "guides")

## the guides contain a lot of different grobs
## if you look at g$grobs[[guide]]$grobs[[guide_lines]] you will see
## 4 segments representing the 4 lines, these are at position 4-5 and 7-8
## segments at 4 and 7 are the vertical lines and 5 and 8 the horizontal lines
## NOTE: this you have to find out "manually", if you change the order in your
##       ggplot the positions will be exactly switched
##       one could write e function which checks whether a line is horizontal
##       or vertical but this is most likely an overkill if this is for a 
##       single plot

## we can use gtable_filter to remove the unwanted lines
## it requires a regular expression formed by the names of the grobs to filter out
remove_pattern <- paste(g$grobs[[guide]]$grobs[[guide_lines]]$layout$name[c(4, 8)],
    collapse = "|")

## write back the filtered gtable
g$grobs[[guide]]$grobs[[guide_lines]] <- 
   gtable_filter(g$grobs[[guide]]$grobs[[guide_lines]],
                 remove_pattern, 
                 invert = TRUE)

## draw the grid
grid.draw(g)

已移除交叉线

于 2019-06-12T15:01:31.917 回答
1

https://github.com/tidyverse/ggplot2/issues/1267似乎有一个已知错误geom_vline

以那个 URL 上的代码为灵感,我想出了一些使用geom_linerange

thresholds <- data.frame(colour = "vertical", x = 1, ymin = 0.950, ymax = 1.050) 
ggplot() + 
  geom_hline(aes(yintercept = 1, colour = "horizontal"), show.legend = NA) +
  geom_linerange(data = thresholds, 
                 mapping = aes(x = x, ymin = ymin, ymax = ymax, linetype = colour)) +
  theme(legend.title = element_blank())

产生以下情节

在此处输入图像描述

于 2019-06-12T13:01:35.753 回答