ggtern

2016-01-15 10 views
7

में एक केडीई परिणाम प्लॉटिंग मैं तृतीयक साजिश के रूप में एक बड़े डेटासेट को साजिश करने के लिए ggtern का उपयोग कर रहा हूं (उदाहरण के नीचे देखें)। के रूप में मैं geom_density_tern उपयोग कर रहा थाggtern

enter image description here

एक निश्चित डेटा आकार सब कुछ तक

, सही था()। जैसा कि मैं इसे और अधिक जटिल डेटासेट को लोड करना चाहता हूं और 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

मैं सही ढंग से समझते हैं कि आप 'kde2' कॉल कर सकते हैं करते हैं, लेकिन के लिए स्मृति से बाहर' ggtern + geom_density_tern'? – tonytonov

+0

मेरा मतलब था कि मेरे "असली" विश्लेषण में मेरे पास एक विशाल डेटा फ्रेम है, जो कि geom_density_tern के लिए एक बार में संभालने के लिए बहुत बड़ा है। मैंने geom_density_tern में एक prealculculated kde2 मैट्रिक्स में लोड करने के लिए सोचा था। क्या यह अधिक समझ में आता है? – Ludwik

उत्तर

2

हम इस कोड का उपयोग करके इसे हल कर सकते हैं जिसका उपयोग आम तौर पर स्टेट में दृश्यों के पीछे किया जाता है। के साथ संगत होने के लिए पैकेज को पूरी तरह से लिखने के बाद कुछ दिन पहले सीआरएएन पर प्रकाशित 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

क्षमा करें, स्केल शामिल करना भूल गए, मैंने इसे किसी और चीज़ से लोड किया था। अतिरिक्त मुद्दा क्या है? –