填充和空心形状,其中填充颜色=线条颜色

17

我希望在一个点图中传达三种类型的信息。我可以使用颜色、形状和填充(我的实际数据有太多的点,无法有效使用大小)。但如果填充颜色与轮廓颜色相同,它会看起来最好。

我能得到的最接近的效果是这样的:

data(mtcars)
p <- ggplot(mtcars,aes(x=mpg,y=wt))+
  geom_point(aes(color=factor(cyl),shape=factor(gear),fill=factor(vs)))+
  scale_fill_manual(values=c("black",NA))+scale_shape_manual(values=c(21,22,23))

enter image description here

如何填充红点为红色,蓝点为蓝色?当前代码会将所有轮廓颜色都填充成黑色,很难看。有什么好的想法吗?

1个回答

20

介绍NA,并使用scale_fill_discrete将它们映射到NA颜色:

ggplot(mtcars,aes(x=mpg,y=wt)) +
  geom_point(size=10,
    aes(
      color=factor(cyl), 
      shape=factor(gear), 
      fill=factor(ifelse(vs, NA, cyl))            # <---- NOTE THIS
  ) ) +
  scale_shape_manual(values=c(21,22,23)) +
  scale_fill_discrete(na.value=NA, guide="none")  # <---- NOTE THIS

输出:

enter image description here


编辑:为了解决Mr Flick的问题,我们可以作弊添加图层/透明度。请注意,我们需要添加一个图层,因为据我所知,没有办法独立控制颜色和填充的透明度:

library(ggplot2)
ggplot(mtcars,aes(x=mpg,y=wt, color=factor(cyl), shape=factor(gear))) +
  geom_point(size=10, aes(fill=factor(cyl), alpha=as.character(vs))) +
  geom_point(size=10) +      
  scale_shape_manual(values=c(21,22,23)) +
  scale_alpha_manual(values=c("1"=0, "0"=1))

这里输入图片描述


1
聪明。但是为vs值添加一个说明图例,指示哪些是填充的,哪些是空的并不容易,是吗?现在,填充和空的之间的区别还不清楚。 - MrFlick
1
另一个聪明的解决方案/变通方法。我很遗憾只能给一次赞。 - MrFlick
这两个解决方案都非常聪明。谢谢!我必须承认,很难理解它们是如何工作的。在第二个解决方案中,为什么美学要在ggplot调用和geom_point()调用之间分开?为什么没有第二个geom_point(size=10)时,开放形状会消失? - PeterK
1
我的错,我回答了自己的问题。ggplot的主要调用给出了除“填充”之外的所有美学元素。第一层由geom_point创建,制作填充点,但是使用alpha = 0将绘制不可见的空心点。第二层由第二个geom_point调用创建,仅绘制空心形状,包括重新轮廓填充形状。更酷的是,图层按顺序添加,因此如果两个geom_point()调用被颠倒,则实心覆盖空心形状。 - PeterK
2
@PeterK,没错。第一个能够工作是因为我们将每个vs==1点的填充值设置为NA。这会导致一种深灰色,但如果我们手动指定NA颜色应该是NA而不是默认值,那么“颜色”就变成了透明的(这就是NA的解释方式)。 - BrodieG
谢谢!只是想分享一下,除了默认的19(实心圆盘)之外,选择shape = 21也是必要的,因为shape = 19不支持fill选项。 - ya wei

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