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) 位置的点应该是只有一个点的点的三倍。

4

8 回答 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()

在此处输入图像描述

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

ggplot(data = df,aes(x = x,y = y)) + stat_sum(aes(size = ..n..))
于 2013-02-04T19:14:17.680 回答
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)
于 2013-02-04T19:18:57.960 回答
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)

在此处输入图像描述

于 2013-02-04T19:14:17.227 回答
4

您并没有真正要求这种方法,但 alpha 可能是解决此问题的另一种方法:

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

在此处输入图像描述

于 2013-02-04T19:18:40.947 回答
3

您需要将参数添加cex到绘图函数中。首先,我要做的是使用该函数as.data.frame并将table您的数据减少为唯一的 (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))
于 2013-02-04T19:19:45.107 回答
2

您可能还想尝试一下sunflowerplot

sunflowerplot(x,y)

在此处输入图像描述

于 2018-07-15T10:30:02.780 回答
1

让我提出调整点大小的替代方案。使用尺寸(半径?面积?)的缺点之一是读者对光斑尺寸与基础数值的评估是主观的。

所以,选项 1:用透明度绘制每个点 --- Tyler 的忍者!选项 2:用于jitter稍微推动您的数据,以便绘制的点不会重叠。

于 2013-02-04T19:20:21.567 回答
0

使用latticeand的解决方案table(类似于@R_User,但不需要删除 0,因为 lattice 可以完成这项工作)

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

在此处输入图像描述

于 2013-02-04T23:47:39.833 回答