2009-09-11 115 views
2

我的同事需要繪製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") 

注:這是顯著動物> =熊> =北極熊。此外,她不在城裏,所以我不能從她那裏得到原始數據(無論如何,如果有一個大文件的話)。

回答

1

這樣做沒有分列的方式是在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() 
+0

這對我來說似乎是最直觀的答案 - 我最近經常在我的工作中做這類事,儘管當時我很難記得我是否理解了熔化數據的概念。感謝您花時間回答這個老問題! – 2012-12-26 18:54:27

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() 
+0

謝謝,克里斯!這非常接近我放在一起的東西,除了我已經明確說明了每個組的rep()。 sapply()對我來說仍然很神奇。 – 2009-09-11 19:31:24

2

您可以使用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)) 
+0

這是一些非常聰明的數據糾纏 - +1 – 2012-12-26 18:47:52