2011-11-25 103 views
18

我想要繪製兩類數據的散點圖,一個繪製爲黃色,另一個繪製爲黃色一個用藍色表示,並且它們以綠色顯示在它們覆蓋的地方(或任何其他組合)。我發現,即使在透明度方面,情況也會更加困難。圖表的顏色受到空間中繪製的最後一個點是藍色還是黃色的影響。在R中,是否可以在一個繪圖中疊加2種顏色來製作第3種顏色(例如,使用加法或減法顏色混合)

例如用下面的代碼:

col1 <- rgb(red = .0, green = 0, blue = 0.8, alpha = 0.8) 
col2 <- rgb(red = .8, green = 0.8, blue = 0, alpha = 0.8) 
circle <- data.frame(x = c(0.2,0), 
        y = c(0,0), 
        col = c(col1, col2), 
        stringsAsFactors = F) 
orders <- c(1,2) 
plot(x = circle$x[orders], y = circle$y[orders], 
    col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "") 

根據您設定的矢量orders(其中規定了哪種方式輪兩個大點繪製)你會得到不同的結果: enter image description here

如果你交換你繪製兩個圓圈的順序,你會得到: enter image description here

無論哪種方式,我是螞蟻攪拌混合顏色以獲得綠色。有沒有辦法做到這一點?謝謝!

編輯 - 這兩個地塊是使用pdf設備。我也嘗試通過tikzDevice運行代碼,看看是否有效,但沒有。

+0

封裝'colorspace'具有如下功能:'mixcolor',將計算這樣的混合顏色的值:HTTP:/ /cran.r-project.org/web/packages/colorspace/colorspace.pdf。我不知道直接做這件事的方法 - 我解決這個問題的辦法是找到一種不同的數據可視化方式,例如, 'hexbin',使用'facets'或者計算每個點的淨分數。 – Andrie

+2

這不是一個真正的答案,但你可以看看http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending - 我假設不同的設備(PDF,tikzDevice,PNG等)都使用這種算法的變化來確定重疊的顏色,它可能會幫助你理解發生了什麼。 –

+1

特別是,我已經從這些公式中找出了一點,即α混合不是可交換的(事實上,正如文章指出的那樣,在某些情況下它也不是聯想性的,儘管這裏並不重要,因爲你只能合併兩種顏色) - 這就解釋了你的「訂單很重要」的結果。 –

回答

5

pdf()設備的幫助文件表示背景的默認設置是「透明的」,儘管這似乎不是它在實踐中的行爲,也許是因爲觀衆假定白色背景或者可能是因爲默認設置爲繪圖功能是「白色」。中間部分第一個變成白色和綠色相等的混合顏色,第二個第二個然後您將它添加到藍色。所以我猜測數學可以預測(0.5,0.5,(0.5 + 0.8)/ 2)的rgb值,然後將該混合物與覆蓋的顏色混合。我認爲白色+ col1以相等的比例添加到來自col2的使數學不可交換的值。無論如何,如果您可以強制背景爲「透明」,最終結果可能會有所不同。默認行爲更像混合塗料,而不是像閃亮的劇院燈。

PDF顏色模型在http://www.adobe.com/devnet/pdf/pdf_reference.html中描述,並將決定您對PDF設備的期望(但不一定是觀衆將提供什麼)。

我測試了我的理論,白色背景是問題(而且似乎已經推翻它)通過改變背景,以「黑」在希望不會有什麼附加價值分層RGB向量:

pdf("testfil12rev.pdf", bg="black") 
col1 <- rgb(red = .0, green = 0, blue = 1, alpha = 0.5) 
col2 <- rgb(red = 1, green = 0, blue = 0, alpha = 0.5) 
circle <- data.frame(x = c(0.2,0), 
        y = c(0,0), 
        col = c(col1, col2), 
        stringsAsFactors = F) 
orders <- c(1,2) 
plot(x = circle$x[orders], y = circle$y[orders], bg="black", 
     col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "") 

dev.off() 

顛倒「訂單」指示符不會導致黑色背景具有相同的混合顏色。

編輯:有是現有SO的規則發佈用於混合的顏色和阿爾法:How to calculate an RGB colour by specifying an alpha blending amount?

+0

感謝您的參考。我會嘗試使用透明設置。 – Andrew

+0

我嘗試了透明設置('png(「tmp.png」,bg =「transparent」)'),它確實改變了一些東西(並且可能會幫助任何探索去除因素),但結果仍然是不可交換的並且仍然不符合如上所述的天真預期(藍色+黃色=綠色)。 –

相關問題