【问题标题】:ggplot2 and RcolorBrewer with qualitative palettes of 2 values具有 2 个值的定性调色板的 ggplot2 和 RcolorBrewer
【发布时间】:2012-10-21 22:39:12
【问题描述】:

我使用 RColorBrewer 在 ggplot2 中设置颜色。我写了一个函数,并在同一张图表上叠加了 1 到 4 行。为了设置我使用的颜色:

scale_color_brewer(type="qual", palette="Set1")

根据手册“对于定性调色板,可用的不同值的最低数量始终为 3”,因此当行数等于 1 或 2 时,我会收到警告消息。有什么 claver 技巧可以应付吗?

罗伯特

@Ben Bolker:您是绝对正确的,在许多情况下必须提交可重现的示例,尽管这里没有必要。因为我的原始函数很长,所以我准备了一个简单的例子来说明问题。

library("datasets")
library("ggplot2")

set.seed(1367)
y <- log10(lynx)
y.estim <- y + rnorm(length(y), sd=0.2)
mydf <- data.frame(time=1:length(y), y, y.estim) 
mydf <- melt(mydf, id="time")

p <- ggplot(mydf, aes(x=time, y=value, color=variable))
p + geom_line() + geom_point(size=2) + theme_bw() +
   scale_color_brewer(type="qual", palette="Set1") #here is a problem

也许我可以直接指定颜色。我知道

library("RColorBrewer")
> brewer.pal(4, "Set1")
[1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3"

是否可以使用例如“#E41A1C”?

【问题讨论】:

  • 我在发帖前试过了——不行。
  • supressWarnings 仅在您包装对print 的显式调用时才有效,当brewer.pal 似乎已被评估时。
  • @user1160354:关于发布的一些快速想法——(1)一个可重现的例子很好(尽管在这种情况下可能不是完全必要的,因为问题很简单并且清楚); (2) 说出您已经尝试过的内容会有所帮助(例如“我已经尝试过suppressWarnings() 并且仍然收到警告”),只是为了节省其他人的时间..
  • 如果suppressWarnings不起作用,也许你可以试试old_opt &lt;- options(warn=-1); ggplot(...); options(old_opt)
  • @Ben:它有效,但每次我调用我的函数时,我都必须使用选项。

标签: r colors ggplot2


【解决方案1】:

正如@mnel 建议的那样,将语句包装在显式的print 语句中似乎可行:

suppressWarnings(print(p + geom_line() + geom_point(size=2) + theme_bw() +
     scale_color_brewer(type="qual", palette="Set1")))

会话信息:

> sessionInfo()
R Under development (unstable) (2012-10-14 r60940)
Platform: i686-pc-linux-gnu (32-bit)

[snip]

other attached packages:
[1] reshape2_1.2.1  ggplot2_0.9.2.1

编辑 - @mnel

您可以重新定义 print.ggplot 以自动执行此操作。不知道会不会导致 环境(parent.frame 问题)

print.ggplot <- function(..., warnings = getOption('ggplot_warning', default = TRUE)){
  if(warnings){
    ggplot2:::print.ggplot(...))} else { 
     suppressWarnings(ggplot2:::print.ggplot(...))
   }
  }

所以,如果你想关闭 ggplot 打印的所有警告,你只需设置

options(ggplot_warning = FALSE)

否则它应该正常运行。

【讨论】:

  • 谢谢你的详细介绍,因为我不明白如何使用打印。现在它工作正常。
  • 可以使用 scale_color_brewer(type="qual", palette="Set1") 代替:mycol &lt;- brewer.pal(4, "Set1"); scale_color_manual(values = mycol)
  • @Ben Bolker,添加了一个print 方法来实现,如果您认为不明智,请随时删除。
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多