Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中的data.tables绘制凸包图_R_Merge_Ggplot2_Data.table_Convex Hull - Fatal编程技术网

使用R中的data.tables绘制凸包图

使用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

我在这里找到了一个使用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 _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))