以维恩图表的方式表示散点图数据?

时间:2014-03-28 14:52:33

标签: r matlab graph scatter-plot variance

我有几个散点图,代表我数据的不同子集。我想找到一种方法来直观地表示这些数据子集的重叠/缺失重叠。在R或Matlab中,将每组数据转换为椭圆形并考虑数据的均值和方差的最佳方法是什么?如果有意义的话,我基本上想把三个独立的散点图变成维恩图。

2 个答案:

答案 0 :(得分:3)

您可以使用椭圆包中的ellipse函数来计算椭圆上的点,对于每组数据,您将为椭圆函数提供均值,标准偏差和相关性,然后将结果传递给lines函数添加到散点图中。如果组合理正常,这将很有效,但如果组中存在强烈的偏斜,则椭圆将不适合。

另一种选择是使用chull函数来计算包含组中所有点的复杂外壳。您可以使用它来绘制包含所有点的多边形(有些将触及多边形)。如果你想要比多边形更弯曲的东西,那么使用xspline函数来绘制而不是linespolygon。以下是一些示例代码:

with(iris, plot( Petal.Width, Petal.Length, col=c('red','green','blue')[Species]))

tmp <- chull(iris[ iris$Species=='setosa', c('Petal.Width','Petal.Length')])
xspline( iris[ iris$Species=='setosa', c('Petal.Width','Petal.Length')][tmp,],
    border='red',open=FALSE, shape= -0.75)

tmp <- chull(iris[ iris$Species=='versicolor', c('Petal.Width','Petal.Length')])
xspline( iris[ iris$Species=='versicolor', c('Petal.Width','Petal.Length')][tmp,],
    border='green',open=FALSE, shape= -0.75)

tmp <- chull(iris[ iris$Species=='virginica', c('Petal.Width','Petal.Length')])
xspline( iris[ iris$Species=='virginica', c('Petal.Width','Petal.Length')][tmp,],
    border='blue',open=FALSE, shape= -0.75)



library(ellipse)

with(iris, plot( Petal.Width, Petal.Length, col=c('red','green','blue')[Species]))

polygon( ellipse( 
    var( iris[ iris$Species=='setosa', c('Petal.Width','Petal.Length') ] ),
    centre=colMeans(iris[ iris$Species=='setosa', c('Petal.Width','Petal.Length') ]),
    t=3),
    border='red')

polygon( ellipse( 
    var( iris[ iris$Species=='versicolor', c('Petal.Width','Petal.Length') ] ),
    centre=colMeans(iris[ iris$Species=='versicolor', c('Petal.Width','Petal.Length') ]),
    t=3),
    border='green')

polygon( ellipse( 
    var( iris[ iris$Species=='virginica', c('Petal.Width','Petal.Length') ] ),
    centre=colMeans(iris[ iris$Species=='virginica', c('Petal.Width','Petal.Length') ]),
    t=3),
    border='blue')

答案 1 :(得分:2)

除了由@hrbrmstr链接的Q&amp; A中给出的解决方案之外,还可以使用凸包来实现它的整体表示:

library(scales) #Only for the transparency effect
data(iris)
plot(iris$Sepal.Length, iris$Sepal.Width, type="n")
a <- split(iris, iris$Species) #Separate the dataset by ID (here species)
for(i in seq_along(a)){
    h <- chull(a[[i]]) #Compute convex hull for each group
    h <- c(h, h[1])
    polygon(a[[i]][h,], col=alpha(i,.5), border=NA) #Plot it
    }
points(iris$Sepal.Length, iris$Sepal.Width, col=iris$Species, pch=19) #Add data points

enter image description here