重叠点图

3

我在R中有重叠的数据点。

x = c(4,4,4,7,3,7,3,8,6,8,9,1,1,1,8)
y = c(5,5,5,2,1,2,5,2,2,2,3,5,5,5,2)
plot(x,y)

我该如何绘制这些点,使重叠的点比未重叠的点更大?例如,如果有3个点位于(4,5),那么在位置(4,5)的点应该比仅有1个点的点大三倍。

除了所有这些答案之外,在plotrix包中还有一个sizeplot函数... - Ben Bolker
8个回答

9

这里有一种使用ggplot2的方法:

x = c(4,4,4,7,3,7,3,8,6,8,9,1,1,1,8)
y = c(5,5,5,2,1,2,5,2,2,2,3,5,5,5,2)
df <- data.frame(x = x,y = y)
ggplot(data = df,aes(x = x,y = y)) + stat_sum()

enter image description here

默认情况下,stat_sum 使用实例的比例。您可以通过执行以下操作来改为使用原始计数:

ggplot(data = df,aes(x = x,y = y)) + stat_sum(aes(size = ..n..))

6

这里有一个更为简单的(我认为)解决方案:

x <- c(4,4,4,7,3,7,3,8,6,8,9,1,1,1,8)
y <- c(5,5,5,2,1,2,5,2,2,2,3,5,5,5,2)
size <- sapply(1:length(x), function(i) { sum(x==x[i] & y==y[i]) })
plot(x,y, cex=size)

5
## Tabulate the number of occurrences of each cooordinate
df <- data.frame(x, y)
df2 <- cbind(unique(df), value = with(df, tapply(x, paste(x,y), length)))

## Use cex to set point size to some function of coordinate count
## (By using sqrt(value), the _area_ of each point will be proportional
##  to the number of observations it represents)
plot(y ~ x, cex = sqrt(value), data = df2, pch = 16)

enter image description here


4

虽然您并未直接要求此方法,但 alpha 可能是另一种解决此问题的方法:

library(ggplot2)
ggplot(data.frame(x=x, y=y), aes(x, y)) + geom_point(alpha=.3, size = 3)

enter image description here


3
你需要在绘图函数中添加参数cex。首先,我会使用as.data.frametable函数将你的数据减少到唯一的(x,y)对及其频率:
new.data = as.data.frame(table(x,y))
new.data = new.data[new.data$Freq != 0,] # Remove points with zero frequency

这样做的唯一缺点是将数字数据转换为因子。因此,需要将其转换回数字并进行绘图!
plot(as.numeric(new.data$x), as.numeric(new.data$y), cex = as.numeric(new.data$Freq))

很好。as.data.frame(table(x,y))是我正在寻找的简单聚合函数。 - Josh O'Brien
重要编辑:table(x,y)将数值数据转换为因子,因此在绘图时需要将它们转换回数值数据。我自己刚刚意识到这一点! - R_User
事实上,你需要比这更加小心,使用as.numeric(as.character(x))或(为了预防as.character()部分,可以先执行as.data.frame(table(x,y), stringsAsFactors=FALSE))。此外,无需将new.data$Freq包装在as.numeric()中,因为它已经是一个整数。 - Josh O'Brien

2
您可能还想尝试使用sunflowerplot
sunflowerplot(x,y)

enter image description here


1
让我提出调整点大小的替代方案。使用大小(半径?面积?)的缺点之一是读者对点的大小与基础数值之间的评估是主观的。
因此,选项1:使用透明度绘制每个点---Tyler已经做了!选项2:使用“抖动”轻微地推动您的数据,以便绘制的点不重叠。

0

使用latticetable的解决方案(类似于@R_User,但不需要删除0,因为lattice会处理)

   dt <-  as.data.frame(table(x,y))
   xyplot(dt$y~dt$x, cex = dt$Freq^2, col =dt$Freq)

enter image description here


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