Вопрос
Моему коллеге нужно составить 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))