如何在ggplot2中将geom_vline()和geom_hline()图例与其他图例分开

jen*_*tjr 9 plot r ggplot2

我正在尝试在R中创建一个ggplot2用于显示地下水保护标准的水平线以及显示建筑项目开始的垂直线的图.我已经为测量单位创建了图例,以及样本是否低于检测限.所有这些传说都出现在我想要的地方,但来自水平和垂直线的传说都覆盖在其他传说上.我尝试了多种使用方法show_guide,使用不同的数据帧来获取数据,override.aes = list()但似乎没有任何方法可以获得理想的结果.

这是数据的样子:

head(dmr_data)
    location_id sample_date analysis_result lt_measure default_unit           param_name
154        MWH1  2004-06-02          0.0150                    mg/L   Arsenic, dissolved
155        MWH1  2004-06-02          0.0850                    mg/L    Barium, dissolved
156        MWH1  2004-06-02          0.0002          <         mg/L Beryllium, dissolved
158        MWH1  2004-06-02          0.0005          <         mg/L   Cadmium, dissolved
162        MWH1  2004-06-02          0.0020          <         mg/L      Lead, dissolved
164        MWH1  2004-06-02          0.0010          <         mg/L  Thallium, dissolved
    DMR_limit  GWPS non_detect
154   0.01000 0.010          0
155   0.17340 2.000          0
156   0.00005 0.004          1
158   0.00100 0.005          1
162   0.00500 0.015          1
164   0.00060 0.002          1
Run Code Online (Sandbox Code Playgroud)

以下是情节的代码:

 combo_plot <- function(df){ 

  limits = df

  shaded_dates <- data.frame(xmin = c(as.POSIXct("2004-06-01", format = "%Y-%m-%d"), 
                                  as.POSIXct("2013-10-01", format = "%Y-%m-%d")), 
                         xmax = c(as.POSIXct("2013-10-01", format="%Y-%m-%d"), 
                                  max(df$sample_date)),
                         ymin = c(-Inf, -Inf), 
                         ymax = c(Inf, Inf),
                         years = c("background", "compliance"))

  ggplot(data = df, aes(x = sample_date, y = analysis_result)) + 
    geom_point(data = df, aes(colour = default_unit, shape = factor(non_detect)), size = 4) + 
    geom_line(data = df, aes(colour = default_unit), size = 1) +
    facet_wrap(~ param_name, scale="free") + 

# Plot legends, labels, and titles
ggtitle(paste("Time Series Plots for Monitoring Well", 
              df$location_id[1], "\n", sep=" ")) + 
ylab("Analysis Result") +
xlab("Sample Date") + scale_x_datetime(labels = date_format("%Y")) +
theme(axis.text.x = element_text(angle = 90)) +
theme(plot.margin = unit(c(0.75, 0.75, 0.75, 0.75), "in")) + 
theme_bw() + 
scale_colour_discrete(name = "Units", guide = "legend") + 

# add rectangles for date ranges
geom_rect(data = shaded_dates, aes(xmin = xmin, ymin = ymin, xmax = xmax, 
                                   ymax = ymax, fill = years),
          alpha = 0.2, inherit.aes = FALSE) +
scale_fill_manual(values=c("blue","green")) +

# add horizontal lines for EPA MCL and Upper Prediction Limit
geom_hline(data = limits, aes(yintercept = GWPS, linetype = "GWPS"), show_guide = TRUE, size = 0.75) +
geom_hline(data = limits, aes(yintercept = DMR_limit, linetype = "DMR Limit"), show_guide = TRUE, size = 0.75) +

# create custom legend using guide
theme(axis.title.x = element_text(size = 15, vjust=-.2)) +
theme(axis.title.y = element_text(size = 15, vjust=0.3)) +
guides(colour = guide_legend("Units"), fill = guide_legend("Dates"),
       linetype = guide_legend("Limits")) +
scale_shape_manual(name = "Measure", labels = c("Non-Detect", "Detected"),
                   values = c("1" = 21, "0" = 4)) + 

# add vertical line to show start of "East Pushout" construction
geom_vline(xintercept = as.numeric(as.POSIXct("2008-08-01", format="%Y-%m-%d")),
           linetype="dotted", show_guide = T)

}
Run Code Online (Sandbox Code Playgroud)

然后我用plyr它为所有井创建刻面图

d_ply(dmr_data, .(location_id), .progress = "text", failwith(NA, combo_plot), .print = TRUE)
Run Code Online (Sandbox Code Playgroud)

这就是输出的样子. 在此输入图像描述 任何帮助,将不胜感激!

Nat*_*ope 5

您可以通过使用override.aes = list(linetype = 0)in guides(),并为线型添加新的比例来获得所需的效果(以使垂直构造线不显示在图例中)。

将您的hline()部分替换为:

## add horizontal lines for EPA MCL and Upper Prediction Limit
geom_hline(data = limits, aes(yintercept = GWPS, linetype = "GWPS"), colour = "black", size = 0.75, show_guide = T) +
geom_hline(data = limits, aes(yintercept = DMR_limit, linetype = "DMR Limit"), size = 0.75, show_guide = T) +
scale_linetype_manual(name = "Limits", labels = c("GWPS", "DMR Limit"), values = c("GWPS" = 1, "DMR Limit" = 2)) +
Run Code Online (Sandbox Code Playgroud)

将您的guides()行替换为:

guides(colour = guide_legend(override.aes = list(linetype = 0 )), 
       fill = guide_legend(override.aes = list(linetype = 0 )), 
       shape = guide_legend(override.aes = list(linetype = 0 )), 
       linetype = guide_legend()) +
Run Code Online (Sandbox Code Playgroud)

如果你想要的垂直虚线在图例显示,添加适当的参数geom_vline(aes())scale_linetype_manual()

  • @theforestecologist 而不是允许图例使用从变量到线型的映射——例如,`aes(linetype = variable)` 将默认暗示每个“变量”级别具有不同线型的图例——你可以使用`guide_legend(override.aes=list(linetype=0))`覆盖图例中的映射。这只是告诉图例忽略来自`aes()`的线型映射并使用`linetype=0` (2认同)
  • ...我应该提到,`linetype=0` 意味着没有线。在“guides()”中,应用于不同的比例,例如“颜色”、“填充”等,这将从这些比例的图例中删除线条。 (2认同)