第三篇:R語言資料視覺化之條形圖

穆晨發表於2016-03-30

條形圖簡介

        資料視覺化中,最常用的圖非條形圖莫屬,它主要用來展示不同分類(橫軸)下某個數值型變數(縱軸)的取值。其中有兩點要重點注意:

        1. 條形圖橫軸上的資料是離散而非連續的。比如想展示兩商品的價格隨時間變化的走勢,則不能用條形圖,因為時間變數是連續的;

        2. 有時條形圖的值表示數值本身,但也有時是表示資料集中的頻數,不要引起混淆;

繪製基本條形圖

        本例選用測試資料集如下:

        繪製方法是首先呼叫ggplot函式選定資料集,並在aes引數中指明橫軸縱軸。然後呼叫條形圖函式geom_bar(stat="identity")便可繪製出基本條形圖。其中stat="identity"表明取用樣本點對應縱軸值,R語言實現程式碼如下:

# 基函式:aes繫結條形圖橫軸縱軸
ggplot(pg_mean, aes(x = group, y = weight)) +
  # 條形圖函式:stat表明取用樣本點對應縱軸值
  geom_bar(stat = "identity")

        執行效果:

        如果覺得灰色調比較難看,可以在條形圖函式中指定條形圖需要填充的顏色以及條形圖的邊框顏色。R語言實現程式碼如下:

# 基函式
ggplot(pg_mean, aes(x = group, y = weight)) +
  # 條形圖函式:fill設定條形圖填充色,colour設定條形圖邊界顏色
  geom_bar(stat = "identity", fill = "lightblue", colour = "black")

        執行效果:

        要強調的是如果橫軸對應資料非離散型,則須先將其轉為因子型別,否則結果會出現"空條"。

繪製(簇狀)條形圖

        本例選用測試集如下:

        繪製方法是在條形圖函式中設定fill引數,將資料集中表示分類的列賦值給它。R語言實現程式碼如下:

# 基函式:fill繫結"美學特徵"
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) + 
  # 條形圖函式:position設定條形圖型別為簇狀
  geom_bar(position = "dodge", stat = "identity")

        執行效果:

        可使用填充標尺函式scale_fill_brewer(palette)重新選擇配色,併為條狀加上黑色邊框。R語言實現程式碼如下:

# 基函式
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) +
  # 條形圖函式
  geom_bar(position = "dodge", stat = "identity", colour = "black") +
  # 調色標尺:設定調色盤為Pastel1
  scale_fill_brewer(palette="Pastel1")

        執行效果:

繪製頻數條形圖

        選用測試資料集如下:

        本例需要展示的是不同cut型別變數的樣本個數,要實現這點關鍵在於將stat引數設定為bin。之前將stat設定為identity是直接展示樣本點繫結的縱軸值,而設定為bin則會統計樣本點落到橫軸上各離散值的個數,這種情況下ggplot的aes引數只需繫結橫軸。R語言實現程式碼如下:

# 基函式
ggplot(diamonds, aes(x = cut)) +
  # 條形圖函式:stat引數預設為bin
  geom_bar(fill = "lightblue", colour = "black")

        執行效果:

        如果橫軸是連續變數,那麼這張圖就會變成直方圖。和將來要講的geom_histogram()函式效果是一樣的。

對正負條形圖分別著色

        本例測試資料集如下:

        如若現在需要繪製出資料集中Anomaly10y列隨時間的變化,同時視覺化方面要求做到小於0的用藍色表示,大於0的用紅色表示。

        對於這種情況可為資料集建立一個輔助列pos,該列為布林型別:TRUE表示Anomaly10y屬性大於0,而FALSE表示Anomaly10y列小於0。之後原資料集便多了一個pos列,表徵Anomaly10y列值大於等於/小於0。然後將這個欄位fiil到ggplot函式,再呼叫標尺函式對配色進行自定義並令guide=FALSE取消圖例。R語言實現程式碼如下:

# 增加輔助列,表示當前記錄Anomaly10y值大於/小於0。
csub$pos = csub$Anomaly10y >= 0

# 基函式
ggplot(csub, aes(x = Year, y = Anomaly10y, fill = pos)) +
  # 條形圖函式:position設定為"identity"是為了避免系統因繪製負值條形而引發的警告
  geom_bar(stat = "identity", position = "identity", colour = "black", size = 0.1) +
  # 手動調色標尺:大於0為紅,小於0為藍
  scale_fill_manual(values = c("#CCEEFF", "#FFDDDD"), guide = FALSE)

        執行效果:

繪製(百分比)堆積型條形圖

        本例測試資料集如下:

        使用ggplot2繪製條形圖時,只要不修改geom_bar()函式的position引數,所得條形圖便為堆積型。但堆積條形圖縱軸大都採用百分比形式,故在具體繪製前,需要對原資料集進行預處理,將縱軸資料轉換為分類百分比格式。

        本例要統計c39和c52兩個品種在不同日期下的重量對比,則需首先將各記錄的Weight值除以該記錄所在類目的Weight和,然後再將新的百分比列繫結到縱軸。R語言實現程式碼如下:

# 計算Weight列的分類百分比列
library(plyr)
ce = ddply(cabbage_exp, "Date", transform, percent_weight = Weight / sum(Weight) * 100)

# 基函式
ggplot(ce, aes(x = Date, y = percent_weight, fill = Cultivar)) +
  # 條形圖函式:未將position引數顯示設定為dodge,則繪製出的條形圖為堆積型
  geom_bar(stat = "identity", colour = "black") +
  # 調色標尺
  scale_fill_brewer(palette = "Pastel1")

        執行效果:

新增資料標籤

        本例測試資料集如下:

        為了給條形圖新增標籤顯示縱軸值,關鍵在於gemo_text()函式。使用這個函式時,需要在它的aes引數裡繫結各樣本的橫縱座標,以及要展示的值。

        下面首先來展示不同Cultivar分類在不同日期下Weight的對比簇狀條形圖。R語言實現程式碼如下:

# 基函式
ggplot(cabbage_exp, aes(x = Date, y = Weight, fill = Cultivar)) +
  # 條形圖函式
  geom_bar(stat = "identity", position = "dodge") +
  # 標籤函式:label設定展示標籤,vjust設定標籤偏移(正上負下),position設定各標籤的間距
  geom_text(aes(label = Weight), vjust = 1.5, colour = "white", position = position_dodge(.9), size = 5)

        執行結果:

        特別要注意的是geom_text()函式的position引數,繪製簇狀圖必須通過該引數指定各標籤的間距。否則一個簇的所有標籤都會堆到同一橫軸座標上,像下面這樣:

        如果要在堆積狀的條形圖上打標籤,則稍微複雜一點。因為要對每組資料進行求和及居中化處理,才能更好的展示出結果。其中關鍵點在於使用ggplot庫提供的ddply方法對分組變數進行彙總求和。具體R語言實現程式碼如下:

# 根據日期和性別對資料進行排序
ce = arrange(cabbage_exp, Date, Cultivar)
# 對不同Date分組內的資料進行累加求和
ce = ddply(ce, "Date", transform, label_y = cumsum(Weight) - 0.5*Weight)

# 基函式
ggplot(ce, aes(x = Date, y = Weight, fill = Cultivar)) +
  # 條形圖函式
  geom_bar(stat = "identity", colour = "black") +
  # 標籤函式:paste和format方法對標籤進行格式化
  geom_text(aes(y=label_y, label = paste(format(Weight, nsmall=2), "kg")), size = 4) +
  # 圖例函式:反轉圖例
  guides(fill = guide_legend(reverse = TRUE)) +
  # 調色標尺
  scale_fill_brewer(palette = "Pastel1")

        執行結果:

 

相關文章