在R散点图中控制点的大小?

140
在R语言中,plot()函数可以使用pch参数来控制绘图中数据点的外观。我正在绘制包含成千上万个数据点的散点图,并希望数据点大小适中,不要太小也不要太大。通常情况下,我觉得pch='.'太小了,而pch=19又太粗了。是否有一些介于这两者之间的大小或者某种方式可以缩小数据点的大小呢?

相比于让点变小,有没有一种方法仅绘制100个随机数据点,这样比1000个更容易看到呢? - user2363642
对于许多小点,使用alpha(透明度)可以使散点图比仅使用较少的点来绘制更具信息性。 - user334911
2
我建议不要使用 pch='.',因为它会偏离中心。来源:我曾经经常使用 pch='.' - geneorama
@geneorama 你的意思是使用 · 替代 . 吗? - nanaki
@nanaki 大致上是这样,但奇怪的是当我在R中使用它时,你的符号显示为小方框。下面的答案很好地解释了正确的方法。 - geneorama
3个回答

119

尝试使用cex参数:

?par

  • cex
    这是一个数字,表示相对于默认值放大绘图文本和符号的大小。请注意,一些图形函数(例如plot.default)具有此名称的参数,该参数乘以此图形参数,而一些函数(例如points)接受一个被循环使用的值向量。如果提供的向量长度大于1,则其他用途将仅使用第一个值。

16
如果没有其他选择,我不认为我会使用“cex”来控制符号大小。它只有在某些情况下才有效;规则是,当通过“par”设置“cex”时,它影响图表上(大多数)文本的大小,而当在“plot”中设置时,“cex”仅影响符号大小。因此,如果您错误地应用了该规则,则不仅符号大小不会改变,而且现在有多个参数影响文本大小(cex.axis、cex.lab、cex.main 和 cex.sub - 所有这些都像"cex"一样工作,但只是逐段执行)。这样的代码很难维护和扩展。 - doug
6
同意。通过par全局设置cex会更改很多内容,包括需要进行纠正的图形边距等。然而,在plot内部设置cex似乎可以起作用。 - flies
1
Doug的评论中所提出的建议并不一定是“错误”的,但它确实夸大了在绘图时使用cex参数可能存在的潜在问题。在许多情况下,使用cex参数既有用又是最佳选择。 - joran
lwd 控制 pch 的线宽,例如 plot(1:5, pch=1:5, col=1:5, lwd=1:5)。感谢 http://www.sthda.com/english/wiki/r-plot-pch-symbols-the-different-point-shapes-available-in-r。 - geneorama

99

pch=20返回一个大小在“.”和19之间的符号。

它是一个填充的符号(这可能是您想要的)。

除此之外,在R中,即使是基本图形系统也允许用户对符号的大小、颜色和形状进行精细控制。例如:

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

图表示例


我喜欢这个图,但是我希望半径等于该点上的观测数量,你能告诉我如何做吗? - Derk Arts
“pi*R^2”(表面积)应该与观测数量成比例。 - SESman
5
这个代码会实现你想要的功能:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL) - fmark
1
你有什么想法可以在同一个图表上绘制多个系列吗?例如,"points(x=dfx2$ev1, y=dfx2$ev2, circles = dfx2$ev3, ...)" 这样的代码是行不通的。 - Neodyme
如果你想知道“英寸”是什么,请参见此处:https://dev59.com/BFYN5IYBdhLWcg3wsaDx - MichaelChirico

29

就像rcs所说的那样,cex函数可以在基础绘图包中完成此任务。我猜想您可能不想使用ggplot2来绘制您的图表,但是如果您想使用,size美学属性可供使用,您可以轻松控制它(ggplot2有用户友好的函数参数:相对于键入cex(字符扩展),在ggplot2中您可以键入例如size = 2,然后您将获得2毫米点)。

以下是示例:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)

6
如果您确实正在绘制成千上万个点,ggplot2有几种替代方法可以使其看起来漂亮 - 透明度调整、六边形箱、轮廓图等。如果您的图书馆有这本书或者可以电子访问Springer图书,可以查看ggplot2书的72-77页。 - Matt Parker
是的...我在散点图中特别使用alpha,以避免过度绘制。 - aL3xa
@aL3xa,您可以在基本图形包中使用_alpha_。只需在绘图选项中添加例如col = rgb(0, 0, 0, 0.6)即可。 - RobJan

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