在r中的多面板xyplot中使用颜色矢量

时间:2012-03-21 22:05:23

标签: r colors legend lattice

给出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”)

对于multipanel xyplot中的“​​march”图,此数据点将显示为不同的颜色,尽管是矢量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"])})

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

示例图例:紫点 - “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"))})

2 个答案:

答案 0 :(得分:0)

一个工作示例可以确保我们解决您的所有案件。这个简单的例子可能无法测试更复杂的情况。编辑以涵盖@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"])
   })

答案 1 :(得分:0)

通过更改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)

时调用的函数