使用R中的data.tables绘制凸包图
我在这里找到了一个使用ggplot和ddply绘制凸面外壳形状的好例子: 我想我应该尝试类似的方法--创建类似于Ashby图的东西--来练习data.table包:使用R中的data.tables绘制凸包图,r,merge,ggplot2,data.table,convex-hull,R,Merge,Ggplot2,Data.table,Convex Hull,我在这里找到了一个使用ggplot和ddply绘制凸面外壳形状的好例子: 我想我应该尝试类似的方法--创建类似于Ashby图的东西--来练习data.table包: test<-function() { library(data.table) library(ggplot2) set.seed(1) test以下是您想要做的事情。生成一些随机数据: library(ggplot2) library(data.table) # You have to set the seed _bef
test<-function()
{
library(data.table)
library(ggplot2)
set.seed(1)
test以下是您想要做的事情。生成一些随机数据:
library(ggplot2)
library(data.table)
# You have to set the seed _before_ you generate random data, not after
set.seed(1)
dt <- data.table(xdata=runif(15), ydata=runif(15), level=rep(c("a","b","c"), each=5),
key="level")
产生
它之所以有效,是因为chull
返回一个索引向量,需要从数据中选择这些索引以形成凸包。然后,我们使用.SD[…]
对每个数据帧进行子集划分,并使用数据。表
通过级别
允许将它们连接在一起。笛卡尔是一个我不知道的技巧,谢谢。在您的示例中,我遇到的问题是保留级别信息。问题的作者:能够使用ddply在多个组周围创建凸面外壳形状。我基本上是想用data.table方法重复作者原始问题的输出。你能澄清一下“保留级别信息”是什么意思吗?如中所示,给定上述hull
和dt
,您希望输出是什么?hull[dt,allow.cartesian=TRUE]返回一个包含60行的data.table。但是,对于三个外壳“a”、“b”和“c”,我不需要60个点来描述形状,因为有些点位于形状内部。在我的问题中,我将举一个不期望的输出示例来帮助说明+顺便说一句,allow.cartesian.外壳谢谢@mnel-.I
是一个很好的技巧,我应该记得更经常地使用它。不过,我将保留我的解决方案,因为向新的data.table
用户解释要容易得多。我猜有一种优雅的方法可以做到这一点。有了这个功能,我认为该方法可以很容易地扩展到制作类似Ashby的图。例如:+1表示您的努力并清楚地解释您想要什么。请注意,在您自己的函数中调用库
可能是不必要的(如果您计划多次调用该函数,则效率低下)。
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_line()+
geom_polygon(data=hulls,aes(fill=level))
}
test<-function(){
library(data.table)
library(ggplot2)
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
set.seed(1)
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
setkey(dt, 'level') #setting the key seems unneeded
setkey(hulls, 'level')
hulls<-hulls[dt, allow.cartesian = TRUE]
ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_polygon(data=hulls,aes(fill=level))
}
library(ggplot2)
library(data.table)
# You have to set the seed _before_ you generate random data, not after
set.seed(1)
dt <- data.table(xdata=runif(15), ydata=runif(15), level=rep(c("a","b","c"), each=5),
key="level")
hulls <- dt[, .SD[chull(xdata, ydata)], by = level]
ggplot(dt,aes(x=xdata,y=ydata,color=level)) +
geom_point() +
geom_polygon(data = hulls,aes(fill=level,alpha = 0.5))