Вопрос

Моему коллеге нужно составить 101 диаграмму "яблочко". Это не ее идея. Вместо того, чтобы ее рабыня ушла в Excel или Бог знает, что делает эти вещи, я предложил сделать их в R; преобразование гистограммы в полярные координаты, чтобы создать яблочко, - очень просто в ggplot2 .

Однако я столкнулся с проблемой: данные уже агрегированы, поэтому пример Хэдли здесь не работает для меня. Я мог бы расширить счет в фактор, чтобы сделать это, но я чувствую, что есть лучший способ - какой-то способ рассказать geom_bar, как читать данные.

Данные выглядят так:

    Zoo Animals Bears Polar Bears
1 Omaha      50    10           3

Я буду составлять сюжет для каждого зоопарка, но этой частью я могу управлять.

и вот его dput :

structure(list(Zoo = "Omaha", Animals = "50", Bears = "10", `Polar Bears` = "3"), .Names = c("Zoo", 
"Animals", "Bears", "Polar Bears"), row.names = c(NA, -1L), class = "data.frame")

Примечание. Важно отметить, что животные > = медведи > = белые медведи. Кроме того, ее нет в городе, поэтому я не могу просто получить от нее необработанные данные (если вообще когда-либо был большой файл).

Это было полезно?

Решение

Чтобы сделать это без разукрупнения, используйте stat = & identity " в geom_bar .

Для начала полезно иметь фрейм данных, содержащий числовые значения, а не символьные строки:

dat <- data.frame(Zoo = "Omaha",
               Animals = 50, Bears = 10, `Polar Bears` = 3)

Нам нужно reshape2 :: melt для правильной организации данных:

library(reshape2)
d3 <- melt(dat,id.var=1)

Теперь создайте сюжет (идентичный другому ответу):

library(ggplot2)
ggplot(d3, aes(x = variable, y = value)) +
    geom_bar(width = 1, colour = "black",stat="identity") +
    coord_polar()

Другие советы

Пока мы ждем лучшего ответа, я решил опубликовать (неоптимальное) решение, которое вы упомянули. dat - это структура, включенная в ваш вопрос.

d <- data.frame(animal=factor(sapply(list(dat[2:length(dat)]),
                function(x) rep(names(x),x))))
cxc <- ggplot(d, aes(x = animal)) +  geom_bar(width = 1, colour = "black") 
cxc + coord_polar() 

Вы можете использовать inverse.rle для воссоздания данных,

dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)

Если у вас есть несколько зоопарков (рядов), вы можете попробовать

l = plyr::dlply(dat, "Zoo", function(z)  
      structure(list(lengths = unlist(z[-1]), values = names(z)[-1]), class = "rle"))

reshape2::melt(llply(l, inverse.rle))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top