Подсказка, когда вы навешиваете ggplot на блестящий
Я создаю блестящее приложение.
Я рисую диаграммы с помощью ggplot.
Когда я нажимаю точки на графике, я хочу, чтобы всплывающая подсказка показывала один из столбцов в фрейме данных (настраиваемая подсказка)
Можете ли вы предложить лучший способ продвижения вперед.
Простое приложение:
# ui.R
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
h4("TEst PLot")),
mainPanel(
plotOutput("plot1")
)
)
))
# server.R
library(ggplot2)
data(mtcars)
shinyServer(
function(input, output) {
output$plot1 <- renderPlot({
p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
p <- p + geom_point()
print(p)
})
}
)
Когда я курсирую над точками, я хочу, чтобы он показывал mtcars $wt
Ответы
Ответ 1
Если я правильно понял вопрос, это может быть достигнуто с недавним обновлением блестящего пакета как для ggplot2, так и для базового пакета. Используя этот пример от Уинстона Чанга и Джо Ченга http://shiny.rstudio.com/gallery/plot-interaction-basic.html, я смог решить эту проблему. Hover теперь является входным аргументом в plotOutput(), поэтому он добавляется к ui вместе с verbatimTextOutput для отображения mtcars $wt для точки, зависающей над.
На сервере я в основном делаю вектор расстояний, который вычисляет расстояние от мыши до любой точки графика, и если это расстояние меньше 3 (работает в этом приложении), тогда оно показывает mtcars $wt для ближайшей точки к вашей мыши. Для четкого ввода $plot_hover возвращает список информации о местоположении мыши, и в этом примере извлекаются только элементы x и y из ввода $plot_hover.
library(ggplot2)
library(Cairo) # For nicer ggplot2 output when deployed on Linux
ui <- fluidPage(
fluidRow(
column(width = 12,
plotOutput("plot1", height = 350,hover = hoverOpts(id ="plot_hover"))
)
),
fluidRow(
column(width = 5,
verbatimTextOutput("hover_info")
)
)
)
server <- function(input, output) {
output$plot1 <- renderPlot({
ggplot(mtcars, aes(x=mpg,y=disp,color=factor(cyl))) + geom_point()
})
output$hover_info <- renderPrint({
if(!is.null(input$plot_hover)){
hover=input$plot_hover
dist=sqrt((hover$x-mtcars$mpg)^2+(hover$y-mtcars$disp)^2)
cat("Weight (lb/1000)\n")
if(min(dist) < 3)
mtcars$wt[which.min(dist)]
}
})
}
shinyApp(ui, server)
Надеюсь, это поможет!
Ответ 2
Вы также можете использовать немного JQuery и условный renderUI
чтобы показать пользовательскую подсказку рядом с указателем.
library(shiny)
library(ggplot2)
ui <- fluidPage(
tags$head(tags$style('
#my_tooltip {
position: absolute;
width: 300px;
z-index: 100;
}
')),
tags$script('
$(document).ready(function(){
// id of the plot
$("#plot1").mousemove(function(e){
// ID of uiOutput
$("#my_tooltip").show();
$("#my_tooltip").css({
top: (e.pageY + 5) + "px",
left: (e.pageX + 5) + "px"
});
});
});
'),
selectInput("var_y", "Y-Axis", choices = names(mtcars), selected = "disp"),
plotOutput("plot1", hover = hoverOpts(id = "plot_hover", delay = 0)),
uiOutput("my_tooltip")
)
server <- function(input, output) {
data <- reactive({
mtcars
})
output$plot1 <- renderPlot({
req(input$var_y)
ggplot(data(), aes_string("mpg", input$var_y)) +
geom_point(aes(color = factor(cyl)))
})
output$my_tooltip <- renderUI({
hover <- input$plot_hover
y <- nearPoints(data(), input$plot_hover)[ ,c("mpg", input$var_y)]
req(nrow(y) != 0)
verbatimTextOutput("vals")
})
output$vals <- renderPrint({
hover <- input$plot_hover
y <- nearPoints(data(), input$plot_hover)[ , c("mpg", input$var_y)]
# y <- nearPoints(data(), input$plot_hover)["wt"]
req(nrow(y) != 0)
# y is a data frame and you can freely edit content of the tooltip
# with "paste" function
y
})
}
shinyApp(ui = ui, server = server)
Редакция:
После этого поста я искал в интернете, чтобы посмотреть, можно ли сделать это более красиво, и нашел эту замечательную настраиваемую подсказку для ggplot. Я считаю, что вряд ли это можно сделать лучше, чем это.
Ответ 3
Используя plotly
, вы можете просто перевести ваш ggplot
в свою интерактивную версию. Просто вызовите функцию ggplotly
на свой объект ggplot
:
library(plotly)
data(mtcars)
shinyApp(
ui <- shinyUI(fluidPage(
sidebarLayout(sidebarPanel( h4("Test Plot")),
mainPanel(plotlyOutput("plot1"))
)
)),
server <- shinyServer(
function(input, output) {
output$plot1 <- renderPlotly({
p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
p <- p + geom_point()
ggplotly(p)
})
}
))
shinyApp(ui, server)
Для настройки того, что показано в подсказке, смотрите, например. здесь.
![введите описание изображения здесь]()
Ответ 4
Вместе с моим коллегой я выпустил пакет GGTips, который делает именно это, добавляя всплывающие подсказки на графиках. Мы создали наше собственное решение, потому что у нас возникли проблемы при воссоздании наших сложных графиков с использованием графика, который не на 100% совместим с ggplot2. Git-репо имеют ссылку на онлайн-демо.
![enter image description here]()