#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
затем пытается сопоставить их с исходным масштабом, который не работает.
Однако у вас есть пара вариантов:
- Преобразуйте данные самостоятельно и адаптируйте галочки по оси y с помощью
scale_y_continuous
- Адаптируйся
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 идеально подходит для меня, и установка точек останова вручную на самом деле является плюсом.