2016-01-15 2 views
7

私はggternを使って3次プロットの形で大きなデータセットをプロットしています(下の例を参照)。ggternでのkde結果のプロット

enter image description here

特定のデータサイズティル私はgeom_density_ternを使用していたとして、すべてが)(、完璧でした。もっと複雑なデータセットをすべて可視化して表示したいので、ggplotでレンダリングすることは不可能になります(メモリ側の制限)。私は別々に計算されたkde2d行列の結果を代入することで回避策があるかもしれないと考えました。それが私が立ち往生している場所です。私はそれがggternでそれをどうにかすることが可能かどうかを知りたいですか?

いずれにしても、この時点で使用するデータ構造とプロットの最小限のケースを追加します。

require(ggplot2) 
require(ggtern) 

set.seed(1) 

mydata <- data.frame(
     x = runif(100, min = 0.25, max = 0.5), 
     y = runif(100, min = 0.1, max = 0.4), 
     z = runif(100, min = 0.5, max = 0.7)) 

plot <- ggtern() + 
     theme_bw() + 
     theme_hidetitles() + 
     geom_density_tern(data = mydata, 
      aes(x = x, y = y, z = z, alpha = ..level..), 
      size = 0.1, linetype = "solid", fill = "blue")+ 
     geom_point(data = mydata, 
      aes(x = x, y = y, z = z), alpha = 0.8, size = 1) 
plot 

これらの余分な行は、三元座標系における密度プロットを再現:

library(MASS) 
dataTern = transform_tern_to_cart(mydata$x,mydata$y,mydata$z) 
dataTernDensity <- kde2d(x=dataTern$x, y=dataTern$y, lims = c(range(0,1), range(0,1)), n = 400) 

image(dataTernDensity$x, dataTernDensity$y, dataTernDensity$z) 
points(dataTern$x, dataTern$y, pch = 20, cex = 0.1) 
segments(x0 = 0, y0 = 0, x1 = 0.5, y1 = 1, col= "white") 
segments(x0 = 0, y0 = 0, x1 = 1, y1 = 0, col= "white") 
segments(x0 = 0.5, y0 = 1, x1 = 1, y1 = 0, col= "white") 

そして、このグラフを得る:任意の助けを事前に

enter image description here

感謝を!

+0

私はあなたが 'ggtern + geom_density_tern'のために' kde2'が、メモリ不足に呼び出すことができることを正しく理解していますか? – tonytonov

+0

私は、私の "本当の"分析では、巨大なデータフレームを持っていることを意味しました.Geom_density_ternが一度に処理するためにはるかに大きなものです。私はgeom_density_ternにあらかじめ計算されたkde2行列をロードすると考えました。もっと分かりやすいですか? – Ludwik

答えて

2

これは、通常、Statの舞台裏で使用されるコードを使用して解決できます。 ggplot2 2.0.0と互換性があるようにパッケージを完全に書き直してから数日前にCRANに公開されたggtern 2.0.1をリリースしたので、私はあなたのニーズに合った方法に慣れています。ところで、あなたの興味のために、ggtern 2.0.Xの新機能の概要はhereを見つけることができます:

以下

アイソメトリック対数比スペースに算出された濃度の推定値であり、あなたの問題は、解決のための作業とコードを見つけてください。

solution

#Required Libraries 
library(ggtern) 
library(ggplot2) 
library(compositions) 
library(MASS) 
library(scales) 

set.seed(1) #For Reproduceability 
mydata <- data.frame(
    x = runif(100, min = 0.25, max = 0.5), 
    y = runif(100, min = 0.1, max = 0.4), 
    z = runif(100, min = 0.5, max = 0.7)) 

#VARIABLES 
nlevels = 7 
npoints = 200 
expand = 0.5 

#Prepare the data, put on isometric logratio basis 
df  = data.frame(acomp(mydata)); colnames(df) = colnames(mydata) 
data = data.frame(ilr(df)); colnames(data) = c('x','y') 

#Prepare the Density Estimate Data 
h.est = c(MASS::bandwidth.nrd(data$x), MASS::bandwidth.nrd(data$y)) 
lims = c(expand_range(range(data$x),expand),expand_range(range(data$y),expand)) 
dens = MASS::kde2d(data$x,data$y,h=h.est,n=npoints,lims=lims) 

#------------------------------------------------------------- 
#<<<<< Presumably OP has data at this point, 
#  and so the following should achieve solution 
#------------------------------------------------------------- 

#Generate the contours via ggplot2's non-exported function 
lines = ggplot2:::contour_lines(data.frame(expand.grid(x = dens$x, y = dens$y), 
              z=as.vector(dens$z),group=1), 
           breaks=pretty(dens$z,n=nlevels)) 

#Transform back to ternary space 
lines[,names(mydata)] = data.frame(ilrInv(lines[,names(data)])) 

#Render the plot 
ggtern(data=lines,aes(x,y,z)) + 
    theme_dark() + 
    theme_legend_position('topleft') + 
    geom_polygon(aes(group=group,fill=level),colour='grey50') + 
    scale_fill_gradient(low='green',high='red') + 
    labs(fill = "Density", 
     title = "Example Manual Contours from Density Estimate Data") 
+0

このソリューションをお寄せいただきありがとうございます。私はexpand_range()関数がなくてもライブラリ(尺度)の行を追加しました。 – Ludwik

+0

データのプロットにはまだ問題がありますが、そのために新しいスレッドを開きます。 – Ludwik

+0

申し訳ありませんが、スケールを含めるのを忘れてしまいました。追加の問題は何ですか? –

関連する問題