這裏是一個不錯的,整潔的方式做到這一點:
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)
好了,怎麼工作的呢?讓我們看看你的代碼 - 你得到一些看起來像甜甜圈但有不同孔尺寸的情節。這是爲什麼? 「解開」數據並將輸出視爲條形圖很有幫助。(我要去子集只是兩行的方面進行簡單的。)
ggplot(subset(diamonds, as.numeric(clarity) <=2),
aes(x = cut, fill = color)) +
geom_bar(position = 'fill', stat = 'bin') +
facet_grid(clarity ~ cut)
你有一個值映射到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)]
現在的情節,一些房間裏的棧酒吧
有前你想要的堆積條形圖,你所要做的就是添加coord_polar
(如帖子頂部所做的那樣)。你可以玩x限制來調整你喜歡的甜甜圈/空洞比例。
當然你可以製作一個可重現的例子,一個**最小**可重現的例子,少於85行代碼,不需要去某個網站下載SPSS文件?請使用具有相似結構的內置數據,或者快速模擬數據,或者使用'dput()'分享轉換後的數據 - 圖中的數據。 [見這裏](http:// stackoverflow。com/q/5963269/903061)瞭解更多關於做出好榜樣的提示。 – Gregor
您可能希望查看'cut'函數,該函數比用於合併數值數據的嵌套'ifelse'語句好得多。同樣,%c(「a」,「b」,「c」)中的x%通常比「x ==」a「更好| x ==「b」| x ==「c」'。 – Gregor
@Gregor謝謝,我忘記了股票數據集。更新了我的PNG和代碼 – Username