R繪圖 第八篇:繪制餅圖(ggplot2)


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

Polar coordinates

ggplot, facet, piechart: placing text in the middle of pie chart slices


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM