2016-03-01 78 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

相关问题