Блестящие кликабельные точки приложения, не работающие с осью y масштаба журнала

#r #ggplot2 #shiny

Вопрос:

Впервые я действительно не могу найти этот ответ здесь, поэтому я надеюсь, что вы все сможете мне помочь, я уверен, что есть довольно простое решение.

Я делаю Блестящий график вулкана с кликабельными точками, чтобы дать мне таблицу с данными об этой точке. Если я использую функцию trans (которую я нашел здесь, спасибо, любезный незнакомец) в scale_y_continuous() на моем графике, точки в масштабируемой области больше не доступны для кликабельности. Как я могу масштабировать ось таким образом и при этом иметь доступные точки?

Мой код с некоторыми поддельными данными, у которых та же проблема:

 ## Read in necessary libraries, function, and data 
library(shiny)
library(ggplot2)
library(dplyr)
library(scales)

reverselog_trans <- function(base = exp(1)) {
    trans <- function(x) -log(x, base)
    inv <- function(x) base^(-x)
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
              log_breaks(base = base), 
              domain = c(1e-100, Inf))
}

pretend_data <- tibble(data=1:5, estimate = runif(5, min = -1, max = 2), plot = c(1e-50, 2e-35, 5e-1, 1, 50))

# Define UI for application that draws a volcano plot
ui <- fluidPage(
    # Application title
    titlePanel("Pretend Plot"),
        plotOutput("plot", click = "plot_click"),
        tableOutput("data")
 )

# Define server logic required to draw a volcano plot
server <- function(input, output, session) {
    output$plot <- renderPlot({
        ggplot(data = pretend_data, aes(x=estimate, y=plot))   
            geom_vline(xintercept=c(-1, 1), linetype=3)  
            geom_hline(yintercept=0.01, linetype=3)  
            geom_point()   
            scale_y_continuous(trans = reverselog_trans(10))
    }, res = 96)
    
    output$data <- renderTable({
        req(input$plot_click)
        nearPoints(pretend_data, input$plot_click)
    })
}

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

 

Ответ №1:

Проблема в том, что input$plot_click возвращает координаты в преобразованном масштабе. nearPoints затем пытается сопоставить их с исходным масштабом, который не работает.

Однако у вас есть пара вариантов:

  1. Преобразуйте данные самостоятельно и адаптируйте галочки по оси y с помощью scale_y_continuous
  2. Адаптируйся pretend_data к nearPoints вызову.

Вариант 1

Это требует, чтобы вы сами управляли делениями по оси y и вам потребовалось бы еще немного повозиться, чтобы получить те же самые повторения, как в вашем примере.

 pretend_data_traf <- pretend_data %>%
   mutate(plot = reverselog_trans(10)$transform(plot))

# Define UI for application that draws a volcano plot
ui <- fluidPage(
   # Application title
   titlePanel("Pretend Plot"),
   plotOutput("plot", click = "plot_click"),
   tableOutput("data")
)

# Define server logic required to draw a volcano plot
server <- function(input, output, session) {
   output$plot <- renderPlot({
      ggplot(data = pretend_data_traf, aes(x=estimate, y=plot))   
         geom_vline(xintercept=c(-1, 1), linetype=3)  
         geom_hline(yintercept=0.01, linetype=3)  
         geom_point()  
         ## would need to define breaks = to get same tick mark positions
         scale_y_continuous(labels = reverselog_trans(10)$inverse)
   }, res = 96)   
   output$data <- renderTable({
      req(input$plot_click)
      nearPoints(pretend_data_traf, input$plot_click)
   })
}

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

Вариант 2

 pretend_data_traf <- pretend_data %>%
   mutate(plot = reverselog_trans(10)$transform(plot))

# Define UI for application that draws a volcano plot
ui <- fluidPage(
   # Application title
   titlePanel("Pretend Plot"),
   plotOutput("plot", click = "plot_click"),
   tableOutput("data")
)

# Define server logic required to draw a volcano plot
server <- function(input, output, session) {
   output$plot <- renderPlot({
      ggplot(data = pretend_data, aes(x=estimate, y=plot))   
         geom_vline(xintercept=c(-1, 1), linetype=3)  
         geom_hline(yintercept=0.01, linetype=3)  
         geom_point()  
         scale_y_continuous(trans = reverselog_trans(10))
   }, res = 96)   
   output$data <- renderTable({
      req(input$plot_click)
      nearPoints(pretend_data_traf, input$plot_click) %>%
         mutate(plot = reverselog_trans(10)$inverse(plot))
   })
}

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

Комментарии:

1. Спасибо за объяснение причины проблемы — я думал, что проблема будет в чем-то подобном, но я недостаточно сведущ, чтобы знать, как это исправить. Вариант 1 идеально подходит для меня, и установка точек останова вручную на самом деле является плюсом.