2012-08-02 18 views
20

भरें मैं इस तरह तीन ट्रिपलॉट (त्रिकोण प्लॉट) में तीन तरह के रंग ढाल (हीटमैप) कैसे भर सकता हूं।तीन-तरफा रंग ढाल आर

plot(NA,NA,xlim=c(0,1),ylim=c(0,sqrt(3)/2),asp=1,bty="n",axes=F,xlab="",ylab="") 
segments(0,0,0.5,sqrt(3)/2) 
segments(0.5,sqrt(3)/2,1,0) 
segments(1,0,0,0) 

enter image description here

रंग समानांतर triplot में चलाने चाहिए।

उत्तर

22

यहाँ एक तरह से यह करने के लिए है - यह एक हैक का एक सा टुकड़ा द्वारा ढाल टुकड़ा प्लॉट करने के लिए अंक का उपयोग कर:

plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="") 
segments(0,0,0.5,sqrt(3)/2) 
segments(0.5,sqrt(3)/2,1,0) 
segments(1,0,0,0) 
# sm - how smooth the plot is. Higher values will plot very slowly 
sm <- 500 
for (y in 1:(sm*sqrt(3)/2)/sm){ 
    for (x in (y*sm/sqrt(3)):(sm-y*sm/sqrt(3))/sm){ 
     ## distance from base line: 
     d.red = y 
     ## distance from line y = sqrt(3) * x: 
     d.green = abs(sqrt(3) * x - y)/sqrt(3 + 1) 
     ## distance from line y = - sqrt(3) * x + sqrt(3): 
     d.blue = abs(- sqrt(3) * x - y + sqrt(3))/sqrt(3 + 1) 
     points(x, y, col=rgb(1-d.red,1 - d.green,1 - d.blue), pch=19) 
    } 
} 

और उत्पादन:

enter image description here

किया आप डेटा का प्रतिनिधित्व करने के लिए इन ग्रेडियेंट्स का उपयोग करना चाहते हैं? यदि ऐसा है, तो ऐसा करने के लिए d.red, d.green, और d.blue को बदलना संभव हो सकता है - मैंने अभी तक ऐसा कुछ भी परीक्षण नहीं किया है। मुझे आशा है कि यह कुछ हद तक सहायक होगा, लेकिन colorRamp का उपयोग करके एक उचित समाधान, उदाहरण के लिए, शायद बेहतर होगा।

EDIT: बैपटिस्ट के सुझाव के अनुसार, इस प्रकार आप वैक्टर में जानकारी संग्रहीत करेंगे और इसे एक साथ साजिश करेंगे। यह (उदाहरण के लिए, विशेष रूप से 500 करने के लिए sm सेट के साथ) तेजी से काफी है:

plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="") 
sm <- 500 
x <- do.call(c, sapply(1:(sm*sqrt(3)/2)/sm, 
         function(i) (i*sm/sqrt(3)):(sm-i*sm/sqrt(3))/sm)) 
y <- do.call(c, sapply(1:(sm*sqrt(3)/2)/sm, 
         function(i) rep(i, length((i*sm/sqrt(3)):(sm-i*sm/sqrt(3)))))) 
d.red = y 
d.green = abs(sqrt(3) * x - y)/sqrt(3 + 1) 
d.blue = abs(- sqrt(3) * x - y + sqrt(3))/sqrt(3 + 1) 
points(x, y, col=rgb(1-d.red,1 - d.green,1 - d.blue), pch=19) 
+0

महान समाधान के लिए धन्यवाद ... वहाँ अधिक गहरे रंग (लाल, हरा और नीला) में शुरू करने के लिए जिस तरह से इतना है कि ढाल देखो अधिक तेज – jon

+1

मैं अलग की एक जोड़ी की कोशिश की है है ढाल को तेज बनाने के लिए चीजें, लेकिन मुझे ऐसा कोई रास्ता नहीं मिला जो ग्राफ के क्षेत्रों को बहुत अंधेरे और सुस्त नहीं बनाता है। क्या आप कोनों में लाल, हरे और नीले रंग से शुरू हो रहे हैं? यदि आप हैं, तो कोड की अंतिम पंक्ति को 'अंक (x, y, col = rgb (d.red, d.green, d।नीला), पीएच = 1 9) '- उन तीन रंगों के लिए ग्रेडियेंट तेज लगते हैं क्योंकि वे अपने मूल पर अन्य रंगों के साथ इतना मिश्रण नहीं कर रहे हैं। – Edward

+2

आप प्रत्येक बिंदु को अलग-अलग क्यों प्लॉट करते हैं? आप रंगों का एक वेक्टर स्टोर कर सकते हैं और एक ही समय में सभी बिंदुओं को साजिश कर सकते हैं। – baptiste

14

यहाँ एक रास्टराज़ पृष्ठभूमि छवि के साथ एक समाधान है। sharpnesstricol फ़ंक्शन का पैरामीटर नियंत्रित करता है कि रंग कितने तेज़ हो जाते हैं। इसे 1 पर सेट करने से आपको एडवर्ड के रंग मिलते हैं और इसे 2 पर सेट करने से आपको नीचे दिए गए रंग मिलते हैं।

# Coordinates of the triangle 
tri <- rbind(sin(0:2*2/3*pi), cos(0:2*2/3*pi)) 

