2016-03-01 87 views
3

我有一個代碼在一個頁面上繪製了幾個堆積的條形圖。我指定了一個調色板,因此每個數據組在每個圖表中都與相同的顏色相關聯。我發現第一個圖表中的顏色不正確,但在所有後續圖表中都是正確的。如果我在同一個R會話中重新運行代碼,所有圖表都具有正確的顏色。但是,如果我退出R並運行代碼,則第一個圖表會再次出現錯誤的顏色。第一次執行代碼時顏色不正確

我的代碼非常複雜,所以我放在一起說明問題的簡單示例。同樣,在開始新的R會話後第一次運行代碼時,顏色不正確。如果代碼在同一個R會話中重新運行,則它們是正確的。

# Data vector for bar plot, 
# 
dvec  <- c( 0,  0, 0, 0,  0,  0, 
        0,  0, 0, 0,  0,  0, 
        0,  0, 0, 0,  0,  0, 
       1.73,  0, 0, 0,  0,  0, 
       4.81,  0, 0, 0.03, 0.03,  0, 
       2.77,  0, 0, 0.42, 1.04,  0, 
       2.84, 0.02, 0, 2.25, 4.21, 0.02, 
       1.32, 0.54, 0.01, 3.44, 10.49, 0.01, 
       0.13, 1.63, 0.02, 4.42, 17.70, 0.03, 
       0.08, 2.49, 0.03, 8.64, 31.07, 0.02, 
        0, 3.08, 0.05, 9.04, 50.22, 0.01) 

# matrix to pass to barplot, 12 columns, 6 rows 

smat <- matrix(dvec,nrow=6)      

# use this color palette and plot the barchart 

zoopal <- palette(c("magenta","red","darkred","yellow","cyan","blue")) 

barplot(smat,space=0,col=zoopal,axes=FALSE,axisnames=FALSE, 
        xaxs="i",yaxs="i",ann=FALSE)  

我第一次開始後R運行代碼,我得到這個: Incorrect colors

當我再次運行該代碼,我得到這個用正確的顏色:

Correct colors

我不明白爲什麼會發生這種情況。就好像我指定的調色板在代碼運行的第一次沒有被使用。我應該注意到,儘管我在MacOSX 10.8.5下使用R 3.2.1版開發了R代碼,但是當代碼在同事的Windows計算機上運行時,也會發生同樣的情況。任何人都可以解釋我做錯了什麼?謝謝。

回答

4

我可以在當前版本的R和MacOS上重現。這似乎與palette的(不必要的)呼叫有關。忽略該通話可以解決問題。需要注意的是實際上是什麼被描述爲從?palette預期的結果它說:「一個特徵向量給調色板這實際上是在」(強調)

這似乎對我來說是一個相當不功能行爲爲palette。它顯然被設計成系統副作用而不是返回一個當前有用的值,並且返回的值大概應該被存儲爲「oldpal」或其他類型。正如在幫助頁面上討論的那樣,使用調色板應該將(後續)數字映射爲顏色而不是設置,而不是返回顏色列表。

+0

謝謝。我錯過了調色板文檔。 – Fleetboat

2

根本不需要使用palette()barplot不使用它,你可以指定一個顏色矢量。 Anway,解釋如下:

這樣使用時總會有一個延遲通過palette()。存儲x <- palette()給出當前調色板不是您剛纔指定的新調色板。例如:

oldcols <- c("red","green") 
newcols <- c("yellow","blue") 
palette(oldcols) 
palette() 
#[1] "red" "green" 

runone <- palette(newcols) 
runone 
#[1] "red" "green" 
palette() 
#[1] "yellow" "blue" 

runtwo <- palette(oldcols) 
runtwo 
#[1] "yellow" "blue" 
palette() 
#[1] "red" "green" 
+0

謝謝!我清楚地誤解了如何使用調色板,並認爲它與我用過的其他語言的顏色處理例程類似。如果我理解正確,我可以在我的barplot調用中指定「col = c(」color1「,」color2「,」color3「,」color4「)。這當然值得了解(我對R相對來說比較陌生)。 – Fleetboat

+0

@Fleetboat - 是的,只要做'zoocol < - c(「color1」,「color2」)',然後在'barplot(...,col = zoocol) – thelatemail

相關問題