Реактивные метки оси в Shiny / R - PullRequest
0 голосов
/ 03 ноября 2018

Я бы хотел, чтобы метки осей на моем блестящем графике отображали метку переменной (ту, которую пользователь видит и выбирает), а не само имя переменной.

Таким образом, в идеале, если пользователь выберет «Доля преступности» для построения на оси y, на метке оси y будет указано «Доля преступности», а не имя переменной «CRIMESHARE». Моя диаграмма делает последнее прямо сейчас.

Я новичок в Shiny, и я искал понятный ответ на этот вопрос, но я в тупике. Должен ли я написать реактивное утверждение с серией операторов if (то есть, если пользователь выбрал «CRIMESHARE» -> «Доля преступления»)? Если да, то есть какие-нибудь предложения о том, как лучше к этому подойти? Или есть более простой, блестящий способ приблизиться к этому? При необходимости я могу создать пример данных, но я решил, что это скорее концептуальные вопросы.

Спасибо.

Пример данных:

structure(list(ROADACCIDENT = c(142.69999694825, 120.40000152588, 
130.19999694825, 155.10000610352, NA, 181.10000610352, 54.20000076294, 
118.09999847413, 85.19999694825, 112.40000152588), CRIMESHARE = c(3142, 
1695, 1554, 2806, 3368, 3164, 1359, 2013, 711, 2446), MURDER = c(267, 
605, 309, 185, 65, 590, 93, 631, 501, 138), NAME = c("Khabarovsk Krai", 
"Chelyabinsk Oblast", "Novosibirsk Oblast", "Amur Oblast", "Magadan 
Oblast", 
"Krasnoyarsk Krai", "Karachay-Cherkess Republic", "Moscow", "Moscow", 
"Kostroma Oblast"), ID = c(29, 13, 49, 5, 41, 36, 26, 44, 44, 
 34), YEAR = c(2009, 1992, 1990, 2007, 2001, 2007, 1999, 2009, 
1991, 2000)), row.names = c(608L, 255L, 1009L, 102L, 852L, 753L, 
535L, 923L, 905L, 704L), class = "data.frame")

Пользовательский интерфейс:

library(shiny)
library(tidyverse)
library(stringr)
library(rsconnect)
library(shinythemes)
library(plotly)
data(crime_master)
crime_plot <- crime_master

ui <- fluidPage(theme = shinytheme("cerulean"),

titlePanel("My title"),

 sidebarLayout( 
  sidebarPanel( 

   h3("Select the inputs"),
   selectInput(inputId = "y", 
               label = "Indicator to display on Y-axis", 
               choices = c("Road accidents" = "ROADACCIDENT", 
                           "Crime share" = "CRIMESHARE", 
                           "Murders" = "MURDER"), 
              selected = "ROADACCIDENT"),

   selectizeInput(inputId = "region", 
                  label = "Select regions", 
                  choices = c(crime_plot$NAME), 
                  multiple = TRUE,
                  options = list(maxItems = 5))), 
 mainPanel(
   h3("Plot indicators over time"),
   plotlyOutput(outputId = "scatterplot"))))

Сервер:

server <- function(input, output){
  regions_subset <- reactive({ 
   req(input$region)
    filter(crime_plot, NAME %in% input$region)})

  output$scatterplot <- renderPlotly({
  ggplotly(ggplot(data = regions_subset(), 
                 aes_string(x = "YEAR", y = input$y, color = "NAME")) + 
                 geom_point() + 
                 labs(x = "Year", y = input$y) +
                 scale_color_discrete(name = "Regions"))})

  output$event <- renderPrint({
    k <- event_data("plotly_hover")
    if (is.null(k)) "Hover on a point!" else d})}

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 03 ноября 2018

когда я удаляю req(inputs$region) реактивный, график меняет метки осей всякий раз, когда вы меняете регионы или тип преступления. Вы также можете добавить theme в ggplotly, чтобы слова не перекрывались с меткой оси при ее изменении:

server <- function(input, output){

regions_subset <- reactive({ 
   filter(crime_plot, NAME %in% input$region)
 })

 output$scatterplot <- renderPlotly({
    ggplotly(ggplot(data = regions_subset(), 
             aes_string(x = "YEAR", y = input$y, color = "NAME")) + 
             geom_point() + 
             labs(x = "Year", y = input$y) +
             theme(text=element_text(size=10), 
                   axis.text.y=element_text(angle=90, hjust=1)) +
             scale_color_discrete(name = "Regions"))
 })

 output$event <- renderPrint({
     k <- event_data("plotly_hover")
     if (is.null(k)) "Hover on a point!" else d})}

 shinyApp(ui = ui, server = server)

Если вы хотите использовать метки, а не имена переменных, измените только эти два блока:

 selectInput(inputId = "y", 
            label = "Indicator to display on Y-axis", 
            choices = c("Road accidents", 
                        "Crime share", 
                        "Murders"), 
            selected = "Road accidents"),

И

output$scatterplot <- renderPlotly({
yvarnames <- c("ROADACCIDENT","CRIMESHARE","MURDER")
ggplotly(ggplot(data = regions_subset(), 
           aes_string(x = "YEAR", y = yvarnames[input$y], color = "NAME")) + 
           geom_point() + 
           labs(x = "Year", y = input$y) +
           theme(text=element_text(size=10), axis.text.y=element_text(angle=90, hjust=1)) +
           scale_color_discrete(name = "Regions"))
})
...