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