我的一位同事需要绘制101张牛眼图。这不是她的想法。而不是让她的奴隶离开Excel或上帝知道是什么制作这些东西,我提议在R中做它们;将条形图映射到极坐标以使牛眼变得轻而易举ggplot2
。
我遇到了一个问题,但是:数据已经汇总了,所以Hadley的例子here对我不起作用。我可以将计数扩展到一个因素来做到这一点,但我觉得有更好的方法 - 告诉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")
注意:重要的是,动物> =熊> =北极熊。此外,她不在城里,所以我不能从她那里得到原始数据(如果有任何大文件的话)。
答案 0 :(得分:3)
虽然我们正在等待更好的答案,但我认为我应该发布您提到的(次优)解决方案。 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()
答案 1 :(得分:2)
您可以使用inverse.rle
重新创建数据
dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)
如果您有多个Zoos(行),可以尝试
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))
答案 2 :(得分:1)
不分解的方法是在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()