通过散点图绘制轮廓图

时间:2019-02-04 08:33:17

标签: r plot contour

当地块数量很大时,散点图就没用了。

因此,例如,使用法线逼近,我们可以获得等高线图。

我的问题:是否有任何程序包可以实现散点图的轮廓图。 enter image description here


谢谢@ G5W!我可以做到!

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用hexbin::hexbin()显示非常大的数据集。

@ G5W提供了一个不错的数据集:

x = c(rnorm(2000,0,1), rnorm(7000,1,1), rnorm(11000,5,1))
twist = c(rep(0,2000),rep(-0.5,7000), rep(0.4,11000))
y = c(rnorm(2000,0,1), rnorm(7000,5,1), rnorm(11000,6,1)) + twist*x
group = c(rep(1,2000), rep(2,7000), rep(3,11000))

如果您不知道群组信息,则省略号是不合适的;这就是我的建议:

library(hexbin)
plot(hexbin(x,y))

产生

screenshot

如果您真的想要轮廓,则需要密度估计才能绘制。 MASS::kde2d()函数可以产生一个;请参阅其帮助页面中的示例以根据结果绘制轮廓。这就是该数据集的作用:

library(MASS)
contour(kde2d(x,y))

screenshot

答案 1 :(得分:1)

您没有提供任何数据,因此我将提供一些人工数据, 构造在帖子的底部。你也不说多少数据 尽管您说的是很多点,但您有。我在说明 20000分

您使用组号作为绘图字符来指示组。 我觉得很难读。但是,仅绘制点并不会显示 分组良好。为每个组着色不同的颜色是一个开始,但是 看起来不太好。

plot(x,y, pch=20, col=rainbow(3)[group])

First Attempt - color the groups

可以使很多观点更容易理解的两个技巧:
1.使点透明。密集的地方将显得更暗。 AND
2.减小点的大小。

plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)

Transparent points of reduced size

这看起来好一些,但没有解决您的实际要求。 您的示例图片似乎显示出置信度椭圆。你可以得到 使用dataEllipse包中的函数car的用户。

library(car)
plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)
dataEllipse(x,y,factor(group), levels=c(0.70,0.85,0.95),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, center.pch=FALSE)

Plot with confidence ellipses

但是如果确实有很多点,这些点仍然可以重叠 如此之多以至于他们都感到困惑。您也可以使用dataEllipse 在不显示点的情况下创建基本上是2D密度的图 完全没有只需在彼此填充上绘制几个不同大小的椭圆 它们具有透明的颜色。分布的中心将变暗。 这样可以给出大量点的分布情况。

plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=c(seq(0.15,0.95,0.2), 0.995),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, 
    center.pch=FALSE, fill=TRUE, fill.alpha=0.15, lty=1, lwd=1)

Density plot

通过绘制更多的椭圆并省略边界线,可以使外观更加连续。

plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=seq(0.11,0.99,0.02),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, 
    center.pch=FALSE, fill=TRUE, fill.alpha=0.05, lty=0)

Smoother density plot

请尝试将它们组合使用,以获得更清晰的数据图。


对评论的其他回复:添加标签
添加组标签最自然的地方可能是 椭圆。您可以通过简单地计算每个组中点的质心来获得该值。例如,

plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=c(seq(0.15,0.95,0.2), 0.995),
        plot.points=FALSE, col=rainbow(3), group.labels=NA,
    center.pch=FALSE, fill=TRUE, fill.alpha=0.15, lty=1, lwd=1)

## Now add labels
for(i in unique(group)) {
    text(mean(x[group==i]), mean(y[group==i]), labels=i) 
}

Labeled Ellipses

请注意,我只是将数字用作组标签,但是如果您有更详细的名称,则可以将labels=i更改为类似 labels=GroupNames[i]



数据

x = c(rnorm(2000,0,1), rnorm(7000,1,1), rnorm(11000,5,1))
twist = c(rep(0,2000),rep(-0.5,7000), rep(0.4,11000))
y = c(rnorm(2000,0,1), rnorm(7000,5,1), rnorm(11000,6,1)) + twist*x
group = c(rep(1,2000), rep(2,7000), rep(3,11000))