在ggtern中绘制kde结果

在ggtern中绘制kde结果,r,ggplot2,contour,ggtern,R,Ggplot2,Contour,Ggtern,我正在使用ggtern以三次绘图的形式绘制一个大型数据集(请参见下面的示例) 在达到一定的数据大小之前,一切都是完美的,因为我使用的是geom_density_tern()。因为我想可视化一个复杂得多的数据集,加载所有数据集并使用ggplot进行渲染变得不可能(内存方面的限制)。我认为可能有一个解决办法,通过输入单独计算的kde2d矩阵的结果。这就是我被困的地方。我想知道是否有可能在ggtern做这件事 在任何情况下,我都会添加一个我目前使用的数据结构和绘图的最小案例 require(ggpl

我正在使用ggtern以三次绘图的形式绘制一个大型数据集(请参见下面的示例)

在达到一定的数据大小之前,一切都是完美的,因为我使用的是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
require(ggplot2)
需要(ggtern)
种子(1)

mydata我们可以使用通常在Stat后台使用的代码来解决这个问题。刚刚发布了
ggtern 2.0.1
,几天前在CRAN上发布,在完全重新编写包以兼容
ggplot2.0.0
之后,我熟悉一种可能适合您需要的方法。顺便说一句,出于您的兴趣,
ggtern 2.0.X
中的新功能摘要可以找到:

下面请为您的问题找到解决方案和工作代码,这是在等轴测原木比率空间上计算的密度估计值

#必需的库
图书馆(ggtern)
图书馆(GG2)
图书馆(作文)
图书馆(弥撒)
图书馆(比例尺)
种子(1)#用于繁殖

我的数据我是否正确理解您可以调用
kde2
,但是
ggtern+geom_density_tern
的内存不足?我的意思是,在我的“真实”分析中,我有一个巨大的数据帧,对于geom_density_tern来说,一次处理就太大了。我想在几何密度中加载一个预先计算的kde2矩阵。这更容易理解吗?谢谢你的解决方案。我添加了library(scales)行,因为没有它,expand_range()函数就丢失了。绘制数据时仍然存在问题,但为此我将打开一个新线程。抱歉,忘了包含scales,我是从其他程序加载的。还有什么问题?
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")
#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")