添加图例条目使所有其他图例条目成为对角线和矩形

Adding legend entry makes all other legend entries diagonal and rectangles

我尝试了所有我能找到的方法,但无济于事。

我已经使用内置数据集 mtcars 复制了我的问题。 我正在使用 R 中的 ggplot2 制作具有气泡图特征的散点图。 我的代码中有一些不适用于此数据集的东西是对数刻度和强制点的颜色,但除非这些顺序是一个因素,否则我认为我可以稍后处理。

发生了什么:

我必须有一个 1:1 行,我使用 geom_abline 因为它似乎最有意义。我使用从其他问题中找到的方法将图例添加到图中,但是当发生这种情况时,所有其他图例条目都会改变形状和方向。

理想情况下,我想解决这个问题,并尽可能使虚线以水平方式显示。

p <- ggplot(mtcars, aes(drat,wt, size=hp, colour=cyl)) +geom_point()+
   scale_size_area(max_size=5)+
   labs(x="drat", y="wt")
    p+ theme(panel.background = element_rect(fill = "white", colour = "black"), 
         panel.grid.major = element_line(colour= "grey75"), 
         axis.text.x = element_text(colour = "black"),
         axis.text.y = element_text(colour = "black"))+
   guides(colour = guide_legend(override.aes = list(size=6)))+
   geom_abline(aes(intercept = 0, slope = 1, linetype = "dashed"),show_guide = TRUE)+
   scale_linetype_manual("1:1 line", values = 2)

更新:要解决对角矩形而不是圆点的问题,请参阅下面的 Didzis Elferts 解决方案。 仍在寻找使图例线水平而不是像现在这样在对角线上的方法。 添加了 Didzis Elferts 修复程序的代码如下

p <- ggplot(mtcars, aes(drat,wt, size=hp, colour=cyl)) +geom_point()+
   scale_size_area(max_size=5)+
   labs(x="drat", y="wt")
    p+ theme(panel.background = element_rect(fill = "white", colour = "black"), 
         panel.grid.major = element_line(colour= "grey75"), 
         axis.text.x = element_text(colour = "black"),
         axis.text.y = element_text(colour = "black"))+
   guides(colour = guide_legend(override.aes = list(size=6, 
    linetype=0)),size = guide_legend(override.aes=list(linetype=0)))+
geom_abline(aes(intercept = 0, slope = 1, linetype = "dashed"),
    show_guide = TRUE)+scale_linetype_manual("1:1 line", values = 2)

从颜色和尺寸图例中删除线条的一种方法是在 override.aes= 内设置 linetype=0 用于 colour=size=

 + guides(colour = guide_legend(override.aes = list(size=6,linetype=0)),
        size = guide_legend(override.aes=list(linetype=0)))

在图例中获得水平线的一种蛮力方法是通过 geom_hline 向绘图添加水平线,并将图例基于该层而不是 geom_abline

当然,因为您实际上不希望在绘图中出现水平线,所以您必须以某种方式隐藏它。我想出了两种骇人听闻的方法来做到这一点。您可以将线放在 y 变量限制之外并设置 ylim 或者您可以尝试使线混合到面板背景颜色中。网格线可能会阻止第二个选项的合理性。

选项 1,将 geom_hline 置于地块限制之外:

ggplot(mtcars, aes(drat,wt, size=hp, colour=cyl)) +
    geom_point()+
    scale_size_area(max_size=5)+
    labs(x="drat", y="wt") + 
    theme(panel.background = element_rect(fill = "white", colour = "black"), 
        panel.grid.major = element_line(colour= "grey75"), 
        axis.text.x = element_text(colour = "black"),
        axis.text.y = element_text(colour = "black")) +
    geom_abline(aes(intercept = 0, slope = 1), linetype = "dashed") +
    geom_hline(aes(yintercept = 0, linetype = "dashed"), show_guide = TRUE) +
    ylim(1.5, NA) +
    guides(colour = guide_legend(override.aes = list(size=6, linetype = 0)),
          size = guide_legend(override.aes = list(linetype = 0))) +
    scale_linetype_manual("1:1 line", values = 2)

方案二,将geom_hline放在其他图层后面,使其变白,图例中使用override.aes使其变黑:

ggplot(mtcars, aes(drat,wt, size=hp, colour=cyl)) +
    geom_hline(aes(yintercept = 3.2, linetype = "dashed"), show_guide = TRUE, color = "white") +
    geom_point()+
    scale_size_area(max_size=5)+
    labs(x="drat", y="wt") + 
    theme(panel.background = element_rect(fill = "white", colour = "black"), 
         panel.grid.major = element_line(colour= "grey75"), 
         axis.text.x = element_text(colour = "black"),
         axis.text.y = element_text(colour = "black")) +
    geom_abline(aes(intercept = 0, slope = 1), linetype = "dashed") +
    guides(colour = guide_legend(override.aes = list(size=6, linetype = 0)),
          size = guide_legend(override.aes = list(linetype = 0)),
          linetype = guide_legend(override.aes = list(colour = "black"))) +
    scale_linetype_manual("1:1 line", values = 2)