2012-08-02 23 views
5

दिखाने के लिए 2 या अधिक रंग पैलेट कैसे मिश्रण कर सकते हैं मैं एक साजिश बनाने की कोशिश कर रहा हूं जहां रंग कई मानों के संयोजन का प्रतिनिधित्व करता है। नीचे दिए गए उदाहरण में, मैं एक्स-समन्वय से जुड़े लाल के लिए बढ़ते मूल्यों को लागू कर रहा हूं और वाई-समन्वय से जुड़े नीले रंग के मूल्यों को बढ़ा रहा हूं। जब एक्स = 1 और y = 10, रंग के मिश्रण "सफेद" और "नीले", क्रमशः, नीले रंग से हल्का छाया देता हैसंयुक्त रंग मान

#required function 'val2col' from: http://www.menugget.blogspot.de/2011/09/converting-values-to-color-levels.html 

val2col<-function(z, zlim, col = heat.colors(12), breaks){ 
if(!missing(breaks)){ 
    if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} 
} 
if(missing(breaks) & !missing(zlim)){ 
    zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions 
    zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
} 
if(missing(breaks) & missing(zlim)){ 
    zlim <- range(z, na.rm=TRUE) 
    zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions 
    zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
} 
colorlevels <- col[((as.vector(z)-breaks[1])/(range(breaks)[2]-range(breaks)[1]))*(length(breaks)-1)+1] # assign colors to heights for each point 
colorlevels 
} 


#data 
x <- seq(100) 
y <- seq(100) 
grd <- expand.grid(x=x,y=y) 

#assign colors to grd levels 
pal1 <- colorRampPalette(c("white", rgb(1,0,0)), space = "rgb") 
col1 <- val2col(x, col=pal1(10)) 
pal2 <- colorRampPalette(c("white", rgb(0,0,1)), space = "rgb") 
col2 <- val2col(y, col=pal2(10)) 
col3 <- NA*seq(nrow(grd)) 
for(i in seq(nrow(grd))){ 
    xpos <- grd$x[i] 
    ypos <- grd$y[i] 
    coltmp <- (col2rgb(col1[xpos])/2) + (col2rgb(col2[ypos])/2) 
    col3[i] <- rgb(coltmp[1], coltmp[2], coltmp[3], maxColorValue = 255) 
} 

    #plot 
png("2_color_scales.png", width=6, height=4, units="in", res=200) 
layout(matrix(c(1,2,3), nrow=1, ncol=3), widths=c(4,1,1), heights=4, respect=T) 
par(mar=c(4,4,2,2)) 
plot(grd,col=col3, pch=19) 
par(mar=c(4,0,2,5)) 
image(x=1, y=x, z=t(as.matrix(x)), col=pal1(10), xaxt="n", yaxt="n", xlab="", ylab="") 
box() 
axis(4) 
mtext("x", side=4, line=3, cex=0.7) 
par(mar=c(4,0,2,5)) 
image(x=1, y=y, z=t(as.matrix(y)), col=pal2(10), xaxt="n", yaxt="n", xlab="", ylab="") 
box() 
axis(4) 
mtext("y", side=4, line=3, cex=0.7) 
dev.off() 

enter image description here

नतीजा यह है कि में तकनीकी रूप से सही है। हालांकि, मैं इस स्थिति को वाई रंगीन बार के सबसे गहरे नीले रंग के रूप में "नीला" के रूप में देखना चाहूंगा। मुझे कल्पना है कि रंगीन सफेद की बजाय कम मूल्यों के लिए पारदर्शिता का उपयोग करने की आवश्यकता होगी। क्या किसी के पास सुझाव है कि यह कैसे पूरा किया जा सकता है? अपनी पारदर्शिता समेत दो रंग जोड़ना, मेरे बाहर है ... मैंने सोचा कि कोई मिश्रण मिश्रण में भारोत्तोलन मूल्य का उपयोग करने में सक्षम हो सकता है?

आपकी मदद के लिए धन्यवाद।

उत्तर

6

चूंकि मैं ggplot से अधिक परिचित हूं, इसलिए मैं ggplot का उपयोग करके एक समाधान दिखाऊंगा। इसका साइड लाभ है कि, ggplot कोड बहुत आसान है, इसलिए हम आर कोड के बजाए रंग प्रबंधन के विषय पर चर्चा पर ध्यान केंद्रित कर सकते हैं।

  1. expand.grid का उपयोग कर एक डेटा फ्रेम dat लाल और नीले रंग इनपुट मानों के ग्रिड से युक्त बनाने के लिए द्वारा प्रारंभ।
  2. रंग मिश्रण बनाने के लिए rgb() फ़ंक्शन का उपयोग करें, और dat$mix
  3. प्लॉट को असाइन करें।

कोड:

dat <- expand.grid(blue=seq(0, 100, by=10), red=seq(0, 100, by=10)) 
dat <- within(dat, mix <- rgb(green=0, red=red, blue=blue, maxColorValue=100)) 

library(ggplot2) 
ggplot(dat, aes(x=red, y=blue)) + 
    geom_tile(aes(fill=mix), color="white") + 
    scale_fill_identity() 

enter image description here


आप देखेंगे कि रंग पैमाने आप क्या सुझाव से अलग है, लेकिन संभवतः अधिक सहज ज्ञान युक्त।

प्रकाश मिश्रण करते समय, किसी भी रंग की अनुपस्थिति काले रंग की पैदावार होती है, और सभी रंगों की उपस्थिति सफेद होती है।

यह स्पष्ट रूप से साजिश द्वारा इंगित किया गया है, जिसे मैं व्याख्या करने के लिए सहज महसूस करता हूं।

+0

+1 धन्यवाद आंद्रे - यह काफी सहज है। बहुत कॉम्पैक्ट कोड भी। क्या आपके लिए ऐसी साजिश में संबंधित रंग स्केल जोड़ने के लिए आसान होगा? मुझे लगता है कि मैंने सोचा था कि एक घटिया सायन-मैजेंटा-पीला प्रकार का रंग मॉडल (यानी जब कोई रंग लागू नहीं होता है तो सफेद बराबर होता है) एक योजक आरजीबी रंग मॉडल की तुलना में प्रिंटिंग के लिए बेहतर हो सकता है। –

+0

@Marcinthebox मेरा संदेह यह है कि दो तत्वों को एक रंगीन पैमाने में मिलाकर किसी भी प्रयास को समझने के लिए मुश्किल हो जाएगा। आप साजिश करने की क्या कोशिश कर रहे हैं? क्या आप इसके बजाय कुछ अन्य सौंदर्य का उपयोग कर सकते हैं, उदा। दूसरा तत्व इंगित करने के लिए आकार या आकार? – Andrie

+0

मैं सतही जल (यानी स्थानिक रूप से) में तीन पोषक तत्व सांद्रता की प्रस्तुति में ऐसी साजिश का उपयोग करने के बारे में सोच रहा था। मैं उम्मीद कर रहा था कि ऐसा नक्शा इन स्थानिक पैटर्न को देखने का एक सहज तरीका हो सकता है। मैंने 3 पोषक तत्व सांद्रता के लिए रंग ढाल दिखाते हुए एक त्रि-साजिश होने के लिए संबंधित रंग कुंजी की कल्पना की। –