首次执行代码时颜色不正确

时间:2016-03-01 22:17:09

标签: r colors

我有一个代码可以在一个页面上绘制几个堆积的条形图。我指定了一个调色板,因此每个数据组在每个图表中都与相同的颜色相关联。我发现第一个图表中的颜色不正确,但在所有后续图表中都是正确的。如果我在同一个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计算机上运行时,会发生同样的事情。谁能解释我做错了什么?感谢。

2 个答案:

答案 0 :(得分:4)

我可以在当前版本的R和MacOS上重现。它似乎与对palette的(不必要的)调用有关。省略该呼叫可以解决问题。请注意,这实际上是?palette的预期结果所描述的内容:&#34;一个字符向量,提供 有效的调色板。 &#34; (强调补充)

在我看来,这似乎是palette的非功能性行为。它显然被设计成一个系统副作用,而不是返回一个当前有用的值,并且返回的值可能被认为是存储为&#34; oldpal&#34;或者其他一些。如帮助页面所述,调色板的使用应该改变(后续)数字到颜色的映射而不是设置,而不是返回颜色列表。

答案 1 :(得分:2)

您根本不需要使用palette()barplot不使用它,您只需指定颜色矢量即可。 Anway,关于解释:

如果像这样使用,那么palette()总是会滞后。存储x <- palette()会使当前调色板不是您刚刚指定的新调色板。 E.g:

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"