ggplot中fill和scale_fill_discrete/plot legend之间的冲突

5

我正在调整 geom_point 尝试绘制以下代码。我将 cars$vs 转换为一个具有离散级别的因子,以便可以通过将其分配给 ggplot aes 设置中的 "fill" 来使用不同颜色可视化该变量的两个级别。

cars <- mtcars
cars$vs <- as.factor(cars$vs)

ggplot(cars,aes(x = mpg, y = disp, fill = vs)) +
  geom_point(size = 4) +
  scale_fill_discrete(name = "Test")

结果如下:

如您所见,图表并没有通过颜色区分“fill”条件。然而,它保留了我在scale_fill_discrete中指定的图例标签。

或者,我可以绘制以下内容(相同的代码,但是使用“color”代替“fill”)

cars <- mtcars
cars$vs <- as.factor(cars$vs)

ggplot(cars,aes(x = mpg, y = disp, color = vs)) +
  geom_point(size = 4) +
  scale_fill_discrete(name = "Test")

在此输入图片描述

从上图中可以看出,使用 "color" 而不是 "fill" 来区分因子的级别,但似乎会覆盖使用 scale_fill_discrete 更改图例标题的任何更改。

我是否错误地使用了 "fill"?如何使用此方法将因子的不同级别绘制为不同颜色,并通过 scale_fill_discrete 控制图例?

2个回答

6

由于您使用color作为映射,因此可以使用scale_color_*来更改相应的属性,而不是使用scale_fill_*

ggplot(cars,aes(x = mpg, y = disp, color = vs)) +
      geom_point(size = 4) +
      scale_color_discrete(name = "Test") 

enter image description here


完全可以!我感到困惑是因为在之前的代码中使用“fill”(而不是“color”)已经起作用了。您能否澄清一下,在这种情况下填充为什么不起作用?有没有办法可以解决? - pablom
1
是的,要使用的函数对应于您正在使用的映射,即“color,fill,group”。如果您正在使用“color”,请使用“scale_color_*”,如果您正在使用“fill”,请使用“scale_fill_*”等。 - Psidom
这是有道理的,但是当使用fillscale_fill_discrete时,它不起作用。然而,使用colorscale_color_discrete却可以。为什么第一种方法不起作用,而第二种方法却可以? - pablom
1
如@Gregor的回答所述,fill是用来填充几何对象内部颜色的,而默认形状为0维的点没有内部可供填充。另一方面,color用于定义对象边界的颜色,而点本身就是其边界,因此可以使用。 - Psidom

4
要使用fillgeom_point,您需要使用可填充的形状:
ggplot(cars,aes(x = mpg, y = disp, fill = vs)) +
  geom_point(size = 4, shape = 21) +
  scale_fill_discrete(name = "Test")

请见?pch,它显示形状21到25可以使用不同的颜色进行填充和着色。除非可填充的形状是一种,否则ggplot将不使用fill。这种行为在不同版本中有所改变,详见新闻文件
除非您想要点的轮廓线和填充颜色不同,否则没有理由使用geom_pointfill,因此其他建议使用color的答案可能更适合您。

有趣!我以前从未处理过 shape 参数。然而,这种方法会导致带有黑色轮廓的圆形。我该如何去掉黑色轮廓? - pablom
啊,看起来 color = na 就可以了。 - pablom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接