通过散点图绘制等高线图
Contour plot via Scatter plot
散点图在散点图数量很大时无用。
所以,例如,使用正态近似,我们可以得到等高线图。
我的问题:是否有任何包可以实现散点图的等高线图。
谢谢@G5W!!我能行!!
您可以使用 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))
产生
如果你真的想要等高线,你需要密度估计来绘制。 MASS::kde2d()
函数可以产生一个;请参阅其帮助页面中的示例,以根据结果绘制轮廓。这是它为该数据集提供的内容:
library(MASS)
contour(kde2d(x,y))
你没有提供任何数据,所以我会用一些人造数据来回应,
构建在post的底部。你也不说多少数据
你有虽然你说它是大量点。我在说明
有20000点。
您使用组号作为绘图字符来表示组。
我觉得这很难读。但是仅仅绘制点并不能显示
组好。给每组涂上不同的颜色是一个开始,但确实
不太好看
plot(x,y, pch=20, col=rainbow(3)[group])
可以使很多观点更容易理解的两个技巧是:
1.使点透明。密集的地方会显得更暗。和
2. 减少点数。
plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)
这看起来好一些,但没有解决您的实际要求。
您的示例图片似乎显示置信度省略号。你可以得到
那些使用 car
包中的函数 dataEllipse
的人。
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)
但是如果点真的很多,点还是可以重叠的
如此之多,以至于他们只是感到困惑。您也可以使用 dataEllipse
创建基本上是二维密度图而不显示点
根本。只需在彼此填充上绘制几个不同大小的椭圆
他们用透明的颜色。分布的中心会显得更暗。
这可以让我们了解大量点的分布。
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)
您可以通过绘制更多椭圆并省略边界线来获得更连续的外观。
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)
请尝试这些的不同组合以获得您的数据的漂亮图片。
对评论的补充回复:添加标签
也许添加组标签最自然的地方是
省略号。您可以通过简单地计算每组中点的质心来获得它。例如,
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)
}
请注意,我只是使用数字作为组标签,但如果您有更详细的名称,您可以将 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))
散点图在散点图数量很大时无用。
所以,例如,使用正态近似,我们可以得到等高线图。
我的问题:是否有任何包可以实现散点图的等高线图。
谢谢@G5W!!我能行!!
您可以使用 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))
产生
如果你真的想要等高线,你需要密度估计来绘制。 MASS::kde2d()
函数可以产生一个;请参阅其帮助页面中的示例,以根据结果绘制轮廓。这是它为该数据集提供的内容:
library(MASS)
contour(kde2d(x,y))
你没有提供任何数据,所以我会用一些人造数据来回应, 构建在post的底部。你也不说多少数据 你有虽然你说它是大量点。我在说明 有20000点。
您使用组号作为绘图字符来表示组。 我觉得这很难读。但是仅仅绘制点并不能显示 组好。给每组涂上不同的颜色是一个开始,但确实 不太好看
plot(x,y, pch=20, col=rainbow(3)[group])
可以使很多观点更容易理解的两个技巧是:
1.使点透明。密集的地方会显得更暗。和
2. 减少点数。
plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)
这看起来好一些,但没有解决您的实际要求。
您的示例图片似乎显示置信度省略号。你可以得到
那些使用 car
包中的函数 dataEllipse
的人。
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)
但是如果点真的很多,点还是可以重叠的
如此之多,以至于他们只是感到困惑。您也可以使用 dataEllipse
创建基本上是二维密度图而不显示点
根本。只需在彼此填充上绘制几个不同大小的椭圆
他们用透明的颜色。分布的中心会显得更暗。
这可以让我们了解大量点的分布。
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)
您可以通过绘制更多椭圆并省略边界线来获得更连续的外观。
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)
请尝试这些的不同组合以获得您的数据的漂亮图片。
对评论的补充回复:添加标签
也许添加组标签最自然的地方是 省略号。您可以通过简单地计算每组中点的质心来获得它。例如,
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)
}
请注意,我只是使用数字作为组标签,但如果您有更详细的名称,您可以将 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))