在ggplot中控制点边界的粗细

108

使用ggplot时,我可以将shape设置为21-25以获取具有内部(fill)和边框(col)颜色独立设置的形状,如下所示:

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

在这里输入图片描述

然而,我无法弄清楚如何控制形状边框的粗细,无论是绝对设置还是美学映射。请注意,如果我设置lwd值,则会覆盖size美学属性:

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

在此输入图像描述

如何控制边框的粗细?

3个回答

154

ggplot2的版本2.0.0开始,有一个参数可以控制点边框的粗细。来自NEWS.md文件:

geom_point()增加了stroke美学,它控制形状21-25的边框宽度(#1133, @SeySayux)。大小和描边叠加,因此大小为5、描边为5的点将具有直径10mm。(#1142)

因此,现在的正确解决方案是:

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

Output


这是一段HTML代码,其中包含一个图片链接。

1
你能添加输出吗? - Thomas
3
为了未来的兼容性和清晰度,最好说“从版本 x.xx 开始”而不是“最新版本”。 - Gregor Thomas
是否有一种根据变量来控制描边粗细的方法?类似于“scale_stroke_manual”这样的东西? - Ricecakes
2
作为对我上面评论的回应,我们可以使用scale_discrete_manual。请参见此链接:https://github.com/tidyverse/ggplot2/issues/3507#issuecomment-526212978 - Ricecakes
1
有什么想法为什么stroke=0在PDF中仍然会绘制它,但在PNG中不会呢? - gkcn

19

感觉有点取巧,但是你可以添加一个 "背景" 点集,大小设置为美学映射加上一些小常数来 扩大 点的边界。调整常数以获得所需的边框宽度。

您还需要禁用大小图例,以防止在图表上显示图例...

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(size=id+0.5), colour="black" , show_guide = FALSE )+
  scale_size( guide = "none" )+
  geom_point(aes(fill=id, size=id), colour="black", shape=21)

输入图像描述


2
这种方法可能有些取巧,但是 Hadley 在 Twitter 上认可了它。 - Noam Ross
1
@NoamRoss,你有那个链接吗? - Simon O'Hanlon

1
另一种解决方案是在R中创建图形,然后将其导出为.svg文件。可以使用矢量图形编辑软件(例如Inkscape)更改线宽。当数据点重叠时,此方法特别有用。

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