Dariusz Brzeziński
Podstawy wizualizacji danych i R Shiny
Wizualizacje danych, panele analityczne i inne aplikacje oparte na danych powinny pomagać użytkownikom zrozumieć dane.
Źle dobrana forma prezentacji danych może przeszkodzić w ich zrozumieniu. Warto zastanowić się jak najlepiej przedstawić odkryte zależności, aby nasza praca jako analityka nie poszła na marne.
Statystyk, pionier wizualizacji danych. Najbardziej znany dzięki swoim książkom, m.in. The Visual Display of Quantitative Information, Envisioning Information i Visual Explanations: Images and Quantities, Evidence and Narrative. Popularyzator takich technik wizualizacji jak small multiples czy sparklines.
Liczbowe | Porządkowe | Nominalne |
---|---|---|
Position | Position | Position |
Length | Density | Hue |
Angle | Saturation | Texture |
Slope | Hue | Connection |
Area | Texture | Containment |
Volume | Connection | Density |
Density | Containmen | Saturation |
Saturation | Length | Shape |
Hue | Angle | Length |
Slope | Angle | |
Area | Slope | |
Volume | Area | |
Volume |
J. Mackinlay, Automating the Design of Graphical Presentations of Relational Information, ACM Transactions on Graphics 5(2), 1986
Instalujemy paczkę…
install.packages("shiny")
… ładujemy paczkę i uruchamiamy przykład
library(shiny)
runExample("01_hello")
RStudio ma osobny typ projektu zawierający szablon dostosowany do Shiny.
library(shiny)
shinyUI(fluidPage(
titlePanel("Tytuł"),
sidebarLayout(
sidebarPanel(
h3('Panel boczny')
),
mainPanel(
h3('Panel główny')
)
)
))
library(shiny)
shinyServer(
function(input, output) {
}
)
runApp()
fluidPage()
titlePanel()
i sidebarLayout()
sidebarLayout()
przyjmuje dwa argumenty:
sidebarPanel
mainPanel
library(shiny)
shinyUI(fluidPage(
titlePanel("Tytuł"),
sidebarLayout(
sidebarPanel(
h3('Panel boczny')
),
mainPanel(
h3('Panel główny')
)
)
))
p, h1 h2, h3, h4, h5, h6, a, br, div, span, pre, code, img, strong, em, HTML
img
, ale referowane obrazki powinny znajdować się w folderze www
wewnątrz folderu projektushinyUI(fluidPage(
titlePanel("Zaawansowana Eksploracja Koszykówki"),
sidebarLayout(position="right",
sidebarPanel(
img(src = "jordan.jpg", height = 200, width = 250)
),
mainPanel(
h3("Cytaty"),
p("Wystawiony język to mój specjalny wkład w rozwój tej gry. Nigdy wcześniej nie widziałeś niczego podobnego i prawdopodobnie nigdy już nie zobaczysz.")
)
)
))
Oprócz podstawowych znaczników html, można dodawać interaktywne kontrolki.
actionButton checkboxGroupInput checkboxInput dateInput dateRangeInput fileInput helpText numericInput radioButtons selectInput sliderInput submitButton textInput
Każda kontrolka posiada nazwę i etykietę. Nazwa pozwala identyfikować kontrolkę w kodzie a etykieta opisuje element w interfejsie graficznym.
actionButton(
"actionBtn",
label = "OK")
shinyUI(fluidPage(
titlePanel("Basic widgets"),
fluidRow(
column(3,
h3("Buttons"),
actionButton("action",
label = "Action"),
br(),
br(),
submitButton("Submit")),
column(3,
h3("Single checkbox"),
checkboxInput("checkbox",
label = "Choice A", value = TRUE)),
column(3,
checkboxGroupInput("checkGroup",
label = h3("Checkbox group"),
choices = list("Choice 1" = 1,
"Choice 2" = 2, "Choice 3" = 3),
selected = 1)),
column(3,
dateInput("date",
label = h3("Date input"),
value = "2014-01-01"))
),
fluidRow(
column(3,
dateRangeInput("dates", label = h3("Date range"))),
column(3,
fileInput("file", label = h3("File input"))),
column(3,
h3("Help text"),
helpText("Note: help text isn't a true widget,",
"but it provides an easy way to add text to",
"accompany other widgets.")),
column(3,
numericInput("num",
label = h3("Numeric input"),
value = 1))
),
fluidRow(
column(3,
radioButtons("radio", label = h3("Radio buttons"),
choices = list("Choice 1" = 1, "Choice 2" = 2,
"Choice 3" = 3),selected = 1)),
column(3,
selectInput("select", label = h3("Select box"),
choices = list("Choice 1" = 1, "Choice 2" = 2,
"Choice 3" = 3), selected = 1)),
column(3,
sliderInput("slider1", label = h3("Sliders"),
min = 0, max = 100, value = 50),
sliderInput("slider2", "",
min = 0, max = 100, value = c(25, 75))
),
column(3,
textInput("text", label = h3("Text input"),
value = "Enter text..."))
)
))
Dwa kroki:
ui.R
server.R
Dodać jeden z następujących elementów do ui.R
:
htmlOutput imageOutput plotOutput tableOutput textOutput uiOutput verbatimTextOutput
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(sliderInput("testRange",
label = "Stopień znudzenia [%]:",
min = 0, max = 100,
value = c(0, 100))),
mainPanel(textOutput("testText"))
)
))
Za pomocą listy output
przypisać do obiektu dodanego w kroku 1 wynik jednej z następujących funkcji:
renderImage renderPlot renderPrint renderTable renderText renderUI
shinyServer(function(input, output) {
output$testText <- renderText({
"Pierwsze dane z serwera"
})
})
Aby skorzystać z danych podanych przez użytkownika, wystarczy skorzystać z elementów listy input
:
shinyServer(function(input, output) {
output$testText <- renderText({
paste("Znudzenie między ",
input$testRange[1], " a ",
input$testRange[2], "%")
})
})
server.R
uruchamiany jest tylko raz, gdy uruchamiana jest aplikacjafunction(input, output){}
) uruchamiana jest za każdym razem gdy użytkownik wchodzi na stronęrender*
uruchamiane są za każdym razem, gdy dane na ktorych są oparte się zmieniająreactive
wewnątrz której podaje się blok kodu, który ma być automatycznie cache'owanydataInput <- reactive({
getData("source.csv",
from = input$dates[1],
to = input$dates[2])
})
reactive
powodują też przebudowanie obiektów z rodziny render*
output$plot <- renderPlot({
chartSeries(dataInput(), type = "line",
log.scale = input$log)
})
ui.R
i server.R
input
i output
reactive()
Stwórz aplikację przewidującą szansę przeżycia na Titanicu
Stwórz Pokédexa w R
Stwórz aplikację analizującą liczbę zabitych w filmach