× Need help learning R? Enroll in Applied Epi's intro R course, try our free R tutorials, post in our Community Q&A forum, or ask about our R Help Desk service.

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
deaths_plot %>% plotly::ggplotly()

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).

# incidence2 paketi ile epidemiyoloji eğrisi düzenle
p <- incidence2::incidence(
  linelist,
  date_index = date_onset,
  interval = "weeks",
  groups = outcome) %>% plot(fill = outcome)
# İnteraktif grafik
p %>% plotly::ggplotly()

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.