64

我想使用 ggplot2 在基于数据填充的散点图上的点周围放置一个黑色边框。另外,我想避免为黑色边框添加图例条目,因为它将在每个点上。基本上我正在寻找这个情节,但每个点周围都有黑色边框。

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y))+geom_point(aes(colour=id), size=12)

我想要的情节,除了点周围没有边框

作为奖励,我不想为黑色边框添加图例条目。我最好的尝试是:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y))+geom_point(aes(fill=id, colour="black"), size=12)

这使:

根本不是我想要的情节

我不明白为什么这不能给我想要的东西,更糟糕的是(对于我在 ggplot2 中的教育)我不明白为什么它似乎没有将填充颜色映射到任何东西!有什么帮助吗?

也许如果我能正确地获得轮廓和填充映射,我可以使用像这里最后一组数字中的一个黑客来关闭图例。

4

5 回答 5

111

这有点晦涩,但您必须使用pch>20(我认为 21:25 是相关形状):fill控制内部颜色(u)环并colour控制边缘周围的线。

(g0 <- ggplot(df, aes(x=x, y=y))+geom_point(aes(fill=id), 
       colour="black",pch=21, size=5))

更新:对于最近的 ggplot2 版本(例如 2.0.0,不知道它有多远),默认指南是一个颜色条。需要g0 + guides(fill="legend")得到一个带有点的图例,如图所示。默认中断也发生了变化:要准确复制您需要的这个情节g0 + scale_fill_continuous(guide="legend",breaks=seq(0.2,0.8,by=0.1))......

在此处输入图像描述

相关但不相同:如何在 R 中创建带有自定义点的图?. 该问题的公认答案使用@joran 的答案中显示的分层技术,但是(IMO)使用该pch=21技术的@jbaums 的答案更好。(我认为shape=21是一种替代方案,甚至可能是首选pch=21。)

PS如果你想绝对设置它而不是根据某个变量的值,你应该把它放在映射(位)colour 之外......aes

于 2012-05-03T18:49:21.020 回答
31

第一个问题是给我的:

ggplot(df, aes(x=x, y=y)) + 
    geom_point(aes(colour=id), size=12) + 
    geom_point(shape = 1,size = 12,colour = "black")

而且,哦,你想要一个额外的传说。我认为这样做:

在此处输入图像描述

于 2012-05-03T18:47:06.367 回答
6

我遇到了同样的问题,但我也需要一个允许抖动的解决方案。为此,您确实需要使用一个 pch ,它是一个带有边框的填充形状和来自 gridExtra 包的 grid.edit 函数。使用您的示例:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y, fill=id))+geom_point(pch=21, colour="Black", size=12)

library(gridExtra)
grid.edit("geom_point.points", grep = TRUE, gp = gpar(lwd = 3))
于 2015-02-19T00:34:29.277 回答
4

我有同样的问题,但也许因为我使用的是带有纬度和经度的 geom_map,所以截至 2020 年 1 月的其他答案对我不起作用。

重申问题,其中以下点周围没有黑色轮廓:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y))+geom_point(aes(colour=id), size=12) 

如果我同时声明颜色和填充美学,然后使用形状 21,问题就解决了。

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(colour=id, fill=id), 
  shape = 21,size = 12,colour = "black")

用黑色标出的点

于 2020-01-07T17:43:26.347 回答
0

如果您想要更多控制(例如,具有各种形状和透明度的点的边界),请使用fill形状的美学21:25

ggplot(aes(x = Sepal.Length, y = Petal.Width, fill = Species, shape = Species), data = iris) + # notice: fill
    geom_point(size = 4, alpha = 0.5) + # transparent point
    geom_point(size = 4, fill = NA, colour = "black") + # black border
    scale_shape_manual(values = c(21:23)) + # enable fill aesthetic
    theme_classic()
于 2020-10-27T14:13:30.997 回答