چگونه نمودارهای متحرک بسازیم؟ – یک راهنما برای زبان R


در این پروژه کوچک آموزشی، مهارتهای بصریسازی داده با استفاده از دو کتابخانه gganimate و plot.ly را میآموزیم.
هانس راسلینگ (Hans Rosling) یک استاد علم آمار بود. وی کل عمر خود را صرف ارتقای کاربرد دادهها در نمودارهای متحرک برای بررسی مسائل توسعهای کرد و نمایی از دنیا بر مبنای واقعیت را با جهانیان به اشتراک گذارد. سخنرانی بسیار محبوبش در کنفرانس TED با عنوان «بهترین آماری که در عمر خود دیدهاید» بیش از 12 میلیون بازدید داشته است. این سخنرانی همچنین یکی از صد سخنرانی پربازدید کنفرانس TED در تمام ادوار خود محسوب میشود.
آیا شما نیز تاکنون در فکر این بودهاید چنین نمودارهای متحرکی را به رایگان از دادههای خام و در کمتر از 5 دقیقه بسازید و بتوانید آنها را در قالبهای مختلف (Gif یا Html برای وبسایت و ...) به اشتراک بگذارید؟

این مقاله به شما نشان خواهد داد که چگونه میتوانید نمودارهای متحرک را در زبان R با استفاده از دو رویکرد متفاوت بسازید:
- R + کتابخانه gganimate که یک فایل Gif ایجاد میکند.
- R + کتابخانه plot.ly که یک فایل html ایجاد میکند که میتوانید در وبسایت خود جاسازی کنید.

