2015-01-15 27 views
17

पर 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

+0

Rcharts में देखो: http://stackoverflow.com/questions/17524227/rcharts-rnvd3-tooltip-customisation या GooglveVis: http: //cran.r-project.org/web/packages /googleVis/vignettes/Using_Roles_via_googleVis.html –

+0

धन्यवाद। मैं दोनों का उपयोग करता हूं। लेकिन मैं प्लॉटिंग के लिए ggplot का उपयोग करना चाहता हूं। और इसकी पूरी लचीलापन का उपयोग करें। मुझे बस एक उपकरण टिप चाहिए। – guna

+1

एनिमेंट एक आर पैकेज है जो ggplot2 को एसवीजी में परिवर्तित करता है। चमकदार में ggplot2/एनिमेंट प्लॉट एम्बेड करने का एक उदाहरण यहां दिया गया है - https: // cpsievert।shinyapps.io/animintShiny/ टूलटिप जोड़ने के लिए, आप 'aes()' – Carson

उत्तर

15

दिखाने के लिए अगर मैं सवाल सही ढंग से समझ, इस की हाल ही में अद्यतन के साथ प्राप्त किया जा सकता चाहते हैं ggplot2 और बेस पैकेज दोनों के लिए चमकदार पैकेज। विंस्टन चांग और जो चेंग http://shiny.rstudio.com/gallery/plot-interaction-basic.html से इस उदाहरण का उपयोग करके, मैं इस समस्या को हल करने में सक्षम था। होवर अब plotOutput() में एक इनपुट तर्क है, जो कि ui में जोड़ा गया है ताकि वर्बैटिमटेक्स्टऑटपुट के साथ 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) 

मुझे आशा है कि इससे मदद मिलती है!

+0

वेरी कूल @ सोल्वी। धन्यवाद! – guna

9

आप पॉइंटर के पास कस्टम टूलटिप दिखाने के लिए थोड़ा सा 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 के लिए this अद्भुत कस्टम टूलटिप पाया। मेरा मानना ​​है कि इसे शायद ही कभी बेहतर किया जा सकता है। अधिक जानकारी here


+0

ग्रेट मिल! आपके संपादन में लिंक यह है कि मैंने इसके लिए सबसे अच्छा समाधान देखा है। एक बात यह ध्यान में रखना है कि पावेल का उल्लेख नहीं है कि यदि आप अपने ग्राफ के धुरी को स्केल करते हैं तो आपको अपने होवर $ x और/या $ y चर का उपयोग करने से पहले एक समान परिवर्तन लागू करने की आवश्यकता होगी। – divibisan

0

plotly का उपयोग करना, आप बस अपने ggplot खुद का एक इंटरएक्टिव संस्करण में अनुवाद कर सकते हैं। बस अपने ggplot वस्तु पर समारोह ggplotly फोन:

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) 

क्या टूलटिप में दिखाया गया है की अनुकूलन के लिए, उदाहरण के लिए लग रही है here

enter image description here