我的一位同事需要绘制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")

注意:重要的是,动物> =熊> =北极熊。此外,她不在城里,所以我不能只从她那里得到原始数据(如果有任何大文件的话)。

有帮助吗?

解决方案

不分解的方法是在 geom_bar 中使用 stat =" identity"

使数据框包含数字值而不是字符串有助于启动:

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)

如果您有多个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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top