geom_bar()函數不僅可以繪制條形圖,還能繪制餅圖,跟繪制條形圖的區別是坐標系不同,繪制餅圖使用的坐標系polar,並且設置theta="y":
coord_polar(theta = "y", start = 0, direction = 1, clip = "on")
條形圖的高度通常表示兩種情況之一:每組中的數據的個數,或數據框中列的值,高度表示的含義是由geom_bar()函數的參數stat決定的,stat在geom_bar()函數中有兩個有效值:count和identity。默認情況下,stat="count",這意味着每個條的高度等於每組中的數據的個數,並且,它與映射到y的圖形屬性不相容,所以,當設置stat="count"時,不能設置映射函數aes()中的y參數。如果設置stat="identity",這意味着條形的高度表示數據數據的值,而數據的值是由aes()函數的y參數決定的,就是說,把值映射到y,所以,當設置stat="identity"時,必須設置映射函數中的y參數,把它映射到數值變量。
geom_bar()函數的定義是:
geom_bar(mapping = NULL, data = NULL, stat = "count",fill=NULL, position="stack")
參數注釋:
- stat:設置統計方法,有效值是count(默認值) 和 identity,其中,count表示條形的高度是變量的數量,identity表示條形的高度是變量的值;
- position:位置調整,有效值是stack、dodge和fill,默認值是stack(堆疊),是指兩個條形圖堆疊擺放,dodge是指兩個條形圖並行擺放,fill是指按照比例來堆疊條形圖,每個條形圖的高度都相等,但是高度表示的數量是不盡相同的。
- fill:條形圖的填充色
關於stat參數,有三個有效值,分別是count、identity和bin:
- count是對離散的數據進行計數,計數的結果用一個特殊的變量..count.. 來表示,
- bin是對連續變量進行統計轉換,轉換的結果使用變量..density..來表示
- 而identity是直接引用數據集中變量的值
position參數也可以由兩個函數來控制,參數vjust和widht是相對值:
position_stack(vjust = 1, reverse = FALSE) position_dodge(width = NULL) position_fill(vjust = 1, reverse = FALSE)
本文使用vcd包中的Arthritis數據集來演示如何創建條形圖。
head(Arthritis) ID Treatment Sex Age Improved 1 57 Treated Male 27 Some 2 46 Treated Male 29 None 3 77 Treated Male 30 None 4 17 Treated Male 32 Marked 5 36 Treated Male 46 Marked 6 23 Treated Male 58 Marked
其中變量Improved和Sex是因子類型,ID和Age是數值類型。
一,繪制一個條形圖
繪制一個餅圖之前,需要繪制一個條形圖,該條形圖有多個分組,這就需要設置映射的x參數映射為一個常量因子,fill映射為分類因子:
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')
在條形圖之后,添加一個圖層,把條形圖轉換為餅圖:
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')+ coord_polar("y", start=0)
二,調整餅圖的圖形屬性
調整餅圖的填充色,文本,使餅圖看起來更加美觀。
1,調整餅圖的填充色
使用scale_fill_manual()函數對餅圖填充不同的顏色
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
2,調整餅圖的標度
blank_theme <- theme_minimal()+ theme( axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), panel.border = element_blank(), panel.grid=element_blank(), axis.ticks = element_blank(), plot.title=element_text(size=14, face="bold") ) ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack',size=5)+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+ blank_theme + geom_text(stat="count",aes(label = scales::percent(..count../100)), size=4, position=position_stack(vjust = 0.5))
也可以使用stat="identity" 方式來繪制餅圖,繪制的圖形是相同的:
mytable <- with(Arthritis,table(Improved)) df <- as.data.frame(mytable) blank_theme <- theme_minimal()+ theme( axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), panel.border = element_blank(), panel.grid=element_blank(), axis.ticks = element_blank(), plot.title=element_text(size=14, face="bold") ) ggplot(data=df, mapping=aes(x="Improved",y=Freq,fill=Improved))+ geom_bar(stat="identity",width=0.5,position='stack',size=5)+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+ blank_theme + geom_text(stat="identity",aes(y=Freq, label = scales::percent(Freq/100)), size=4, position=position_stack(vjust = 0.5))
參考文檔:
ggplot2 pie chart : Quick start guide - R software and data visualization
ggplot, facet, piechart: placing text in the middle of pie chart slices