2015-11-27 7 views
5

के भीतर ढाल भरने के लिए कैसे करें यह काफी आसान होना चाहिए लेकिन मुझे अपना रास्ता नहीं मिल रहा है।ggplot: geom_polygon

tri_fill <- structure(
    list(x= c(0.75, 0.75, 2.25, 3.25), 
     y = c(40, 43, 43, 40)), 
    .Names = c("x", "y"), 
    row.names = c(NA, -4L), class = "data.frame",Integrated=NA, Related=NA) 

# install.packages("ggplot2", dependencies = TRUE) 
require(ggplot2) 


    ggplot(data=tri_fill,aes(x=x, y=y))+ 
     geom_polygon() + 
     scale_fill_gradient(limits=c(1, 4), low = "lightgrey", high = "red") 

क्या मैं चाहता हूँ x- अक्ष एक ढाल है, लेकिन इसके बाद के संस्करण के साथ मैं केवल एक ढाल और ठोस भरण साथ बहुभुज के साथ एक पौराणिक कथा मिलता है।

plot

+0

यह तुच्छ के रूप में बहुभुज केवल एक ही रंग भरने की जरूरत नहीं है। अंत में आपकी वांछित बहुभुज यह 'सरल' है, या आकार में अधिक जटिल है? – Heroka

उत्तर

5

यहाँ जब आप एक अपेक्षाकृत सरल बहुभुज है के लिए एक संभावित समाधान है। बहुभुज के बजाय, हम बहुत सारे लाइन-सेगमेंट बनाते हैं और उन्हें ढाल से रंग देते हैं। परिणाम इस प्रकार एक बहुभुज के साथ बहुभुज की तरह दिखाई देगा।

#create data for 'n'segments 
n_segs <- 1000 

#x and xend are sequences spanning the entire range of 'x' present in the data 
newpolydata <- data.frame(xstart=seq(min(tri_fill$x),max(tri_fill$x),length.out=n_segs)) 
newpolydata$xend <- newpolydata$xstart 


#y's are a little more complicated: when x is below changepoint, y equals max(y) 
#but when x is above the changepoint, the border of the polygon 
#follow a line according to the formula y= intercept + x*slope. 

#identify changepoint (very data/shape dependent) 
change_point <- max(tri_fill$x[which(tri_fill$y==max(tri_fill$y))]) 

#calculate slope and intercept 
slope <- (max(tri_fill$y)-min(tri_fill$y))/ (change_point - max(tri_fill$x)) 
intercept <- max(tri_fill$y) 

#all lines start at same y 
newpolydata$ystart <- min(tri_fill$y) 

#calculate y-end 
newpolydata$yend <- with(newpolydata, ifelse (xstart <= change_point, 
         max(tri_fill$y),intercept+ (xstart-change_point)*slope)) 

p2 <- ggplot(newpolydata) + 
    geom_segment(aes(x=xstart,xend=xend,y=ystart,yend=yend,color=xstart)) + 
    scale_color_gradient(limits=c(0.75, 4), low = "lightgrey", high = "red") 
p2 #note that I've changed the lower border of the gradient. 

enter image description here

संपादित करें: समाधान काम करता है ऊपर अगर एक ही एक ढाल के साथ एक बहुभुज इच्छाओं, तथापि, के रूप में टिप्पणी में बताया गया इस समस्याओं जब आप एक बात मैप करने के लिए भरने के लिए योजना बना रहे थे दे सकते हैं और एक और चीज रंग, क्योंकि प्रत्येक 'एईएस' का उपयोग केवल एक बार किया जा सकता है। इसलिए मैंने प्लॉट लाइनों के लिए समाधान को संशोधित नहीं किया है, लेकिन साजिश (बहुत पतली) बहुभुज के लिए जो एक भरने वाले एईएस हो सकता है।

#for each 'id'/polygon, four x-variables and four y-variable 
#for each polygon, we start at lower left corner, and go to upper left, upper right and then to lower right. 


n_polys <- 1000 
#identify changepoint (very data/shape dependent) 
change_point <- max(tri_fill$x[which(tri_fill$y==max(tri_fill$y))]) 

#calculate slope and intercept 
slope <- (max(tri_fill$y)-min(tri_fill$y))/ (change_point - max(tri_fill$x)) 
intercept <- max(tri_fill$y) 
#calculate sequence of borders: x, and accompanying lower and upper y coordinates 
x_seq <- seq(min(tri_fill$x),max(tri_fill$x),length.out=n_polys+1) 
y_max_seq <- ifelse(x_seq<=change_point, max(tri_fill$y), intercept + (x_seq - change_point)*slope) 
y_min_seq <- rep(min(tri_fill$y), n_polys+1) 

#create polygons/rectangles 
poly_list <- lapply(1:n_polys, function(p){ 
    res <- data.frame(x=rep(c(x_seq[p],x_seq[p+1]),each=2), 
        y = c(y_min_seq[p], y_max_seq[p:(p+1)], y_min_seq[p+1])) 
    res$fill_id <- x_seq[p] 
    res 
} 
) 

poly_data <- do.call(rbind, poly_list) 

#plot, allowing for both fill and color-aes 
p3 <- ggplot(tri_fill, aes(x=x,y=y))+ 
    geom_polygon(data=poly_data, aes(x=x,y=y, group=fill_id,fill=fill_id)) + 
    scale_fill_gradient(limits=c(0.75, 4), low = "lightgrey", high = "red") + 
    geom_point(aes(color=factor(y)),size=5) 
p3 

enter image description here

+0

धन्यवाद, हेरोका। मैं आपके ढाल को पुन: उत्पन्न कर सकता हूं। हालांकि, यह किसी अन्य साजिश के शीर्ष पर जाना चाहिए (कई और भूगोल और तराजू के साथ) जो इसे थोड़ा जटिल बनाता है .... – Almstrup

+0

क्या आप अपना उदाहरण अपडेट कर सकते हैं? यह किसी और चीज के शीर्ष पर क्यों नहीं जा सकता? – Heroka

+0

इसे किसी और चीज के तहत प्लॉट करना बेहतर हो सकता है, इसके बारे में सोचने के लिए आओ। – Heroka