2015-02-12 7 views
8

का उपयोग कर पूरी तरह से समोच्च को भरने के लिए कैसे मैं ggplot2 के stat_contour द्वारा उत्पन्न समोच्च को पूरी तरह से भरने के तरीकों की तलाश में हूं। वर्तमान परिणाम इस तरह है:stat_contour

# Generate data 
library(ggplot2) 
library(reshape2) # for melt 
volcano3d <- melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 

v <- ggplot(volcano3d, aes(x, y, z = z)) 
v + stat_contour(geom="polygon", aes(fill=..level..)) 

enter image description here

वांछित परिणाम मैन्युअल कोड को संशोधित करने के रूप में निम्नानुसार द्वारा उत्पादित किया जा सकता है।

v + stat_contour(geom="polygon", aes(fill=..level..)) + 
    theme(panel.grid=element_blank())+ # delete grid lines 
    scale_x_continuous(limits=c(min(volcano3d$x),max(volcano3d$x)), expand=c(0,0))+ # set x limits 
    scale_y_continuous(limits=c(min(volcano3d$y),max(volcano3d$y)), expand=c(0,0))+ # set y limits 
    theme(panel.background=element_rect(fill="#132B43")) # color background 

enter image description here

मेरा प्रश्न: वहाँ एक रास्ता पूरी तरह से मैन्युअल रूप से रंग निर्दिष्ट करने या geom_tile() का उपयोग किए बिना भूखंड को भरने के लिए है?

+0

संबंधित: http://stackoverflow.com/questions/25788727/filled-contour-vs-ggplot2-stat-contour – tonytonov

+0

जहां तक ​​मेरा बता सकते हैं, आप का विस्तार करने की आवश्यकता होगी आपकी डेटासेट मैन्युअल रूप से। आपका समाधान सरल दिखता है, इसलिए यदि आप इससे संतुष्ट हैं, तो बस इसे छोड़ दें। – tonytonov

+0

मैंने यह पोस्ट भी देखा लेकिन geom_tile() छोटे आयत का उपयोग करते हैं और इसलिए यह प्रभाव नहीं है जिसे मैं ढूंढ रहा हूं। full.contour ने अब तक का सबसे अच्छा परिणाम प्रस्तुत किया है लेकिन कई साजिशों के साथ इसकी असंगतता ने मुझे ggplots के साथ प्रयास करने का नेतृत्व किया। मैं सोच रहा हूं कि पारदर्शी क्षेत्रों का उत्पादन क्या हुआ। – chengvt

उत्तर

9

जैसा कि @tonytonov ने thread का सुझाव दिया है, पारदर्शी क्षेत्रों को बहुभुज बंद करके हटाया जा सकता है।

# check x and y grid 
minValue<-sapply(volcano3d,min) 
maxValue<-sapply(volcano3d,max) 
arbitaryValue=min(volcano3d$z-10) 

test1<-data.frame(x=minValue[1]-1,y=minValue[2]:maxValue[2],z=arbitaryValue) 
test2<-data.frame(x=minValue[1]:maxValue[1],y=minValue[2]-1,z=arbitaryValue) 
test3<-data.frame(x=maxValue[1]+1,y=minValue[2]:maxValue[2],z=arbitaryValue) 
test4<-data.frame(x=minValue[1]:maxValue[1],y=maxValue[2]+1,z=arbitaryValue) 
test<-rbind(test1,test2,test3,test4) 

vol<-rbind(volcano3d,test) 

w <- ggplot(vol, aes(x, y, z = z)) 
w + stat_contour(geom="polygon", aes(fill=..level..)) # better 

# Doesn't work when trying to get rid of unwanted space 
w + stat_contour(geom="polygon", aes(fill=..level..))+ 
    scale_x_continuous(limits=c(min(volcano3d$x),max(volcano3d$x)), expand=c(0,0))+ # set x limits 
    scale_y_continuous(limits=c(min(volcano3d$y),max(volcano3d$y)), expand=c(0,0)) # set y limits 

# work here! 
w + stat_contour(geom="polygon", aes(fill=..level..))+ 
coord_cartesian(xlim=c(min(volcano3d$x),max(volcano3d$x)), 
       ylim=c(min(volcano3d$y),max(volcano3d$y))) 

enter image description here

समस्या यह ट्वीक के साथ बने रहे परीक्षण और त्रुटि से अलग तरीके खोजने है arbitaryValue निर्धारित करने के लिए।

[यहां से संपादित करें]

बस एक त्वरित अद्यतन दिखाने के लिए कि कैसे मैं हर डेटासेट के लिए लगता है कि बिना arbitaryValue का निर्धारण कर रहा हूँ।

BINS<-50 
BINWIDTH<-(diff(range(volcano3d$z))/BINS) # reference from ggplot2 code 
arbitaryValue=min(volcano3d$z)-BINWIDTH*1.5 

यह डेटासेट के लिए अच्छा काम करता है जो मैं अभी काम कर रहा हूं। सुनिश्चित नहीं है कि दूसरों के साथ लागू हो। साथ ही, ध्यान दें कि मैंने बीआईएनएस मूल्य को सेट करने के लिए यह आवश्यक है कि मुझे stat_contour में bins=BINS का उपयोग करना होगा।

+0

खुशी है कि मैं मदद कर सकता हूं। अच्छा समाधान, खासतौर से इन गंदे दिखने वाले कलाकृतियों के साथ जो अब चले गए हैं। पोस्ट करने का शुक्रिया! – tonytonov

0

@ चेंगवेट के उत्तर के लिए धन्यवाद। मुझे कभी-कभी इस तकनीक की ज़रूरत होती है, इसलिए मैंने एक सामान्यीकृत function() बनाया।

test_f <- function(df) { 
    colname <- names(df) 
    names(df) <- c("x", "y", "z") 
    Range <- as.data.frame(sapply(df, range)) 
    Dim <- as.data.frame(t(sapply(df, function(x) length(unique(x))))) 
    arb_z = Range$z[1] - diff(Range$z)/20 
    df2 <- rbind(df, 
       expand.grid(x = c(Range$x[1] - diff(Range$x)/20, Range$x[2] + diff(Range$x)/20), 
          y = seq(Range$y[1], Range$y[2], length = Dim$y), z = arb_z), 
       expand.grid(x = seq(Range$x[1], Range$x[2], length = Dim$x), 
          y = c(Range$y[1] - diff(Range$y)/20, Range$y[2] + diff(Range$y)/20), z = arb_z)) 
    g <- ggplot(df2, aes(x, y, z = z)) + labs(x = colname[1], y = colname[2], fill = colname[3]) + 
    stat_contour(geom="polygon", aes(fill=..level..)) + 
    coord_cartesian(xlim=c(Range$x), ylim=c(Range$y), expand = F) 
    return(g) 
} 

library(ggplot2); library(reshape2) 
volcano3d <- melt(volcano) 
names(volcano3d) <- c("xxx", "yyy", "zzz") 
test_f(volcano3d) + scale_fill_gradientn(colours = terrain.colors(10)) 

enter image description here