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

۸۰۲ بازدید
آخرین به‌روزرسانی: ۱۲ مهر ۱۴۰۲
زمان مطالعه: ۴ دقیقه
چگونه نمودارهای متحرک بسازیم؟ — یک راهنما برای زبان R

در این پروژه کوچک آموزشی، مهارت‌های بصری‌سازی داده با استفاده از دو کتابخانه gganimate و plot.ly را می‌آموزیم.

هانس راسلینگ (Hans Rosling) یک استاد علم آمار بود. وی کل عمر خود را صرف ارتقای کاربرد داده‌ها در نمودارهای متحرک برای بررسی مسائل توسعه‌ای کرد و نمایی از دنیا بر مبنای واقعیت را با جهانیان به اشتراک گذارد. سخنرانی بسیار محبوبش در کنفرانس TED با عنوان «بهترین آماری که در عمر خود دیده‌اید» بیش از 12 میلیون بازدید داشته است. این سخنرانی همچنین یکی از صد سخنرانی پربازدید کنفرانس TED در تمام ادوار خود محسوب می‌شود.

آیا شما نیز تاکنون در فکر این بوده‌اید چنین نمودارهای متحرکی را به رایگان از داده‌های خام و در کمتر از 5 دقیقه بسازید و بتوانید آن‌ها را در قالب‌های مختلف (Gif یا Html برای وب‌سایت و ...) به اشتراک بگذارید؟

نموداری که با gganimate ساخته شده است.

این مقاله به شما نشان خواهد داد که چگونه می‌توانید نمودارهای متحرک را در زبان R با استفاده از دو رویکرد متفاوت بسازید:

  • R + کتابخانه gganimate که یک فایل Gif ایجاد می‌کند.
  • R + کتابخانه plot.ly که یک فایل html ایجاد می‌کند که می‌توانید در وب‌سایت خود جاسازی کنید.
-نموداری که با استفاده از کتابخانه plot.ly ساخته شده است.

فرض می‌کنیم که شما قبلاً Rstudio را نصب کره‌اید و برخی مبانی آن را می‌دانید، چون ما در این نوشته تنها مراحل و کدهای مورد نیاز برای تولید نمودارها را ارائه می‌کنیم. کد کامل در جهت مقاصد آموزشی روی گیت‌هاب قرار گرفته است.

مرحله یکم: جستجو و دانلود مجموعه داده‌های مورد نیاز

در ابتدا باید به وب‌سایت gapminder.com مراجعه کرده و 3 مجموعه داده مورد نیاز را دانلود کنید. این بنیاد از سوی خانواده راسلینگ ایجاد شده است. این وب‌سایت بصری‌سازی‌ها و مجموعه داده‌های زیبایی دارد که هر کس باید آن‌ها را ببیند تا «با جهل از طریق یک جهان‌بینی مبتنی بر واقعیت قابل‌فهم برای همگان، مبارزه کند».

ما 3 فایل اکسل (xlsx) را دانلود می‌کنیم:

  1. نرخ کودک برای هر مادر (باروری کلی)
  2. جمعیت (کلی)
  3. امید به زندگی (سال)

زمانی که فایل‌ها دانلود و در پوشه کاری ذخیره شدند، نوبت آن است که مجموعه داده‌ها را پاک‌سازی کرده و ادغام کنیم.

گام دوم: پاک‌سازی و ادغام داده‌ها

الف) بارگذاری داده‌ها با کتابخانه 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")

این کد روی گیت‌هاب در دسترس است و امیدواریم از مطالعه آن لذت برده باشید و بتوانید در کاربردهایی که مد نظر خود دارید از نمودارهای متحرک استفاده کنید. هر گونه نظر و پیشنهاد خود را می‌توانید در بخش دیدگاه‌ها با ما و دیگر خوانندگان فرادرس در میان بگذارید.

اگر این نوشته مورد توجه شما قرار گرفته است، موارد زیر نیز احتمالاً برای شما مفید خواهند بود:

==

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
۱ دیدگاه برای «چگونه نمودارهای متحرک بسازیم؟ — یک راهنما برای زبان R»

این کلیپ دقیقا کتاب حقیقت هستش . فکر کنم گوینده هم نویسنده این کتابه factfullness

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *