3

我的一位同事需要绘制 101 个靶心图。这不是她的主意。我没有让她的奴隶在 Excel 中离开,或者上帝知道这些东西是由什么制成的,我提出在 R 中做它们;将条形图映射到极坐标以形成靶心在ggplot2.

但是,我遇到了一个问题:数据已经聚合,因此 Hadley 的示例我不起作用。我可以将计数扩展为一个因素来做到这一点,但我觉得有更好的方法 - 某种方式告诉 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")

注意:重要的是 Animals >= Bears >= Polar Bears。此外,她不在城里,所以我不能只从她那里得到原始数据(无论如何,如果有一个大文件的话)。

4

3 回答 3

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() 
于 2009-09-11T16:05:19.120 回答
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))
于 2012-12-24T22:42:14.380 回答
1

在不分解的情况下执行此操作的方法是使用stat="identity"in 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()
于 2012-12-24T22:30:06.877 回答