Добавление текста на панели в решетчатой ​​гистограмме

Я пытаюсь добавить метки к столбцам в решетчатой ​​диаграмме с несколькими панелями. В итоге у меня слишком много меток (каждая метка на каждой панели).

Вот мой код:

library(lattice)
data(iris)

barchart(seq(1,50) ~ Petal.Width + Petal.Length | Species, data = iris, stack = TRUE,
         panel=function(x, y, ...) {
               panel.barchart(x, y, ...);
               ltext(x=iris$Petal.Width/2, y=y, labels=iris$Petal.Width, cex = 0.5);
               ltext(x=iris$Petal.Width + iris$Petal.Length/2, y=y, labels=iris$Petal.Width, cex = 0.5);
         }
)

Как бы я сделал это правильно?

Дополнительный вопрос:
Помимо того, что он не работает должным образом, я думаю, что мой код не слишком эффективен (особенно seq(1,50) и Petal.Width + Petal.Length). Есть ли способ лучше?

Заранее спасибо!!!


person speendo    schedule 02.11.2011    source источник
comment
Основной вопрос здесь заключается в том, как поместить метки на гистограмму с накоплением, используя lattice. Ответ на этот вопрос здесь: stackoverflow.com/q/3220702/602276   -  person Andrie    schedule 02.11.2011
comment
хм, может быть, я не понимаю, но моя проблема не в том, как разместить метки на гистограмме с накоплением, а в том, как сделать так, чтобы метки соответствовали панели, к которой они принадлежат. На этот вопрос действительно ответили в теме, на которую вы ссылаетесь?   -  person speendo    schedule 02.11.2011
comment
Да, это действительно та же проблема. Чтобы доказать это, я предоставил ответ ниже, используя сильно упрощенную версию функции панели (но основная идея та же — вычислить совокупную сумму x для каждого y). ХТН.   -  person Andrie    schedule 02.11.2011


Ответы (1)


Основной вопрос здесь заключается в том, как добавить метки к столбчатой ​​диаграмме с накоплением в lattice. Ответ приведен в этом вопросе, но, поскольку связанный ответ не имеет нескольких панелей, я воссоздаю более простой ответ, используя база R здесь:

Вы должны изменить функцию панели следующим образом:

  • Вычислить кумулятивную сумму значений x для каждого значения y
  • Это классическая проблема разделения, применения, объединения. Для этого вы можете использовать plyr (как в связанном ответе) или, как я иллюстрирую, split и do.call:

xx <- do.call(c, unname(lapply(split(x, y), function(t)cumsum(t)-t/2)))

Код:

barchart( 1:10 ~ Petal.Width + Petal.Length | Species, 
          data = iris[c(1:10, 51:60, 101:110), ], 
          stack = TRUE,
          panel=function(x, y, ...) {
            panel.barchart(x, y, ...)
            xx <- do.call(c, unname(lapply(split(x, y), function(t)cumsum(t)-t/2)))
            ltext(xx, y=y, labels=x)
         }
)

введите здесь описание изображения

person Andrie    schedule 02.11.2011
comment
Спасибо! но здесь метка Petal.Length находится не посередине полосы Petal.Length, а посередине всей полосы. - person speendo; 02.11.2011
comment
ОК, я неправильно скопировал решение в связанном ответе. Теперь это должно быть исправлено. - person Andrie; 02.11.2011
comment
Я отредактировал ваше решение для другого рабочего варианта, но ваше еще лучше :) - person speendo; 02.11.2011