2014-07-19 10 views
5

में घनत्व के लिए पैमाने निर्दिष्ट करना मैं "एनिमेटेड गर्मी मानचित्र" बनाने के लिए कई घनत्व ग्राफ बनाने के लिए देख रहा हूं।ggplot2 की stat_density2d

चूंकि एनीमेशन के प्रत्येक फ्रेम तुलनीय होना चाहिए, इसलिए मैं प्रत्येक ग्राफ पर घनत्व -> रंग मैपिंग उन सभी के लिए समान होना चाहूंगा, भले ही डेटा की सीमा प्रत्येक के लिए बदल जाए।

यहाँ कोड मैं प्रत्येक व्यक्ति के ग्राफ के लिए इसका उपयोग करेंगे:

ggplot(data= this_df, aes(x=X, y=Y)) + 
    geom_point(aes(color= as.factor(condition)), alpha= .25) + 
    coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() + 
    stat_density2d(mapping= aes(alpha = ..level..), geom="polygon", bins=3, size=1) 

कल्पना कीजिए मैं इस एक ही कोड का उपयोग, लेकिन हर फ्रेम पर 'this_df' बदल जाता है। तो एक ग्राफ में, शायद घनत्व 0 से 4e-4 तक है। दूसरे पर, घनत्व 0 से 4e-2 तक है।

डिफ़ॉल्ट रूप से, ggplot इनमें से प्रत्येक के लिए एक अलग घनत्व -> रंग मैपिंग की गणना करेगा। लेकिन इसका मतलब यह होगा कि दो ग्राफ - एनीमेशन के दो फ्रेम - वास्तव में तुलनीय नहीं हैं। यदि यह एक हिस्टोग्राम या घनत्व साजिश था, तो मैं केवल coord_cartesian को कॉल करूँगा और एक्स और वाई lim को बदल दूंगा। लेकिन घनत्व साजिश के लिए, मुझे नहीं पता कि पैमाने को कैसे बदला जाए।

निकटतम मैं मिल सकता है यह है:

Overlay two ggplot2 stat_density2d plots with alpha channels

लेकिन मैं ही ग्राफ पर दो घनत्व भूखंडों डालने की विकल्प नहीं है, क्योंकि मैं उन्हें अलग फ्रेम होना चाहता हूँ।

किसी भी मदद की सराहना की जाएगी!

संपादित करें:

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:

set.seed(4) 
g = list(NA,NA) 
for (i in 1:2) { 

    sdev = runif(1) 
    X = rnorm(1000, mean = 512, sd= 300*sdev) 
    Y = rnorm(1000, mean = 384, sd= 200*sdev) 

    this_df = as.data.frame(cbind(X = X,Y = Y, condition = 1:2)) 

    g[[i]] = ggplot(data= this_df, aes(x=X, y=Y)) + 
    geom_point(aes(color= as.factor(condition)), alpha= .25) + 
    coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() + 
    stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), geom="contour", bins=4, size= 2) 

} 
print(g) # level has a different scale for each 
+0

आप स्तर पर रंग नहीं, 'अल्फा' मैप कर रहे हैं। आप 'scale_alpha_continuous (सीमा = ...)' जोड़कर अल्फा स्केल को नियंत्रित कर सकते हैं, जहां 'सीमाएं 'वेक्टर हैं, जो' ..level..' की इकाइयों में सीमा निर्दिष्ट करती हैं, इसलिए (0,4e-2) मुझे लगता है। यदि आप अपना डेटासेट प्रदान करते हैं, तो कोई आपको अधिक सहायता देने के इच्छुक हो सकता है। – jlhoward

+0

प्रतिक्रिया के लिए धन्यवाद! मैंने नकली डेटा के साथ पुनरुत्पादित कोड जोड़ा है (असली डेटा साझा नहीं कर सकता)। ध्यान दें कि यदि आप जोड़ते हैं, तो इस कोड के अंत में '+ scale_alpha_continuous (सीमा = सी (0, 2e-6))' कहें, यह अल्फा स्केलिंग निरंतर बनाता है, लेकिन समोच्चों को ठीक नहीं करता है। मैं दो ग्राफों में समेकित स्केलिंग कैसे बना सकता हूं? – jwdink

+0

क्या आप कह रहे हैं कि आप दोनों प्लॉट्स में ..level .. के समान मूल्यों के लिए रूपरेखा तैयार करना चाहते हैं? यदि ऐसा है, तो 'stat_density2d (...)' में 'breaks = ...' का उपयोग करें। – jlhoward

उत्तर

7

तो दोनों भूखंडों एक ही स्तर के साथ आकृति दिखाने के लिए, stat_densit2d(...) में breaks=... तर्क का उपयोग करने के लिए। अल्फा के स्तर पर समान मैपिंग के साथ दोनों भूखंडों के लिए, scale_alpha_continuous(limits=...) का उपयोग करें।

यहाँ पूर्ण कोड प्रदर्शित करने के लिए है:

library(ggplot2) 
set.seed(4) 
g = list(NA,NA) 
for (i in 1:2) { 
    sdev = runif(1) 
    X = rnorm(1000, mean = 512, sd= 300*sdev) 
    Y = rnorm(1000, mean = 384, sd= 200*sdev) 
    this_df = as.data.frame(cbind(X = X,Y = Y, condition = 1:2)) 

    g[[i]] = ggplot(data= this_df, aes(x=X, y=Y)) + 
    geom_point(aes(color= as.factor(condition)), alpha= .25) + 
    coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() + 
    stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), 
        breaks=1e-6*seq(0,10,by=2),geom="contour", bins=4, size= 2)+ 
    scale_alpha_continuous(limits=c(0,1e-5))+ 
    scale_color_discrete("Condition") 
} 
library(gridExtra) 
do.call(grid.arrange,c(g,ncol=2)) 

और परिणाम ...

+1

यह वह समाधान है जिसकी मुझे आज आवश्यकता थी। मैंने कोड चलाया और पाया कि 'stat_density2d' वर्तमान ggplot2 (ggplot2_2.1.0) के साथ 'ब्रेक' नहीं ले रहा है। क्या आप एक ही प्रभाव प्राप्त करने के किसी अन्य तरीके के बारे में सोच सकते हैं? – jazzurro

7

मैं इस सवाल के लिए एक अद्यतन बाहर जाना चाहते हैं। जुलाई 2016 तक, stat_density2dbreaks नहीं ले रहा है। ग्राफ़िक को पुन: पेश करने के लिए, आपको breaks=1e-6*seq(0,10,by=2) से scale_alpha_continuous() स्थानांतरित करने की आवश्यकता है।

set.seed(4) 
g = list(NA,NA) 
for (i in 1:2) { 
    sdev = runif(1) 
    X = rnorm(1000, mean = 512, sd= 300*sdev) 
    Y = rnorm(1000, mean = 384, sd= 200*sdev) 
    this_df = as.data.frame(cbind(X = X,Y = Y, condition = 1:2)) 

g[[i]] = ggplot(data= this_df, aes(x=X, y=Y)) + 
     geom_point(aes(color= as.factor(condition)), alpha= .25) + 
     coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + 
     scale_y_reverse() + 
     stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), 
     geom="contour", bins=4, size= 2) + 
     scale_alpha_continuous(limits=c(0,1e-5), breaks=1e-6*seq(0,10,by=2))+ 
     scale_color_discrete("Condition") 
    } 

do.call(grid.arrange,c(g,ncol=2))