Использование цветового вектора в мультипанельном ксиплоте в r - PullRequest
1 голос
/ 22 марта 2012

Учитывая 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, март, "синий")

Для графика «марш» в многопанельном ксиплоте эта точка данных будет отображаться, но другим цветом, хотя и цветом по сравнению с вектором 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 используются в качестве группирующих структур для визуального представления области когорты $ на графиках ... таким образом, я хочу цветовой код / ​​легенду символа для когорты $ 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"))})

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Можно изменить цвета по умолчанию, используемые panel.xyplot при наличии групп, изменив значения для trellis.par.get()$superpose.symbol$col

Вот данные, на этот раз с разными цветами для разных значений 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)

0 голосов
/ 22 марта 2012

Рабочий пример гарантировал бы, что мы рассмотрим все ваши дела.Этот простой пример может не проверять более сложные ситуации.ПРАВКА, чтобы покрыть случай, предлагаемый @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"])
   })
...