2

geom_hline()我用和创建了一个散点图geom_vline(),该图很好,但图例条目不是我想让它们出现的方式。( vlineRestauration) 和hline(Threshold) 在传说中相互交叉,令人困惑。我希望恢复图例条目是橙色垂直线,阈值图例条目是水平黑线。

在此处输入图像描述

我尝试了其他帖子中建议的几件事,使用guide_legend(override.aes())或使用,show.legend = F但要么更改了上面“类型”部分的图例条目(它删除了线条并保留了彩色圆圈),要么只是删除了其中一条线的图例条目.

这是我当前的代码:

ggplot(data = tst_formule[tst_formule$River != "Roya",], aes(x=Year, y = BRI_adi_moy_transect, shape = River, col = Type)) +  
  geom_point(size = 3) +   
  geom_errorbar(aes(ymin = BRI_adi_moy_transect - SD_transect, ymax = BRI_adi_moy_transect + SD_transect), width = 0.4) + 
  scale_shape_manual(values = c(15, 16, 17)) +
  scale_colour_manual(values = c("chocolate1", "darkcyan")) +  
  geom_vline(aes(xintercept = Restauration_year, linetype = "Restoration"), colour = "chocolate1") + 
  geom_hline(aes(yintercept = 0.004, linetype = "Threshold"), colour= 'black') + 
  scale_linetype_manual(name = NULL, values = c(4, 5)) + 
  scale_y_continuous("BRI*", limits = c(min(tst_formule$BRI_adi_moy_transect - tst_formule$SD_transect),
                                        max(tst_formule$BRI_adi_moy_transect + tst_formule$SD_transect))) +
  scale_x_continuous(limits = c(min(tst_formule$Year - 1),max(tst_formule$Year + 1)), breaks = scales::breaks_pretty(n = 6)) + 
  theme_bw() + 
  facet_wrap(vars(River))

这是dput我的一个数据:

structure(list(River = c("Durance", "Durance", "Durance", "Durance", 
"Roya", "Var"), Reach = c("La Brillanne", "Les Mées", "La Brillanne", 
"Les Mées", "Basse vallée", "Basse vallée"), Type = c("restaured", 
"target", "restaured", "target", "witness", "restaured"), Year = c(2017, 
2017, 2012, 2012, 2018, 2011), Restauration_year = c(2013, 2013, 
2013, 2013, 2000, 2009), BRI_adi_moy_transect = c(0.0028, 0.0017, 
0.0033, 0.0018, 0.009, 0.0045), SD_transect = c(0.00128472161839638, 
0.000477209421076879, 0.00204050725984513, 0.000472466654940182, 
0.00780731734792112, 0.00310039904793707)), row.names = c(NA, 
6L), class = "data.frame")

知道如何让它做我想做的事吗?

4

3 回答 3

4

创建两个线型比例。我已将 vline/hline 调用置于底部以获得更好的可见性。

library(tidyverse)
library(ggnewscale)

ggplot(data = tst_formule[tst_formule$River != "Roya",], aes(x=Year, y = BRI_adi_moy_transect, shape = River, col = Type)) +  
  geom_point(size = 3) +   
  geom_errorbar(aes(ymin = BRI_adi_moy_transect - SD_transect, ymax = BRI_adi_moy_transect + SD_transect), width = 0.4) + 
  scale_shape_manual(values = c(15, 16, 17)) +
  scale_colour_manual(values = c("chocolate1", "darkcyan")) +  
  scale_y_continuous("BRI*", limits = c(min(tst_formule$BRI_adi_moy_transect - tst_formule$SD_transect),
                                        max(tst_formule$BRI_adi_moy_transect + tst_formule$SD_transect))) +
  scale_x_continuous(limits = c(min(tst_formule$Year - 1),max(tst_formule$Year + 1)), breaks = scales::breaks_pretty(n = 6)) + 
  theme_bw() + 
  facet_wrap(vars(River)) +
# here starts the trick 
  geom_vline(aes(xintercept = Restauration_year, linetype = "Restauration"), colour = "chocolate1") + 
  scale_linetype_manual(name = NULL, values = 4) +
# ggnewscale is an amazing package
  new_scale("linetype") +
# now do the same for geom_hline
  geom_hline(aes(yintercept = 0.004, linetype = "Threshold"), colour= 'black') + 
  scale_linetype_manual(name = NULL, values = 5) 
  

于 2021-01-19T21:25:36.657 回答
2

这是此问题中记录的一个已知问题https://github.com/tidyverse/ggplot2/issues/2483

那里没有提供答案,除了自定义绘制的图例键我认为这是不可能的

于 2021-01-19T19:54:00.633 回答
2

我找到了一个令人难以置信的不可概括的解决方法,但我想我还是会分享。解决方法是编写键字形函数,根据线型有条件地输出键。这一切都有点硬编码,所以我不知道如何概括这一点。下面是两个函数:

glyph_vline <- function(data, params, size) {
  if (data$linetype == 4) {
    draw_key_vline(data, params, size)
  } else {
    zeroGrob()
  }
}

glyph_hline <- function(data, params, size) {
  if (data$linetype == 5) {
    draw_key_path(data, params, size)
  } else {
    zeroGrob()
  }
}

您需要将这些输入到key_glyphvline/hline 层的参数中。像这样:

ggplot(data = tst_formule[tst_formule$River != "Roya",], aes(x=Year, y = BRI_adi_moy_transect, shape = River, col = Type)) +  
  geom_point(size = 3) +   
  geom_errorbar(aes(ymin = BRI_adi_moy_transect - SD_transect, ymax = BRI_adi_moy_transect + SD_transect), width = 0.4) + 
  scale_shape_manual(values = c(15, 16, 17)) +
  scale_colour_manual(values = c("chocolate1", "darkcyan")) +  
  geom_vline(aes(xintercept = Restauration_year, linetype = "Restoration"), 
             colour = "chocolate1", key_glyph = glyph_vline) + 
  geom_hline(aes(yintercept = 0.004, linetype = "Threshold"), 
             colour= 'black', key_glyph = glyph_hline) + 
  scale_linetype_manual(name = NULL, values = c(4, 5)) + 
  scale_y_continuous("BRI*", limits = c(min(tst_formule$BRI_adi_moy_transect - tst_formule$SD_transect),
                                        max(tst_formule$BRI_adi_moy_transect + tst_formule$SD_transect))) +
  scale_x_continuous(limits = c(min(tst_formule$Year - 1),max(tst_formule$Year + 1)), breaks = scales::breaks_pretty(n = 6)) + 
  theme_bw() + 
  facet_wrap(vars(River))
于 2021-01-19T20:36:17.893 回答