條形圖簡介
數據可視化中,最常用的圖非條形圖莫屬,它主要用來展示不同分類(橫軸)下某個數值型變量(縱軸)的取值。其中有兩點要重點注意:
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")
運行結果:

