)
Data Science For Beginners 第 9 課使用 R 與 ggplot2 可視化數量Minnesota 鳥類數據集實戰【免費下載鏈接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!項目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners本篇文章基于開源課程倉庫 Data-Science-For-Beginners 中第 9 課Visualizing Quantities的 R 語言版本關聯文檔為 translations/bg/3-Data-Visualization/R/09-visualization-quantities/README.md與英文原版 3-Data-Visualization/R/09-visualization-quantities/README.md 內容一致編寫。課程圍繞數量quantity這一核心概念使用清洗后的 Minnesota 鳥類數據集手把手教你用 R 生態中最流行的可視化包ggplot2完成折線圖、散點圖與柱狀圖的實戰繪制。學完本篇你將掌握數據 美學 幾何的聲明式繪圖范式、離群值的識別與過濾、基于dplyr的分組聚合可視化以及如何用坐標翻轉、數據疊加等技巧講出清晰的數據故事。一、課程背景用 R 探索 Minnesota 的鳥類數據本課使用的數據集是倉庫根目錄下的 data/birds.csv它收錄了 Minnesota 地區鳥類的多種屬性名稱、學名、分類Category、目Order、科Family、屬Genus、保護狀態ConservationStatus以及最小/最大體長MinLength/MaxLength、最小/最大體重MinBodyMass/MaxBodyMass、最小/最大翼展MinWingspan/MaxWingspan等數值字段。該文件共包含 444 行表頭 443 條鳥類記錄每個字段之間用逗號分隔首列帶有 UTF-8 BOM 標記因此在 R 中讀取時需要使用fileEncodingUTF-8-BOM參數。打開 R 控制臺導入數據集并查看前 5 行birds - read.csv(../../data/birds.csv, fileEncodingUTF-8-BOM) head(birds)前幾行數據是文本與數字的混合NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165注意原始 CSV 的表頭列名為Name、MaxWingspan等R 在讀取時會自動把列名規范化為MaxWingspan這種大小寫形式與文檔中的代碼一致。在后續所有圖表中這些列名都作為aes()的美學映射依據。二、ggplot2 與圖形語法繪圖 數據 美學 幾何ggplot2是 R 中創建簡單與復雜圖表都極為出色的庫它是一套基于圖形語法The Grammar of Graphics的聲明式繪圖系統。所謂聲明式是指你只負責描述用什么數據、怎么映射、畫什么形狀而把坐標刻度、圖例、分面等底層細節交給ggplot2處理。圖形語法把一張圖拆解為語義組件如比例尺 scale、圖層 layer用少量代碼即可完成單變量或多變量的可視化這正是它成為 R 中最流行可視化包的原因。用一句話記憶核心公式? 圖形Plot 數據Data 美學Aesthetics 幾何Geometry數據要使用的數據集即data參數美學要研究的變量在aes()中指定 x、y 變量幾何圖形的類型如折線圖geom_line()、柱狀圖geom_bar()、散點圖geom_point()。根據數據形態與你想要講述的故事選擇最合適的幾何類型分析趨勢折線圖line、柱狀圖column比較數值大小柱狀圖、柱形圖、餅圖、散點圖展示部分與整體的關系餅圖pie展示數據分布散點圖、柱狀圖展示變量間關系折線圖、散點圖、氣泡圖。在本課隨后的章節中你會看到同一份birds數據在不同幾何對象下呈現出完全不同的信息層次折線圖暴露離群值、散點圖為標注騰出空間、柱狀圖用于分組計數與比較。這也是先想清楚要回答什么問題再選擇幾何對象這一方法論的核心體現。三、實戰一用折線圖觀察鳥類最大翼展我們先從最基礎的折線圖開始可視化這些鳥類的最大翼展MaxWingspan。首先安裝并加載ggplot2install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()這里install.packages(ggplot2)完成安裝library(ggplot2)將其導入當前工作環境。ggplot()函數接收三個關鍵屬性數據集data、x 軸變量Name、y 軸變量MaxWingspan。因為 x 軸是離散的鳥類名稱而非連續數值需要額外傳入group 1告訴 ggplot 把所有點連成一條折線geom_line()則負責把映射好的數據繪制為折線圖。圖一出現就暴露出一個明顯的離群值outlier某個點的翼展超過了 2000 厘米——那可是 20 多米難道 Minnesota 上空有翼龍在翱翔雖然你也可以在 Excel 里快速排序找出這些疑似錄入錯誤的數據但本課的目標是訓練直接在圖中發現問題的可視化思維。3.1 添加坐標軸標簽并旋轉刻度文字為了讓折線圖更易讀我們給 x 軸加上哪種鳥的說明并把刻度文字旋轉 45 度避免重疊ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line() theme(axis.text.x element_text(angle 45, hjust 1)) xlab(Birds) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)theme(axis.text.x element_text(angle 45, hjust 1))在theme中指定 x 軸刻度文字旋轉 45 度hjust 1讓文字右對齊錨點xlab()/ylab()分別設置 x、y 軸標簽ggtitle()為圖形命名。即便旋轉了標簽鳥類種類太多依然難以辨認。這時我們換一種策略只標注離群值并把標簽畫在圖表內部。散點圖比折線圖留有更多標注空間ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_point() geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank()) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)說明原文檔代碼片段中theme(...)之后的ylab()、ggtitle()需要以連接此處已調整為可復制運行的完整寫法。這段代碼做了三件事geom_point()把每個數據點繪制為散點geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )))只為MaxWingspan 500的鳥添加名稱標簽其余為空字符串hjust 0, vjust 0控制標簽相對數據點的對齊方向theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank())隱藏 x 軸標題、刻度文字與刻度線大幅減少視覺干擾。四、過濾數據剔除離群值得到干凈數據集散點圖揭開了離群值的真面目**Bald Eagle白頭海雕**和 **Prairie Falcon草原隼**雖然確實是大型猛禽但它們的最大翼展被錯誤地多敲了一個 0——你不太可能在 Minnesota 遇到翼展 25 米的白頭海雕。正確做法是創建一個不含這兩個異常點的新數據框birds_filtered - subset(birds, MaxWingspan 500) ggplot(data birds_filtered, aes(x Name, y MaxWingspan, group 1)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.text.x element_blank(), axis.ticks.x element_blank())subset(birds, MaxWingspan 500)生成了新數據框birds_filtered隨后在其上重新繪制散點圖。注意此時MaxWingspan 500的標注條件雖然保留了但由于數據已過濾不會再產生任何離群標簽。過濾掉異常值后數據整體更連貫、更易于理解——這正是數據準備data preparation在可視化環節的價值體現。得到至少翼展維度上是干凈的數據集后我們可以進一步回答關于數量的一系列問題這個數據集中有多少種鳥類分類Category各自數量是多少 有多少鳥是滅絕、瀕危、稀有或常見的 按照林奈分類法各屬Genus和各目Order分別有多少種這些問題正是數量可視化的切入點而回答它們最合適的幾何對象就是柱狀圖。五、實戰二柱狀圖探索鳥類分類數量柱狀圖非常適合展示分組數據。為了繪制更復雜的聚合柱狀圖先安裝并加載數據處理與可視化所需的一批包install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse)其中dplyr負責數據操縱與分組lubridate處理時間類數據本課中主要用于加載依賴tidyverse則聚合了數據處理與可視化的整套生態。接下來按鳥類Category分組對多個數值列求均值再通過gather()把寬表轉成長表最后用填充色區分類別繪制堆疊柱狀圖birds_filtered %% group_by(Category) %% summarise( n n(), MinLength mean(MinLength), MaxLength mean(MaxLength), MinBodyMass mean(MinBodyMass), MaxBodyMass mean(MaxBodyMass), MinWingspan mean(MinWingspan), MaxWingspan mean(MaxWingspan) ) %% gather(key, value, -c(Category, n)) %% ggplot(aes(x Category, y value, group key, fill key)) geom_bar(stat identity) scale_fill_manual(values c(#D62728, #FF7F0E, #8C564B, #2CA02C, #1F77B4, #9467BD)) xlab(Category) ggtitle(Birds of Minnesota)關鍵點拆解group_by(Category)按鳥類分類分組summarise(n n(), ...)在每組內統計樣本數n并計算六個數值列MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan的均值gather(key, value, -c(Category, n))將六個指標列折疊為key指標名與value數值兩列使每個指標都能作為獨立的分組填充維度geom_bar(stat identity)表示直接使用y提供的數值高度而非統計頻數scale_fill_manual()為六類指標手動指定了顏色#D62728紅、#FF7F0E橙、#8C564B棕、#2CA02C綠、#1F77B4藍、#9467BD紫。這張堆疊柱狀圖信息量很大但正因堆疊了太多未分組的數據而難以閱讀。更好的做法是只選擇你真正關心的維度——比如先看每種分類下的鳥類數量。由于分類很多可以把圖表旋轉為橫向并調整高度以容納全部數據birds_count - dplyr::count(birds_filtered, Category, sort TRUE) birds_count$Category - factor(birds_count$Category, levels birds_count$Category) ggplot(birds_count, aes(Category, n)) geom_bar(stat identity) coord_flip()dplyr::count(birds_filtered, Category, sort TRUE)統計Category列的每個唯一值出現次數并按數量降序排序生成新數據框birds_countfactor(birds_count$Category, levels birds_count$Category)把分類列轉換為**因子factor**并固定其水平順序確保柱狀圖按已排序的順序繪制geom_bar(stat identity)用n列作為柱高coord_flip()翻轉坐標系把豎直柱狀圖變為水平條形圖更利于閱讀較長的分類名稱。一眼就能看出Minnesota 地區數量最多的鳥類分類是Ducks/Geese/Waterfowl鴨/鵝/水禽。這并不意外——Minnesota 被稱為萬湖之地land of 10,000 lakes水禽豐富實屬理所當然。你也可以在這個數據集上嘗試其他維度的計數比如按Order或ConservationStatus計數看看有沒有出乎意料的結果。六、實戰三分組數據比較與數據疊加柱狀圖的另一個常見用途是比較不同分組的數值。通過創建新的坐標軸可以對分組數據做各種比較。例如比較每種分類下鳥類的最大體長MaxLengthbirds_grouped - birds_filtered %% group_by(Category) %% summarise( MaxLength max(MaxLength, na.rm T), MinLength max(MinLength, na.rm T) ) %% arrange(Category) ggplot(birds_grouped, aes(Category, MaxLength)) geom_bar(stat identity) coord_flip()這段代碼先把birds_filtered按Category分組用max(..., na.rm T)分別求每組內MaxLength與MinLength的最大值na.rm T表示計算時忽略缺失值再用arrange(Category)排序最后繪制水平柱狀圖。結果符合生物學直覺蜂鳥Hummingbirds的最大體長在所有分類中最短而鵜鶘Pelicans和鵝Geese則長得多。當數據能給出符合邏輯的結論時說明可視化在正確傳遞信息。更進階的玩法是在同一張圖中疊加兩層數據。下面把每種鳥類分類的MinLength與MaxLength同時繪制出來ggplot(data birds_grouped, aes(x Category)) geom_bar(aes(y MaxLength), stat identity, position identity, fill blue) geom_bar(aes(y MinLength), stat identity, position identity, fill orange) coord_flip()關鍵在于兩層geom_bar()都使用stat identity與position identity前者直接用y美學提供的數值作為柱高后者禁止 ggplot 對柱體做避讓dodge或堆疊stack于是藍色MaxLength與橙色MinLength兩組柱體從同一起點出發、相互疊壓直觀呈現每組數據的最小—最大跨度。七、挑戰任務與配套作業 挑戰birds.csv數據集蘊含了特定生態系統中豐富多樣的鳥類信息。你可以在網絡上尋找其他鳥類相關的數據集用本課學到的圖表技能去探索挖掘那些你原本沒有意識到的有趣事實。 作業Lines, Scatters and Bars本課作業詳見 3-Data-Visualization/R/09-visualization-quantities/assignment.md。任務要求深入研究數據集發掘某一種鳥類例如Snow Goose 雪雁的有趣事實并編寫一個腳本綜合運用本課提到的折線圖、散點圖、柱狀圖三種圖表在 notebook 中講出一個完整的數據故事。評分標準分為三檔優秀Exemplary合格Adequate待改進Needs Improvement腳本帶有良好的注釋、扎實的故事敘述和賞心悅目的圖形腳本缺少上述三要素之一腳本缺少上述三要素中的兩個八、自主延伸學習本課是 ggplot2 數量可視化系列的第一課核心收獲是掌握用ggplot2可視化數量的完整流程識別數據框中的目標部分 → 執行必要的數據變換 → 指定 x/y 軸 → 選擇幾何對象 → 渲染圖形。后續可以進一步研究其他 R 可視化擴展包Lattice基于 Trellis 網格的經典繪圖包擅長條件分面圖facetPlotlyplotly.R把 ggplot 圖形升級為可交互的 Web 圖表。更系統的學習路徑是繼續本倉庫 R 系列課程的后續章節3-Data-Visualization/R/10-visualization-distributions、11-visualization-proportions、12-visualization-relationships 與 13-meaningful-vizualizations它們分別圍繞分布、比例、關系與有意義的可視化展開共同構成完整的數據可視化知識體系。動手運行每一段代碼觀察參數變化對圖形的實際影響是內化這些技巧最有效的方式。【免費下載鏈接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!項目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考