10

我在这里找到了一个使用 ggplot 和 ddply 绘制凸包形状的好例子:使用 ggplot 在多个 geom_point 组周围绘制轮廓

我想我会尝试类似的东西——创建类似 Ashby Diagram 的东西——来练习 data.table 包:

test<-function()
{
library(data.table)
library(ggplot2)

set.seed(1)

这里我定义了一个简单的表:

dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")

然后我按级别定义船体位置:

hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")

所以我的想法是将船体与 dt 合并,以便我最终可以操纵船体以获得 ggplot 的正确形式(如下所示以供参考):

ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+
        geom_point()+
        geom_line()+
        geom_polygon(data=hulls,aes(fill=level))
}

但似乎无论我尝试合并 hulls 和 dt 的任何方式,我都会收到错误消息。例如,merge(hulls,dt) 会产生如脚注 1所示的错误。

这似乎应该很简单,我敢肯定我只是错过了一些明显的东西。非常感谢任何对类似帖子的指导或关于如何为 ggplot 准备船体的想法。或者,如果您认为最好坚持使用 ddply 方法,请告诉我。

示例不需要的输出:

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

导致一团纵横交错的多边形: 不需要的输出

脚注1:

vecseq(f__, len__, if (allow.cartesian) NULL else as.integer(max(nrow(x), : Join 结果为 60 行;超过 15 = max(nrow(x),nrow(i))) 中的错误. 检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没关系,请尝试包含j和删除by(by-without-by) 以便 j 为每个组运行以避免大分配。如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。

4

1 回答 1

10

这就是你想要做的。生成一些随机数据:

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

生产

在此处输入图像描述

它之所以有效,是因为chull返回需要从数据中选择以形成凸包的索引向量。然后,我们用 对每个单独的数据框进行子集化.SD[...],并用data.table将它们连接在一起level

于 2013-05-07T23:05:19.780 回答