فرض میکنیم که شما قبلاً Rstudio را نصب کرهاید و برخی مبانی آن را میدانید، چون ما در این نوشته تنها مراحل و کدهای مورد نیاز برای تولید نمودارها را ارائه میکنیم. کد کامل در جهت مقاصد آموزشی روی گیتهاب قرار گرفته است.
مرحله یکم: جستجو و دانلود مجموعه دادههای مورد نیاز
در ابتدا باید به وبسایت gapminder.com مراجعه کرده و 3 مجموعه داده مورد نیاز را دانلود کنید. این بنیاد از سوی خانواده راسلینگ ایجاد شده است. این وبسایت بصریسازیها و مجموعه دادههای زیبایی دارد که هر کس باید آنها را ببیند تا «با جهل از طریق یک جهانبینی مبتنی بر واقعیت قابلفهم برای همگان، مبارزه کند».
ما 3 فایل اکسل (xlsx) را دانلود میکنیم:
- نرخ کودک برای هر مادر (باروری کلی)
- جمعیت (کلی)
- امید به زندگی (سال)
زمانی که فایلها دانلود و در پوشه کاری ذخیره شدند، نوبت آن است که مجموعه دادهها را پاکسازی کرده و ادغام کنیم.
گام دوم: پاکسازی و ادغام دادهها
الف) بارگذاری دادهها با کتابخانه xlsx (به جای.. نام پوشه خودتان را قرار دهید):
کدهای زیر در همین رابطه هستند.
# Please note that loading xlsx in R is really slow compared to csv library(xlsx) population_xls <- read.xlsx("../indicator gapminder population.xlsx", encoding = "UTF-8",stringsAsFactors= F, sheetIndex = 1, as.data.frame = TRUE, header=TRUE) fertility_xls <- read.xlsx("../indicator undata total_fertility.xlsx", encoding = "UTF-8",stringsAsFactors= F, sheetIndex = 1, as.data.frame = TRUE, header=TRUE) lifeexp_xls <- read.xlsx("../indicator life_expectancy_at_birth.xlsx", encoding = "UTF-8", stringsAsFactors= F, sheetIndex = 1, as.data.frame = TRUE, header=TRUE)
ب) پاکسازی و ادغام دادهها با کتابخانههای reshape و dplyr
# Load libraries library(reshape) library(gapminder) library(dplyr) library(ggplot2) # Create a variable to keep only years 1962 to 2015 myvars <- paste("X", 1962:2015, sep="") # Create 3 data frame with only years 1962 to 2015 population <- population_xls[c('Total.population',myvars)] fertility <- fertility_xls[c('Total.fertility.rate',myvars)] lifeexp <- lifeexp_xls[c('Life.expectancy',myvars)] # Rename the first column as "Country" colnames(population)[1] <- "Country" colnames(fertility)[1] <- "Country" colnames(lifeexp)[1] <- "Country" # Remove empty lines that were created keeping only 275 countries lifeexp <- lifeexp[1:275,] population <- population[1:275,] # Use reshape library to move the year dimension as a column population_m <- melt(population, id=c("Country")) lifeexp_m <- melt(lifeexp, id=c("Country")) fertility_m <- melt(fertility, id=c("Country")) # Give a different name to each KPI (e.g. pop, life, fert) colnames(population_m)[3] <- "pop" colnames(lifeexp_m)[3] <- "life" colnames(fertility_m)[3] <- "fert" # Merge the 3 data frames into one mydf <- merge(lifeexp_m, fertility_m, by=c("Country","variable"), header =T) mydf <- merge(mydf, population_m, by=c("Country","variable"), header =T) # The only piece of the puzzle missing is the continent name for each country for the color - use gapminder library to bring it continent <- gapminder %>% group_by(continent, country) %>% distinct(country, continent) continent <- data.frame(lapply(continent, as.character), stringsAsFactors=FALSE) colnames(continent)[1] <- "Country" # Filter out all countries that do not exist in the continent table mydf_filter <- mydf %>% filter(Country %in% unique(continent$Country)) # Add the continent column to finalize the data set mydf_filter <- merge(mydf_filter, continent, by=c("Country"), header =T) # Do some extra cleaning (e.g. remove N/A lines, remove factors, and convert KPIs into numerical values) mydf_filter[is.na(mydf_filter)] <- 0 mydf_filter <- data.frame(lapply(mydf_filter, as.character), stringsAsFactors=FALSE) mydf_filter$variable <- as.numeric(as.character(gsub("X","",mydf_filter$variable))) mydf_filter$pop <- round(as.numeric(as.character(mydf_filter$pop))/1000000,1) mydf_filter$fert <- as.numeric(as.character(mydf_filter$fert)) mydf_filter$life <- as.numeric(as.character(mydf_filter$life))
گام سوم: ساخت نمودار با کتابخانه gganimate و تولید یک فایل Gif برای اشتراک با افراد دیگر.
اینک که مجموعه داده پاکسازیشدهای را در اختیاردارید که حاوی 3 KPI (جمعیت، باروری و امید به زندگی) و 3 بُعد (کشور، سال، قاره) است، میتوانید ارائه بصری را با gganimate ایجاد کنید.
# Load libraries library(ggplot) library(gganimate) # Create the plot with years as frame, limiting y axis from 30 years to 100 p <- ggplot(mydf_filter, aes(fert, life, size = pop, color = continent, frame = variable)) + geom_point()+ ylim(30,100) + labs(x="Fertility Rate", y = "Life expectancy at birth (years)", caption = "(Based on data from Hans Rosling - gapminder.com)", color = 'Continent',size = "Population (millions)") + scale_color_brewer(type = 'div', palette = 'Spectral') # Add a global theme theme_set(theme_grey()+ theme(legend.box.background = element_rect(),legend.box.margin = margin(6, 6, 6, 6)) ) # Generate the Visual with 0.2 animation speed and a GIF output gganimate(p, interval = .2, "output.gif")
اینک میتوانید از انیمیشن Gif بسیار جالب خود لذت برده و آن را با دوستانتان به اشتراک بگذارید.
گام چهارم: ساخت نمودار با کتابخانه plot.ly و تولید فایل Html برای جاسازی در وبسایت
کدهای زیر در همین رابطه هستند.
# Load libraries library(plotly) library(ggplot2) # Create the plot p <- ggplot(mydf_filter, aes(fert, life, size = pop, color = continent, frame = variable)) + geom_point()+ ylim(30,100) + labs(x="Fertility Rate", y = "Life expectancy at birth (years)", color = 'Continent',size = "Population (millions)") + scale_color_brewer(type = 'div', palette = 'Spectral') # Generate the Visual and a HTML output ggp <- ggplotly(p, height = 900, width = 900) %>% animation_opts(frame = 100, easing = "linear", redraw = FALSE) ggp htmlwidgets::saveWidget(ggp, "index.html")
این کد روی گیتهاب در دسترس است و امیدواریم از مطالعه آن لذت برده باشید و بتوانید در کاربردهایی که مد نظر خود دارید از نمودارهای متحرک استفاده کنید. هر گونه نظر و پیشنهاد خود را میتوانید در بخش دیدگاهها با ما و دیگر خوانندگان فرادرس در میان بگذارید.
اگر این نوشته مورد توجه شما قرار گرفته است، موارد زیر نیز احتمالاً برای شما مفید خواهند بود:
- نمودارهای تصویری – به زبان ساده
- آموزش نمایش داده ها و ترسیم نمودار در اکسل
- نمودارهای پراکندگی – به زبان ساده
- آموزش تصویر سازی حرفه ای در علم داده با نرم افزار R و بسته نرم افزاری ggplot2
- نرمافزارهای آماری
- آموزش طراحی و گرافیک کامپیوتری
- آموزش مقدماتی تحلیل داده ها با نرم افزار آماری Minitab
==
این کلیپ دقیقا کتاب حقیقت هستش . فکر کنم گوینده هم نویسنده این کتابه factfullness