首页 > 解决方案 > 当需要“大小”美学和 geom_smooth 时更改图例外观

问题描述

我有一个带有连续 x 和 y 变量的图,第三个连续变量映射到“大小”美学,第四个离散变量映射到“形状”美学。如果我只指定,“大小”比例的图例会显示不同大小的项目符号,geom_point()这很好,但如果我还指定geom_smooth图例会在项目符号上显示一条线,这不是我想要的。有没有办法在指定时只保留图例中的项目符号geom_smooth()

我试着用

guides(size=guide_legend(override.aes=list(shape="circle")))

但这没有用

这是一个MRE:

df <- tibble(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(c("A", "B"), 50))
ggplot(df, aes(x=a, y=b, shape=d, size=c)) + 
  geom_point()

上面的代码为“大小”生成了想要的图例。

我想要的是按组添加平滑线,具有不同的线型:

ggplot(df, aes(x=a, y=b, shape=d, size=c)) + 
  geom_point() + 
  geom_smooth(method="lm", aes(linetype=d), color="black")

大小图例现在有与项目符号重叠的线条。

当我添加geom_smooth().

标签: rggplot2

解决方案


要将图例(在本例中为线型与大小)分开,您可以为它们指定不同的标题。这可能与在一个空格上添加一个空格一样微小的差异,例如"d"and "d ",尽管这可能不是最好的主意。

我给线型赋予了自己的标题,所以它有自己的独立图例。我还aes通过给它一个线型NANULL也应该工作)从尺寸图例中删除了线型。

library(ggplot2)

set.seed(515)
df <- tibble::tibble(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(c("A", "B"), 50))
ggplot(df, aes(x=a, y=b, shape=d, size=c)) + 
  geom_point() + 
  geom_smooth(method="lm", aes(linetype=d), color="black") +
  guides(linetype = guide_legend(title = "d - line"),
         size = guide_legend(title = "c", override.aes = list(linetype = NA)))


推荐阅读