39 İnteraktif grafikler
Veri görselleştirmenin özelleştirebilir ve etkileşimli olması önemini gün geçtikçe arttırmaya devam ediyor. Sonuç olarak, interaktif grafikler daha yaygın kullanılmaktadır. Analizlerinize interaktif grafikleri dahil etmenin birkaç yolu vardır, bunun için kullanılan en yaygın paketler plotly ve shiny’dir.
Bu sayfada, mevcut bir ggplot()’ grafiğini plotly ile etkileşimli bir hale dönüştürmeye odaklanacağız. shiny hakkında daha fazla bilgiyi Shiny ile Gösterge Panelleri sayfasında bulabilirsiniz. İnteraktif grafiklerin PDF veya Word belgelerinde değil, yalnızca HTML formatındaki R belgelerinde kullanılabileceği vurgulamak istiyoruz.
Aşağıda, ggplot2 ve plotly entegrasyonu kullanılarak interaktif bir hale dönüştürülmüş temel bir epidemiyolojik eğri bulunmaktadır (farenizi çizimin üzerine getirin, yakınlaştırın veya göstergedeki öğeleri tıklayın).
39.1 Hazırlık
Paketleri yükleme
Aşağıdaki kod parçaso, analizler için gereken paketlerin yüklenmesini göstermektedir. Bu el kitabında, gerekirse paketi kuran ve kullanım için yükleyen pacman’dan p_load()
fonksiyonunu vurgulamaktayız. R tabanından library()
ile daha öncesinde kurmuş olduğunuz paketleri yükleyebilirsiniz. R paketleri hakkında daha fazla bilgi için R’ın temelleri sayfasına bakabilirsiniz.
pacman::p_load(
rio, # Dosyaları içeri/dışarı aktarılması
here, # Dosya yolağını tespit edilmesi
lubridate, # Tarihlerle çalışma
plotly, # İnteraktif grafikler
scales, # Yüzdelerin oranlara kolayca çevrilmesi
tidyverse # Veri yönetimi ve görselleştirilmesi
)
ggplot()
hazırlama
Bu sayfada, etkileşimli hale dönüştürmek istediğiniz bir ggplot()
grafiğiyle işe başladığınızı varsayıyoruz. Bu el kitabının birçok sayfasında kullanılan linelist
metodunu kullanarak bu sayfadaki grafiklerden birkaçını oluşturacağız.
Veriyi içe aktarma
Simüle edilmiş bir Ebola salgınına ait vakaların veri setini içe aktarıyoruz. Takip etmek isterseniz, “temiz satır listesi” dosyasını indirmek için tıklayın. (.rds dosyası olarak) Verilerinizi rio paketinden import()
işleviyle içe aktarın (.xlsx, .rds, .csv gibi birçok dosya türünü kabul eder - ayrıntılar için [İçe ve dışa aktarma] sayfasına bakın).
# veri setini indir
linelist <- import("linelist_cleaned.rds")
Veri setindeki ilk 50 satır aşağıda listelenmiştir.
39.2 ggplotly()
ile grafikler
plotly paketindeki ggplotly() işlevi bir ggplot()
grafiğini kolayca etkileşimli hale dönüştürebilir. Kısaca “ggplot()” dosyanızı kaydedin ve ardından onu “ggplotly()” işlevine aktarın.
Aşağıda, belirli bir haftada ölen vakaların oranını gösteren basit bir grafik çizeceğiz:
İlk olarak, her epidemiyolojik hafta için bir özet veri seti, çıktıları bilinen vakaların sayısı ve bu vakalardaki ölüm yüzdesini oluşturarak başlıyoruz.
weekly_deaths <- linelist %>%
group_by(epiweek = floor_date(date_onset, "week")) %>% # veri setini epidemiyolojik hafta olarak oluştur ve grupla
summarise( # yeni özet veri çerçevesi oluştur:
n_known_outcome = sum(!is.na(outcome), na.rm=T), # bilinen çıktıları olan hasta sayısı
n_death = sum(outcome == "Death", na.rm=T), # ölen vaka sayısı
pct_death = 100*(n_death / n_known_outcome) # çıktıları bilinen hastalar içinde ölen vaka oranı
)
weekly_deaths
veri setinin ilk 50 satırı:
Ardından ggplot2 ile geom_line()
işlevini kullanarak grafiği oluşturuyoruz.
deaths_plot <- ggplot(data = weekly_deaths)+ # weekly deaths verileri ile başla
geom_line(mapping = aes(x = epiweek, y = pct_death)) # çizgi oluştur
deaths_plot # yazdır
Bu grafiği aşağıdaki gibi ggplotly()
işleviyle basitçe etkileşimli hale getirebiliriz. X ve y değerlerini göstermek için farenizi çizginin üzerine getirin. Grafiği yakınlaştırabilir ve etrafa sürükleyebilirsiniz. Simgeleri grafiğin sağ üst köşesinde görebilirsiniz. Sırayla, aşağıdaki aksiyonları alabilirsiniz:
- Geçerli grafiği bir PNG görüntüsü olarak indirin
- Seçim kutusuyla görüntüyü yakınlaştırın
- “Kaydırma” çubuğu veya grafiği tıklayıp sürükleyerek grafik üzerinde hareket edin
- Yakınlaştırın, uzaklaştırın veya varsayılan yakınlaştırmaya dönün
- Eksenleri varsayılanlara sıfırlayın
- X ve y eksenlerine uzanan “interaktif çizgileri” açıp/kapayın
- Verilerin gösterilip gösterilmeyeceğine ilişkin ayarlamaları düzenleyin
ggplotly()
gruplanmış verilerde de çalışır. Aşağıda, çıktılarına göre gruplandırılmış haftalık bir epidemiyoloji eğrisi yapılmıştır. Yığılmış çubuklar etkileşimlidir. Grafikteki farklı öğelere tıklamayı deneyin (tıkladığınız öğeler görünecek / gizlenecektir).
39.3 Değişiklikler
Dosya boyutu
R Markdown tarafından oluşturulan bir HTML’de dışa aktarırken (bu kitap gibi!) grafiğin veri boyutunu küçültmek isteyebilirsiniz (çoğu durumda hiçbir olumsuz yan etkisi yoktur). Bunun için interaktif grafiği yine plotly paketinden partial_bundle()
işlevine aktarmanız yeterli olacaktır.
p <- p %>%
plotly::ggplotly() %>%
plotly::partial_bundle()
Düğmeler
Standart bir plotly grafiğindeki bazı düğmeler dikkat dağıtıcı olabilir. İsterseniz, bunları kaldırabilirsiniz. Bunu, grafik çıktısını plotly paketinden config()
işlevi içine aktararak yapabilirsiniz. İşlev içinde hangi düğmelerin kaldırılacağını belirtmeniz gerekmektedir. Aşağıdaki örnekte, kaldırılacak düğmelerin adlarını önceden belirleyip modeBarButtonsToRemove =
argümanına yazıyoruz. Ayrıca plotly logosunu kaldırmak için de displaylogo = FALSE
argümanını ekledik.
## bu düğmeler dikkat dağıtıyor ve bunları kaldırmak istiyoruz
plotly_buttons_remove <- list('zoom2d','pan2d','lasso2d', 'select2d','zoomIn2d',
'zoomOut2d','autoScale2d','hoverClosestCartesian',
'toggleSpikelines','hoverCompareCartesian')
p <- p %>% # etkileşimli grafiği bu düğmeler olmadan yeniden tanımla
plotly::config(displaylogo = FALSE, modeBarButtonsToRemove = plotly_buttons_remove)
39.4 Isı grafikleri
Isı haritası da dahil olmak üzere neredeyse tüm ggplot()
grafiklerini interaktif hale getirebilirsiniz. Isı grafikleri sayfasında, belirli illerde kurulmuş olan malarya tesislerine ait bir grafiğin nasıl yapıldığı anlatılmaktadır. Bu grafikte haftanın bazı günlerinde tesislerden elde edilen veriler görselleştirilmiştir.
Örnek kodu, burada derinlemesine açıklamayacak olsak bile aşağıda paylaşıyoruz.
# verileri içe aktar
facility_count_data <- rio::import(here::here("data", "malaria_facility_count_data.rds"))
# Spring bölgesine ait verileri Weeks'te topla
agg_weeks <- facility_count_data %>%
filter(District == "Spring",
data_date < as.Date("2020-08-01")) %>%
mutate(week = aweek::date2week(
data_date,
start_date = "Monday",
floor_day = TRUE,
factor = TRUE)) %>%
group_by(location_name, week, .drop = F) %>%
summarise(
n_days = 7,
n_reports = n(),
malaria_tot = sum(malaria_tot, na.rm = T),
n_days_reported = length(unique(data_date)),
p_days_reported = round(100*(n_days_reported / n_days))) %>%
ungroup(location_name, week) %>%
right_join(tidyr::expand(., week, location_name)) %>%
mutate(week = aweek::week2date(week))
# grafiği oluştur
metrics_plot <- ggplot(agg_weeks,
aes(x = week,
y = location_name,
fill = p_days_reported))+
geom_tile(colour="white")+
scale_fill_gradient(low = "orange", high = "darkgreen", na.value = "grey80")+
scale_x_date(expand = c(0,0),
date_breaks = "2 weeks",
date_labels = "%d\n%b")+
theme_minimal()+
theme(
legend.title = element_text(size=12, face="bold"),
legend.text = element_text(size=10, face="bold"),
legend.key.height = grid::unit(1,"cm"),
legend.key.width = grid::unit(0.6,"cm"),
axis.text.x = element_text(size=12),
axis.text.y = element_text(vjust=0.2),
axis.ticks = element_line(size=0.4),
axis.title = element_text(size=12, face="bold"),
plot.title = element_text(hjust=0,size=14,face="bold"),
plot.caption = element_text(hjust = 0, face = "italic")
)+
labs(x = "Week",
y = "Facility name",
fill = "Reporting\nperformance (%)",
title = "Percent of days per week that facility reported data",
subtitle = "District health facilities, April-May 2019",
caption = "7-day weeks beginning on Mondays.")
metrics_plot # yazdır
Aşağıda, grafiği etkileşimli hale getiriyoruz. Düğmeleri ve dosya boyutunu değiştiriyoruz.
metrics_plot %>%
plotly::ggplotly() %>%
plotly::partial_bundle() %>%
plotly::config(displaylogo = FALSE, modeBarButtonsToRemove = plotly_buttons_remove)
–>
39.5 Kaynaklar
Plotly sadece R’da değil, aynı zamanda Python (ve JavaScript temelli herhangi bir veri bilimi kodlama dili) ile de çalışmaktadır. Daha fazla bilgiye plotly web sitesinden ulaşabilirsiniz.