【问题标题】:Using a color vector in a multipanel xyplot in r在 r 的多面板 xyplot 中使用颜色向量
【发布时间】:2012-03-21 22:05:23
【问题描述】:

给定 4 个等长向量 (x,y,z,q),其中 q 是一个字符向量,其颜色名称用作分组结构, 我运行 xyplot 命令:

xyplot(y~x|factor(z),pch=19,data=mydata,col=mydata$q)

一切正常,除了超过 z 的第一个因子水平,绘图不尊重颜色向量 q 的顺序,并且点是从颜色向量 q 中随机分配的颜色。如果我调用向量 q,我会看到 z 的每个级别的颜色名称都是正确排序的。

作为一个明显的例子: 数据框中的一行可能包含 (x,y,z,q) 的以下值:(13,25,march,"blue")

对于多面板 xyplot 中的“行进”图,该数据点将显示为不同的颜色,尽管颜色来自向量 q。

在使用带有 cex 分组结构的向量时,我遇到了类似的问题;第一个因子水平产生正确的图,但其他因子水平不会根据具有分组结构的向量而改变。

如果这个问题不清楚,我会很乐意修改它,直到它有意义为止。我确定其他人也有这个问题。

 str(cohort)



 $ date                 : Date, format: "2012-03-05" "2012-03-05" ...
 $ area                 : int  1111 3053 3555 3556 4228 6447 1111 ...
 $ score             : num  0.2282 0.1498 0.1823 0.0995 0.3083 ...
 $ color                 : chr  "purple" "blue" "brown" "violet" ...
 $ cex3                  : num  0.753 0.84 1.067 0.875 0.753 ...
 $ pch3                  : num  7 19 19 19 19 8 7 19 19 19 ...
$ time_spent            : int  0 0 0 0 0 0 1 1 1 1 ...

工作命令:

xyplot(score~time_spent|factor(date),groups=area,data=cohort,ylim=c(0,.6),panel=function(x,y,subscripts){panel.xyplot(x=x,y=y,subscripts=subscripts,pch=cohort[subscripts,"pch3"],col=cohort[subscripts,"color"],col.line="black",cex=cohort[subscripts,"cex3"])})

我想要在图例中使用文本的实际分组向量是群组$area... 字符向量队列$color 和向量队列$pch3 用作分组结构,以直观地表示图中的队列$area... 因此,我想要群组$color 和群组$pch3 的颜色代码/符号图例,但来自群组$area 的文本标签。

示例图例:紫点-“1111” 蓝点-“3053”等

想出了可行的解决方案:

 xyplot(score ~ time_spent | factor(date), groups = area, data = cohort,auto.key=list(columns=10,points=TRUE,title="area"),
    par.settings = list(superpose.symbol = list(col = sort(unique(cohort$color)),pch=sort(unique(cohort$pch3)))),
    panel = function(x, y, subscripts = subscripts, groups = groups) {
    panel.xyplot(x = x, y = y,
    subscripts = subscripts, groups = groups,col.line="black",type=c("p","g"))})

【问题讨论】:

  • 尝试只将唯一的颜色传递给col 并为groups 参数添加一些内容。

标签: r colors legend lattice


【解决方案1】:

可以通过更改 trellis.par.get()$superpose.symbol$col 的值来更改 panel.xyplot 在存在组时使用的默认颜色

这是数据,这次用不同颜色表示z的不同值。

d1 <- data.frame(x=c(NA, 13:20, NA), y = 25, z = c(rep('march', 5),
  rep("april", 5)), color = c(c(rep(c("red", "green"), 2), "red"),
  c(rep(c("blue", "yellow"), 2), "blue")), stringsAsFactors = FALSE)

这里是修改后的xyplot,其中par.settings的值是用户指定的,考虑到与groups参数对应的变量将变成一个因子并因此排序。

xyplot(y ~ x | factor(z), groups = color, data = d1,
   par.settings = list(superpose.symbol = list(col = sort(unique(d1$color)))),
   panel = function(x, y, subscripts = subscripts, groups = groups) {
       panel.xyplot(x = x, y = y,
         subscripts = subscripts, groups = groups)
   })

详情见?panel.superpose,因为这实际上是!isNULL(groups)时调用的函数

【讨论】:

    【解决方案2】:

    一个可行的示例可以确保我们处理您的所有案例。这个简单的例子可能无法测试更复杂的情况。编辑以涵盖@BenBarnes 提供的案例:

    d1 <- data.frame(x=c(NA, 13:20, NA), y = 25, z = c(rep('march', 5),
      rep("april", 5)), color = c(c(rep(c("red", "green"), 2), "red"),
      c(rep(c("blue", "yellow"), 2), "blue")), stringsAsFactors = FALSE)
    
    xyplot(y ~ x | factor(z), data = d1,
       panel = function(x, y, subscripts) {
           panel.xyplot(x = x, y = y,  
                        subscripts=subscripts, 
                        col = d1[subscripts, "color"])
       })
    

    【讨论】:

    • 谢谢您,这非常有效。我现在意识到掌握面板功能是自定义多面板图的关键。
    • 是的。掌握的一个重要部分是准确理解什么(尤其是名称)传递给这些面板功能。花时间研究?xyplot 中“Common Arguments”部分的panel 小节将产生好处。
    • 知道如何为该图创建图例,即为颜色分组创建文本标签(纽约的红点,波士顿的绿点等)?格的关键功能是残酷的。
    • 我使用我正在使用的命令添加了一个示例数据集。如上所述,我需要添加一个图例,其中颜色代码是指颜色向量,但文本标签来自另一个与颜色向量具有相同分组结构的向量。
    • 那不是真正的“数据集”,只是一个不完整的描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2011-12-18
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多