
用 R 與 ggplot2 講好一個數據故事Data Science for Beginners 線圖、散點圖與條形圖作業實戰解析【免費下載鏈接】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 課程第 09 課R 版本的課后作業展開在明尼蘇達州鳥類數據集data/birds.csv中針對某一種特定鳥類深入挖掘數據并運用本課學過的線圖、散點圖與條形圖三種圖表類型在 notebook 中構建一個完整的數據敘事。讀完本文你將掌握 ggplot2 從數據清洗、異常值發現到分組比較的完整可視化流程并能夠按照作業評估標準交出一份兼具清晰注釋、完整敘事與美觀圖表的作品。作業目標從畫圖到講故事作業原文見 translations/da/3-Data-Visualization/R/09-visualization-quantities/assignment.md英文原版見 translations/en/3-Data-Visualization/R/09-visualization-quantities/assignment.md給出了明確的任務描述在本課中你使用線圖line charts、散點圖scatterplots和條形圖bar charts來展示這個數據集中的有趣事實。本作業要求你更深入地挖掘數據集去發現關于某一種特定類型鳥類的有趣信息。例如你可以編寫一個腳本將你能找到的關于雪雁Snow Geese的所有有趣數據可視化出來。請在 notebook 中使用上述三種圖表類型來構建一個故事。該作業的配套講義 translations/da/3-Data-Visualization/R/09-visualization-quantities/README.mdR 版本原稿見 3-Data-Visualization/R/09-visualization-quantities/README.md提供了完成作業所需的全部技術手段包括用ggplot2繪制線圖與散點圖觀察鳥類最大翼展的分布通過geom_text()標注異常值用subset()過濾疑似錄入錯誤的數據用dplyr的group_by()、summarise()與gather()分組統計并繪制條形圖用coord_flip()將條形圖轉為水平展示通過疊加superimpose多個geom_bar()層進行多指標對比。因此本作業本質上是把講義中的每一段代碼從跟著課文學升級為圍繞一個主題自主綜合運用。下面我們按作業要求的三種圖表講一個故事的路徑完整走一遍。第一步準備數據選定主角作業要求的數據集存放在倉庫根目錄的 data/ 文件夾下。打開 R 控制臺導入數據集并查看前幾行birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)以文件頭 5 行為例數據結構是文本與數值的混合體索引NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165fileEncoding UTF-8-BOM用于正確處理帶 BOM 頭的 CSV 文件。作業示例選定的主角是雪雁Snow goose學名Anser caerulescens它在數據集中對應的記錄為體長 64–79 厘米、體重 2050–4050 克、翼展 135–165 厘米隸屬 Ducks/Geese/Waterfowl 類、Anseriformes 目、Anatidae 科、Anser 屬保護狀態為 LC無危。選定一個具體物種后作業的關鍵就成了圍繞它的這些數值維度設計出三種圖表來回答問題——它體長區間在同類中的位置它的翼展在全數據集中算大還是小它所屬類別的數量構成如何第二步線圖與散點圖——發現異常值完成第一層敘事先裝包再畫線圖用ggplot2的第一步是安裝并載入包install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()ggplot()指定數據集與 x、y 軸變量group 1讓 ggplot2 把所有離散的 x 值視為一個序列進行連線geom_line()負責繪制線圖。此時可以看到一個非常明顯的事實至少有一個極端異常值——2000 多厘米的翼展意味著超過 20 米這顯然不可能是明尼蘇達州真實存在的鳥類多半是錄入時多打了一個 0。為了讓圖表可讀作業還要求對坐標軸進行打磨。在 README.md 的構建鳥翼展線圖一節中給出了完整的標簽優化方案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))將 x 軸標簽旋轉 45 度xlab()/ylab()分別設置坐標軸標題ggtitle()設置圖表標題。生成的效果如講義中的配圖所示用散點圖給異常值點名即使旋轉 45 度幾百個鳥類名稱仍無法全部展示。講義的第二步策略是只標注異常值隱藏其余 x 軸標簽改用散點圖騰出標注空間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)geom_point()繪制散點geom_text()配合ifelse(MaxWingspan 500, as.character(Name), )只對翼展超過 500 厘米的個體輸出鳥名標簽hjust 0, vjust 0讓標簽從點的右上方開始排布三行theme()參數分別隱藏了 x 軸標題、刻度文字與刻度線讓畫面更清爽。過濾異常值讓數據講道理這一散點圖會揭示禿鷹Bald Eagle與草原隼Prairie Falcon的最大翼展各被多加了一個 0。講義隨即用subset()生成剔除異常值的新數據框并重新繪圖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())過濾后數據更加連貫、可解釋。需要留意的是過濾后的數據集中最大翼展約為 250 厘米如號手天鵝 Trumpeter swan此時若仍沿用 500的閾值geom_text()將不會再輸出任何標簽。作為實戰改進你可以將閾值下調到過濾后數據的合理區間例如MaxWingspan 240從而繼續在高翼展個體上做標注——這也正是圍繞具體問題調整可視化參數這一作業能力點的體現。第三步條形圖——用分組統計回答數量問題講義在探索條形圖一節提出了一組可以用條形圖回答的問題數據集里有多少種鳥類類別各自數量是多少有多少鳥是滅絕、瀕危、稀有或常見的在林奈分類體系中各屬、各目分別有多少種分組匯總 堆疊條形圖先安裝并載入數據處理所需的包然后按Category分組對多個數值列求均值并繪制堆疊條形圖install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse) 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()對六個數值列求均值并記錄組內個體數ngather(key, value, - c(Category, n))把寬表轉成長表使六個指標可以作為同一個 x 軸類別下的多根柱geom_bar(stat identity)直接使用數值作為柱高scale_fill_manual()為六個指標指定一組明確的色板。coord_flip水平條形圖更易讀上述堆疊圖因未分組數據過多而難以閱讀講義隨即給出更實用的方案先統計每個類別下的鳥類數量再用coord_flip()轉成水平條形圖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列轉成與排序一致的因子factor保證 ggplot2 按排序后的順序繪制coord_flip()將坐標軸對調形成橫向條形圖。這幅圖可以一眼看出該地區數量最多的鳥類類別是 Ducks/Geese/Waterfowl——考慮到明尼蘇達州是萬湖之地這個結果并不意外。你也可以沿這一思路做其他計數統計例如按ConservationStatus、Order或Genus計數通常會有新的發現。比較與疊加兩兩對比的進階敘事講義比較數據一節展示了基于類別對最大體長進行排序比較的做法birds_grouped - birds_filtered %% group_by(Category) %% summarise( MaxLength max(MaxLength, na.rm TRUE), MinLength max(MinLength, na.rm TRUE) ) %% arrange(Category) ggplot(birds_grouped, aes(Category, MaxLength)) geom_bar(stat identity) coord_flip()結果符合直覺蜂鳥的最大體長最小而鵜鶘與鵝類最大。na.rm TRUE用于在聚合時忽略缺失值。更進一步還可以在同一張圖上疊加兩個geom_bar()層同時呈現某一類別的最小與最大體長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()position identity讓兩層柱從同一基線開始繪制、相互覆蓋從而直觀比較每個類別體長的上界與下界。這種同坐標軸多幾何層的手法正是作業中用三種圖表講一個完整故事所需要的進階技巧。作業示范圍繞雪雁構建三段式敘事將以上技術串起來一份達標的作業可以按如下結構組織數據來自 data/birds.csv 中的 Snow goose 記錄開場線圖/散點圖先繪制全數據集的翼展分布指出雪雁在整條曲線中的位置——其翼展區間 135–165 厘米處于中上水平同時借助異常值標注完成對數據集質量的第一印象判斷引出為什么要過濾數據這一話題。展開散點圖過濾掉禿鷹與草原隼兩處錄入錯誤后聚焦鴨雁類Ducks/Geese/Waterfowl對比雪雁與同屬的雪雁Rosss goose翼展 113–116 厘米、白額雁Greater white-fronted goose130–165 厘米在體長與體重上的差異。收束條形圖用dplyr::count()按Category統計數量說明雪雁所屬類別在明尼蘇達州是數量最多的類群再疊加MaxLength與MinLength兩層條形圖展示鴨雁類在體長維度上的跨度。每一步都配上注釋例如# 發現雪雁記錄中翼展 135–165 cm 處于該類群中位區間并用文字串起因果就同時滿足了評分標準中的清晰注釋與扎實敘事兩項。評估標準自檢清單作業的評估標準見 assignment.md分為三檔檔次要求優秀Exemplary腳本包含清晰注釋、有說服力的敘事、吸引人的圖表合格Adequate上述三項缺一項需改進Needs Improvement上述三項缺兩項對照此表提交前可以逐項自檢注釋每個代碼塊是否有#注釋說明意圖關鍵步驟裝包、分組、過濾、疊加是否解釋清楚敘事圖表之間是否有邏輯遞進發現 → 過濾 → 比較 → 結論能否回答雪雁這個物種在數據集中有什么獨特之處美觀是否應用了theme()、xlab()/ylab()、ggtitle()、scale_fill_manual()、coord_flip()等讓圖表更專業的修飾手段倉庫中還提供了 Python 版本的第 09 課參考答案 3-Data-Visualization/09-visualization-quantities/solution/notebook.ipynb其中用pandas與matplotlib完成了觀察翼展 → 名稱與翼展對應 → 標注異常值的同一分析路徑可作為對照參考注意該 notebook 為 Python 內核與本文的 R/ggplot2 實現語言不同。延伸挑戰講義末尾的挑戰環節建議本數據集提供了特定生態系統內多種鳥類的豐富信息可以繼續在網上尋找其他與鳥類相關的數據集圍繞新數據練習構圖去發現此前未意識到的規律。R 生態中除了ggplot2還可以嘗試lattice與plotly等可視化包將同樣的數據 → 美學 → 幾何思維遷移到更多工具上——這正是本課乃至整個 Data Science for Beginners 課程希望沉淀下來的核心能力。【免費下載鏈接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!項目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考