2015-11-04 159 views
7

我正在嘗試製作甜甜圈圖表。如何在ggplot2中使用facet_grid製作甜甜圈圖表?

唯一的問題是他們出來找這樣的...

enter image description here

這裏是我的代碼

ggplot(
    diamonds, 
    aes(
    x = cut, 
    fill = color 
) 
) + 
    geom_bar(
    position = 'fill', 
    stat = 'bin' 
) + 
    scale_y_continuous(
    labels = percent_format() 
) + 
    facet_grid(clarity ~ cut) + 
    coord_polar(theta = 'y') 

如何打開我的圖表從怪異的餡餅成圈寬度相同?

+3

當然你可以製作一個可重現的例子,一個**最小**可重現的例子,少於85行代碼,不需要去某個網站下載SPSS文件?請使用具有相似結構的內置數據,或者快速模擬數據,或者使用'dput()'分享轉換後的數據 - 圖中的數據。 [見這裏](http:// stackoverflow。com/q/5963269/903061)瞭解更多關於做出好榜樣的提示。 – Gregor

+1

您可能希望查看'cut'函數,該函數比用於合併數值數據的嵌套'ifelse'語句好得多。同樣,%c(「a」,「b」,「c」)中的x%通常比「x ==」a「更好| x ==「b」| x ==「c」'。 – Gregor

+0

@Gregor謝謝,我忘記了股票數據集。更新了我的PNG和代碼 – Username

回答

8

這裏是一個不錯的,整潔的方式做到這一點:

library(ggplot2) 
library(data.table) 

# get data, calculate quantities of interest 
diam <- diamonds; setDT(diam) 
tabulated <- diam[, .N, by = .(cut, color, clarity)] 

# plot 
ggplot(tabulated, aes(x=2, y=N, fill=color)) + 
    geom_bar(position = 'fill', stat = 'identity') + 
    facet_grid(clarity ~ cut) + 
    xlim(0.5, 2.5) + 
    coord_polar(theta = 'y') + 
    labs(x=NULL, y=NULL) 

enter image description here

好了,怎麼工作的呢?讓我們看看你的代碼 - 你得到一些看起來像甜甜圈但有不同孔尺寸的情節。這是爲什麼? 「解開」數據並將輸出視爲條形圖很有幫助。(我要去子集只是兩行的方面進行簡單的。)

ggplot(subset(diamonds, as.numeric(clarity) <=2), 
     aes(x = cut, fill = color)) + 
    geom_bar(position = 'fill', stat = 'bin') + 
    facet_grid(clarity ~ cut) 

enter image description here

你有一個值映射到X是沒有做什麼有用的東西 - 它抵消酒吧,但是因爲你面對的是這個變量,每個情節只有一堆酒吧。

然而,當您添加coord_polar時,具有偏移X值的圖顯示爲甜甜圈,而具有x = 1的圖顯示爲餅圖這是因爲在coord_polar中,一系列堆疊的酒吧彼此嵌套,並且X = 1表示最裏面的'線圈'。

因此,解決方案首先將NOT映射到X的實際值。對於所有地塊,您可以使X = 1,但是您將得到所有餅,而不是甜甜圈。你想要的是一個堆疊的酒吧,在它的x軸之前有一些空間(這將是甜甜圈洞)。你可以通過複製數據來做到這一點,所以你有兩組堆積條,然後消隱第一個堆棧。這是我以前的答案,並且工作正常(請參閱編輯歷史瞭解詳情)。

哈德利建議通過twitter更簡單的解決方案,但我覺得有義務爲後代發佈:調整x限制以迫使x軸上的一些空白空間。

首先,計算出你需要的值(我使用data.table此):

library(data.table) 
diam <- diamonds; setDT(diam) 
tabulated <- diam[, .N, by = .(cut, color, clarity)] 

現在的情節,一些房間裏的​​棧酒吧

enter image description here

有前你想要的堆積條形圖,你所要做的就是添加coord_polar(如帖子頂部所做的那樣)。你可以玩x限制來調整你喜歡的甜甜圈/空洞比例。

+0

這正是我想要的!作爲R noob,我只是有一些問題。 1)直徑是怎麼回事[,.N,by =。(cut,color,clarity)]? paranthesis之前的逗號,'by ='和'.'是什麼意思? 2)在'plot_data [donutslice == 1,N:= 0]'中,'N:= 0'中的':'是什麼意思? – Username

+0

這就是'data.table'的術語。 – Axeman

+1

右鍵,data.table行話。第一件事情就是根據三個變量進行分組。你可以通過聚合(克拉〜切割+顏色+清晰度,數據=鑽石,FUN =長度)'(但是現在計數列被命名爲'克拉'而不是N)來獲得類似的基礎R中的東西。學習data.table,但是,這很好 – arvi1000