10

ここで、ddply で ggplot を使用して凸包形状をプロットする良い例を見つけました: Drawing Outlines around multiple geom_point groups with ggplot

data.table パッケージで練習するために、Ashby ダイアグラムのようなものを作成して、同様のことを試してみようと思いました。

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

しかし、ハルと 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), : 結合は 60 行になる; 15 以上 = max(nrow(x),nrow(i))) . i の重複するキー値をチェックします, それぞれが x の同じグループに何度も参加します. それがOKなら, インクルードjとドロップby(by-without-by) を試してください.続行する場合は、allow.cartesian=TRUE で再実行してください。それ以外の場合は、FAQ、Wiki、スタック オーバーフロー、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 に答える