【问题标题】:Contour plot via Scatter plot通过散点图绘制等高线图
【发布时间】:2019-02-10 20:34:27
【问题描述】:

当图的数量很大时,散点图是无用的。

因此,例如,使用正态近似,我们可以得到等高线图。

我的问题:是否有任何软件包可以从散点图中实现等高线图。


谢谢@G5W !!我能行!!

【问题讨论】:

  • 也许读到了geom_contour
  • 感谢您的回复,我会努力的。

标签: r plot contour


【解决方案1】:

你没有提供任何数据,所以我会用一些人造数据来回应, 建在柱子的底部。你也不说有多少数据 你有虽然你说它是大量的点。我在说明 有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 创建基本上是 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)

您可以通过绘制更多椭圆并省略边界线来获得更连续的外观。

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))

【讨论】:

  • 非常漂亮!!我几乎直接在我的包中编写您的代码。你的解释很清楚!!你的代码对我帮助很大!!谢谢你!!
  • 我想在提交时使用这个等高线图,它不允许使用颜色。所以,我想使用group 的分组号1,2,3 来绘制散点图。如果你知道简单的代码,请告诉我!!
  • @CamfordOxbridge 有点过多的评论。将添加到答案。
【解决方案2】:

您可以使用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))

【讨论】:

  • 感谢您的回复!!当我提交文章时,颜色无法使用,所以这个情节对我有用!谢谢!!
猜你喜欢
  • 2013-10-19
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多