Home > Mobile >  how to add reactive x and y axis labels to shiny plotly graph?
how to add reactive x and y axis labels to shiny plotly graph?

Time:01-09

I am struggling to find a way to add axis labels to this plotly graph. Since it's a bit different than when I've used plotly or even ggplot outside of apps, I can't seem to make it work. Any tips?

I would need the x and y axis labels to change with the widget on the right side of the code. I'm also not sure if the labels already show and its a matter of the graph being too large to show them.

library(shiny)
library(plotly)
library(tibble)
library(tidyverse)
library(tidyr)
library(readr)
library(dplyr)
library(ggplot2)
library(gapminder)


#read data
gm <- gapminder


# Define UI ----
ui <- fluidPage(
  column(3,offset = 4, titlePanel("Explore Gapminder Data with Shiny")),
  headerPanel('Graphs'),
  mainPanel(
    plotlyOutput('plot')
  ),
  sidebarPanel(
    #variable selection for x-axis
    selectInput(inputId ='xvrbl', #The input slot that will be used to access the value.
                label = 'X-Axis Variable', #Display label for the control, or NULL for no label.
                choices = colnames(gm), #List of values to select from
                selected = 'CO2 emissions (metric tons per capita)'
    ),
    
    checkboxInput(inputId = "LogX", 
                  label = "Log Transform", 
                  value = FALSE),
    
    #variable selection for y-axis
    selectInput(inputId ='yvrbl', #The input slot that will be used to access the value.
                label = 'Y-Axis Variable', #Display label for the control, or NULL for no label.
                choices = colnames(gm), #List of values to select from
                selected = 'gdpPercap'
    ),
    
    checkboxInput(inputId = "LogY", 
                  label = "Log Transform", 
                  value = FALSE),
    
    # date range - slider
    sliderInput(
      inputId = "time",
      label = "Years",
      min = min(gm$year),
      max = max(gm$year),
      step = 5,
      value = range(gm$year)
    )
  )
)

server <- function(input, output) {
  x <- reactive({
    x <- dat()[[input$xvrbl]]
    if (input$LogX) x <- log(x)
    return(x)
  })
  
  y <- reactive({
    y <- dat()[[input$yvrbl]]
    if (input$LogY) y <- log(y)
    return(y)
  })
  
  dat <- reactive({
    subset(gm, year >= input$time[[1]], year <= input$time[[2]])
  })
  
  output$plot <- renderPlotly({
    plot_ly(
      x = x(),
      y = y(),
      type = "scatter",
      mode = "markers",
      color = dat()$continent
    )
  })  
}

# Run the app
shinyApp(ui = ui, server = server)

CodePudding user response:

You should specify the layout parameter to renderPlotly:

output$plot <- renderPlotly({
    plot_ly(
      x = ~x(),
      y = ~y(),
      type = "scatter",
      mode = "markers",
      color = dat()$continent) %>%
      layout(
      yaxis = list(title = input$yvrbl),
      xaxis = list(title = input$xvrbl)
      )
    
  })  
  • Related