यहाँ @ Andrie के जवाब पर बिल्डिंग एक और अधिक (लेकिन पूरी तरह से नहीं) सामान्य समाधान है कि ऊपर या ज्यादातर मामलों में एक दिया रेखा से नीचे छायांकन संभालती है।
मैंने इस विधि का उपयोग नहीं किया है कि @Andrie ने here का संदर्भ दिया है क्योंकि जब आप किनारों के पास बिंदु जोड़ते हैं तो ggplot
की साजिश रेंज को स्वचालित रूप से विस्तारित करने की प्रवृत्ति के साथ समस्याएं आईं। इसके बजाए, यह आवश्यकतानुसार Inf
और -Inf
का उपयोग करके बहुभुज बिंदु मैन्युअल रूप से बनाता है। कुछ नोट:
अंक के बाद से ggplot
भूखंडों आदेश अंक दिखाई कि में बहुभुज, डेटा फ्रेम में 'सही' के क्रम में होना है। तो बहुभुज के शिखर प्राप्त करने के लिए पर्याप्त नहीं है, उन्हें आदेश दिया जाना चाहिए (या तो घड़ी की दिशा या विपरीत दिशा में)।
यह समाधान मानता है कि जिस लाइन को आप साजिश कर रहे हैं वह प्लॉट रेंज का विस्तार करने के लिए ggplot
का कारण नहीं बनता है। आप मेरे उदाहरण में देखेंगे कि मैं डेटा में दो बिंदुओं को यादृच्छिक रूप से चुनकर और उनके माध्यम से रेखा खींचकर आकर्षित करने के लिए एक रेखा चुनता हूं। यदि आप अपने शेष बिंदुओं से बहुत दूर एक रेखा खींचने का प्रयास करते हैं, तो ggplot
स्वचालित रूप से साजिश श्रेणियों को बदल देगा, और भविष्यवाणी करना मुश्किल हो जाएगा कि वे क्या होंगे।
सबसे पहले, यहाँ समारोह है कि बहुभुज डेटा फ्रेम बनाता है:
buildPoly <- function(xr, yr, slope = 1, intercept = 0, above = TRUE){
#Assumes ggplot default of expand = c(0.05,0)
xrTru <- xr + 0.05*diff(xr)*c(-1,1)
yrTru <- yr + 0.05*diff(yr)*c(-1,1)
#Find where the line crosses the plot edges
yCross <- (yrTru - intercept)/slope
xCross <- (slope * xrTru) + intercept
#Build polygon by cases
if (above & (slope >= 0)){
rs <- data.frame(x=-Inf,y=Inf)
if (xCross[1] < yrTru[1]){
rs <- rbind(rs,c(-Inf,-Inf),c(yCross[1],-Inf))
}
else{
rs <- rbind(rs,c(-Inf,xCross[1]))
}
if (xCross[2] < yrTru[2]){
rs <- rbind(rs,c(Inf,xCross[2]),c(Inf,Inf))
}
else{
rs <- rbind(rs,c(yCross[2],Inf))
}
}
if (!above & (slope >= 0)){
rs <- data.frame(x= Inf,y= -Inf)
if (xCross[1] > yrTru[1]){
rs <- rbind(rs,c(-Inf,-Inf),c(-Inf,xCross[1]))
}
else{
rs <- rbind(rs,c(yCross[1],-Inf))
}
if (xCross[2] > yrTru[2]){
rs <- rbind(rs,c(yCross[2],Inf),c(Inf,Inf))
}
else{
rs <- rbind(rs,c(Inf,xCross[2]))
}
}
if (above & (slope < 0)){
rs <- data.frame(x=Inf,y=Inf)
if (xCross[1] < yrTru[2]){
rs <- rbind(rs,c(-Inf,Inf),c(-Inf,xCross[1]))
}
else{
rs <- rbind(rs,c(yCross[2],Inf))
}
if (xCross[2] < yrTru[1]){
rs <- rbind(rs,c(yCross[1],-Inf),c(Inf,-Inf))
}
else{
rs <- rbind(rs,c(Inf,xCross[2]))
}
}
if (!above & (slope < 0)){
rs <- data.frame(x= -Inf,y= -Inf)
if (xCross[1] > yrTru[2]){
rs <- rbind(rs,c(-Inf,Inf),c(yCross[2],Inf))
}
else{
rs <- rbind(rs,c(-Inf,xCross[1]))
}
if (xCross[2] > yrTru[1]){
rs <- rbind(rs,c(Inf,xCross[2]),c(Inf,-Inf))
}
else{
rs <- rbind(rs,c(yCross[1],-Inf))
}
}
return(rs)
}
यह आपके डेटा के x और y पर्वतमाला (range()
के रूप में) की उम्मीद है, ढाल, और अवरोधन लाइन की आप साजिश जा रहे हैं, और क्या आप लाइन के ऊपर या नीचे छाया करना चाहते हैं। यहां दिए गए कोड का उपयोग निम्नलिखित चार उदाहरणों को उत्पन्न करने के लिए किया गया है:
#Generate some data
dat <- data.frame(x=runif(10),y=runif(10))
#Select two of the points to define the line
pts <- dat[sample(1:nrow(dat),size=2,replace=FALSE),]
#Slope and intercept of line through those points
sl <- diff(pts$y)/diff(pts$x)
int <- pts$y[1] - (sl*pts$x[1])
#Build the polygon
datPoly <- buildPoly(range(dat$x),range(dat$y),
slope=sl,intercept=int,above=FALSE)
#Make the plot
p <- ggplot(dat,aes(x=x,y=y)) +
geom_point() +
geom_abline(slope=sl,intercept = int) +
geom_polygon(data=datPoly,aes(x=x,y=y),alpha=0.2,fill="blue")
print(p)
और यहां परिणामों के कुछ उदाहरण दिए गए हैं। आप किसी भी कीड़े मिल जाए, जाहिर है, मुझे इतना पता है कि मैं इस उत्तर को अपडेट कर सकते हैं ...
संपादित
अपडेट किया गया ओपी के उदाहरण डेटा का उपयोग कर समाधान चित्रण करते हैं:
set.seed(1)
dat <- data.frame(x=runif(6,-2,2),y=runif(6,-2,2),
var1=rep(c("A","B"),3),var2=rep(c("C","D"),3))
#Create polygon data frame
df_poly <- buildPoly(range(dat$x),range(dat$y))
ggplot(data=dat,aes(x,y)) +
facet_wrap(~var2) +
geom_abline(slope=1,intercept=0,lwd=0.5)+
geom_point(aes(colour=var1),size=3) +
scale_color_manual(values=c("red","blue"))+
geom_polygon(data=df_poly,aes(x,y),fill="blue",alpha=0.2)
और इस निम्नलिखित उत्पादन का उत्पादन:
रंग अंक और भरने बहुभुज दो अलग सौंदर्यशास्त्र द्वारा नियंत्रित (रंग और भरने) और चाहिए नहीं कर रहे हैं संघर्ष, तो मुझे संदेह है कि आप वहां कुछ गलत कर रहे हैं। मुझे कुछ और मदद करने में खुशी होगी, लेकिन मैं उस डेटा के विशिष्ट प्रतिलिपि उदाहरण के बिना नहीं कर सकता जिसे आप साजिश करने की कोशिश कर रहे हैं ... – joran
हो गया। मुझे संदेह है कि यह मेरी अपरिचितता से उत्पन्न होता है कि ggplot2 ऐसी चीजों को कैसे संभालता है। आपकी मदद के लिए फिर से धन्यवाद, मैं इसकी बहुत सराहना करता हूं। – jslefche
'रंग = var1' को' geom_point' पर ले जाएं: 'geom_point (aes (color = var1), ...)'। साथ ही, यदि आप प्रत्येक पहलू में अलग-अलग भरे बहुभुज चाहते हैं, तो सावधान रहें कि आपको प्रत्येक पहलू के लिए एक अलग डेटा फ्रेम बनाना होगा और उन्हें 'var2' कारक समेत एक डेटा फ्रेम में जोड़ना होगा, इसलिए' ggplot' जानता है कि कौन सा प्रत्येक पहलू पर लागू होते हैं। – joran