【问题标题】:Named character vectors and par() in R plotsR图中的命名字符向量和par()
【发布时间】:2012-10-18 22:27:12
【问题描述】:

我正在尝试使用命名字符向量来保存自定义调色板,所以我可以说,例如调色板['red'] 而不是到处重复“#dc322f”。

但是,我似乎无法将该向量的元素用作par() 的参数(尽管它可以在其他地方使用)。

这是一个例子。它将创建一个带有绿点的图形,但 par() 调用失败并且背景为白色。请注意,我可以plot() 调用中使用调色板向量设置参数:

> palette <- c('#002b36','#dc322f','#859900')
> names(palette) <- c('black','red','green')
> par(bg=palette['red'])                                                                                                                                
Warning message:
In par(bg = palette["red"]) : "bg.red" is not a graphical parameter
> plot(1:10,1:10,col=palette['green'])
> # (White graph with green dots appears) 

但是,当我使用命名的 numeric 向量时,它可以工作:

> palette <- 1:3                                                                                                                                          
> names(palette) <- c('black','red','green')                                                                                                              
> par(bg=palette['red'])                                                                                                                             
> # (no error here -- it worked.)
> plot(1:10,1:10,col=palette['green'])
> # (Red graph with green dots appears)

我对 R 相当陌生,似乎我可能遗漏了一些基本的东西。知道这里发生了什么吗?

【问题讨论】:

    标签: r plot par


    【解决方案1】:

    使用unname,以便传递给par 的项目只是定义颜色的字符向量,而不是命名元素

    palette <- c('#002b36','#dc322f','#859900')
    names(palette) <- c('black','red','green')
    par(bg=unname(palette['red'])) 
    plot(1:10,1:10,col=palette['green'])
    

    为什么?

    par内,如果所有参数都是字符向量那么

    if (all(unlist(lapply(args, is.character)))) 
                args <- as.list(unlist(args))
    

    如果 args 是命名字符向量,as.list(unlist(args)) 的工作方式是

    args <- list(bg = palette['red'])
    as.list(unlist(args))
    $bg.red
    [1] "#dc322f"
    

    bg.red 不是有效的par

    如果这条线是这样的

    setNames(as.list(unlist(args, use.names = F)), names(args))
    

    那么它在某些情况下可能会起作用(尽管如果arg 的任何命名元素的长度>1,则不会)

    【讨论】:

    • 一个很好的答案,一个很好的解释,一个很好的问题,一个很好的解释。很好。
    • 谢谢!这是完全有道理的,而且很有效,而且,正如我所怀疑的,答案确实提供了对基本面的很好的洞察。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多