【问题标题】:Colors incorrect on first execution of code首次执行代码时颜色不正确
【发布时间】:2016-06-14 13:36:43
【问题描述】:

我有一个代码可以在一页上绘制多个堆叠条形图。我指定了一个调色板,因此每个数据组都与每个图表中的相同颜色相关联。我发现第一个图表中的颜色不正确,但在所有后续图表中都是正确的。如果我在同一个 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 后第一次运行代码时,我得到以下信息:

当我再次运行代码时,我得到了正确的颜色:

我不明白为什么会这样。就好像我指定的调色板在第一次运行代码时没有被使用。我应该注意,虽然我在 MacOSX 10.8.5 下使用 R 版本 3.2.1 开发了 R 代码,但是当代码在同事的 Windows 计算机上运行时会发生同样的事情。谁能解释我做错了什么?谢谢。

【问题讨论】:

    标签: r colors


    【解决方案1】:

    我可以在当前版本的 R 和 MacOS 上重现。这似乎与对palette 的(不必要的)调用有关。省略该调用可以解决问题。请注意,这实际上是 ?palette 所描述的预期结果,它说:“一个字符向量给出了有效的调色板。”(添加了重点)

    在我看来,这确实是palette 的一种相当无功能的行为。它显然被设计为充当系统副作用而不是返回当前有用的值,并且返回的值大概应该存储为“oldpal”或类似的东西。正如帮助页面上所讨论的,调色板的使用应该改变(后续)数字到颜色的映射,而不是设置,而不是返回颜色列表。

    【讨论】:

    • 谢谢。我在调色板文档中错过了这一点。
    【解决方案2】:

    您根本不需要使用palette()barplot 不使用它,你可以只指定一个颜色向量。安维,继续解释:

    像这样使用palette() 总是会有延迟。存储x &lt;- 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"
    

    【讨论】:

    • 谢谢!我显然误解了如何使用调色板,并认为它类似于我使用过的其他语言中的颜色处理例程。如果我理解正确,我可以在我的 barplot 调用中指定 "col=c("color1","color2","color3","color4")" 。这当然值得知道(我对 R 比较陌生)。
    • @Fleetboat - 是的,只需执行zoocol &lt;- c("color1","color2"),然后将其放入barplot(..., col=zoocol)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多