# Function for calculating the color of a set of points `pt` 
# in relation to the triangle 
tricol <- function(pt, sharpness=2){ 
    require(splancs) 
    RGB <- sapply(1:3, function(i){ 
     a <- sweep(pt, 2, tri[,i]) 
     b <- apply(tri[,-i], 1, mean) - tri[,i] 
     sharpness*((a %*% b)/sum(b^2))-sharpness+1 
    }) 
    RGB[-inpip(pt,t(tri)),] <- 1 # Color points outside the triangle white 
    do.call(rgb, unname(as.data.frame(pmin(pmax(RGB, 0), 1)))) 
} 

# Plot 
res <- 1000       # Resolution 
xi <- seq(-1, 1, length=res)  # Axis points 
yi <- seq(-.8, 1.2, length=res) 
x <- xi[1] + cumsum(diff(xi))  # Midpoints between axis points 
y <- yi[1] + cumsum(diff(yi)) 
xy <- matrix(1:(length(x)*length(y)), length(x)) 
image(xi, yi, xy, col=tricol(as.matrix(expand.grid(x,y))), useRaster=TRUE) 
lines(tri[1,c(1:3,1)], tri[2,c(1:3,1)], type="l") 

क्या tricol() करता है एक रंग (लाल, हरा, नीला) के साथ प्रत्येक कोने i का प्रतिनिधित्व है। यह कोने से वैक्टरों के a को pt में बिंदुओं और कोने से b को विपरीत किनारे के केंद्र में एक मैट्रिक्स a परिभाषित करता है। इसके बाद ab पर प्रोजेक्ट करता है और सापेक्ष दूरी = रंग तीव्रता प्राप्त करने के लिए स्केल (और थोड़ा सा रंग समायोजित करने के लिए sharpness के साथ एक छोटा हैक लागू करता है)। जब इस सरल बीजगणित जैसी समस्याओं की बात आती है तो जादू कर सकते हैं।

आपको एलियासिंग के कारण किनारों के चारों ओर एक शोर शोर मिलता है, लेकिन आप संभवतः उसमें ट्विक कर सकते हैं, या त्रिकोण में थोड़ा व्यापक रेखा खींच सकते हैं। ताकि आप इसे उपयोग करने के लिए ::: ऑपरेटर का उपयोग करने के लिए है Gradient triangle

+0

मैं एक समान विचार पर विचार कर रहा था, लेकिन तीन डिस्क (आर, जी, बी) त्रिज्या के पक्ष त्रिज्या के पक्ष में, और एक अल्फा चैनल 0 से लुप्त हो गया। मेरा मानना ​​है कि आर स्वचालित रूप से रंग मिश्रण कर देगा। – baptiste

+0

क्रमबद्ध करें। यह दिखाएगा कि किस सर्कल को दूसरे के ऊपर खींचा गया था। मान लें कि लाल शीर्ष पर है, फिर हरा, फिर नीला। बीच में आपके पास 50% लाल होगा, लेकिन केवल 25% हरा (रीमेजिंग 50% का 50%) और 12.5% ​​नीला होगा। मैंने देखा है कि हर वेन-आरेख बहुत अधिक है, और एक बार मैंने इसे देखा, मैं इसे ध्यान में नहीं रोक सकता। [उदाहरण के लिए इन्हें लें] (http://stackoverflow.com/questions/8713994/venn-diagram-in-r-proportional-and-color-shading-possible-semi-transparency-sup)। – Backlin

1

यहाँ ... fillTriangle समारोह निर्यात नहीं किया है एक कार्यान्वयन मैं phonR पैकेज के लिए साइन काम किया है। उदाहरण दोनों पीएच-आधारित और रास्टर-आधारित दृष्टिकोण दिखाता है।

# set up color scale 
colmap <- plotrix::color.scale(x=0:100, cs1=c(0, 180), cs2=100, cs3=c(25, 100), 
           alpha=1, color.spec='hcl') 
# specify triangle vertices and corner colors 
vertices <- matrix(c(1, 4, 2, 1, 3, 4, length(colmap), 1, 30), nrow=3, 
        dimnames=list(NULL, c("x", "y", "z"))) 
# edit next line to change density/resolution 
xseq <- yseq <- seq(0, 5, 0.01) 
grid <- expand.grid(x=xseq, y=yseq) 
grid$z <- NA 
grid.indices <- splancs::inpip(grid, vertices[,1:2], bound=FALSE) 
grid$z[grid.indices] <- with(grid[grid.indices,], 
          phonR:::fillTriangle(x, y, vertices)) 
# plot it 
par(mfrow=c(1,2)) 
# using pch 
with(grid, plot(x, y, col=colmap[round(z)], pch=16)) 
# overplot original triangle 
segments(vertices[,1], vertices[,2], vertices[c(2,3,1),1], 
     vertices[c(2,3,1),2]) 
points(vertices[,1:2], pch=21, bg=colmap[vertices[,3]], cex=2) 

# using raster 
image(xseq, yseq, matrix(grid$z, nrow=length(xseq)), col=colmap) 
# overplot original triangle 
segments(vertices[,1], vertices[,2], vertices[c(2,3,1),1], 
     vertices[c(2,3,1),2]) 
points(vertices[,1:2], pch=21, bg=colmap[vertices[,3]], cex=2) 

example graphs of gradient triangle filling

संबंधित मुद्दे