简体   繁体   English

ggplot2 Shiny上使用缩放麻烦

[英]Trouble using zoom on ggplot2 shiny

I'm new here as a user but I have searched like crazy for a problem I have encountered while trying to create a data visualization app with shiny in Rstudio. 我是用户的新用户,但是在尝试创建带有Rstudio的闪亮数据可视化应用程序时遇到的问题让我疯狂地搜索。

The thing is, I want to read a .csv, understand it's columns, select wich column I want as x and as y axis, plot them with the type of graph I have chosen and be able to zoom in in a secondary plot whenever I want. 关键是,我想阅读一个.csv,了解它的列,选择要作为x轴和y轴的两列,用我选择的图形类型对其进行绘制,并且每当我可以放大第二个图时想。

I'm almost there, the thing is that the zoom with brush that I have tried to do is no working properly. 我快到了,问题是我尝试使用画笔进行的缩放无法正常工作。 It doesn't understand the values of the axis correctly, instead it works as if both axis where only from 0 to 1, and then zoom in the correct way but with the wrong xlim and ylim. 它不能正确理解轴的值,相反,它的工作方式就像两个轴都从0到1一样,然后以正确的方式缩放,但xlim和ylim设置错误。

Here is my ui.R: 这是我的ui.R:

library(shiny)
library(ggplot2)

base = read.csv("TESTE.csv", sep = ";")
tipos <- c("Dispersão", "Histograma", "Boxplot", "Área")

shinyUI(fluidPage(


  titlePanel("MGM"),


  sidebarLayout(
    sidebarPanel(
      selectInput("selectedColX", "Select colum for X axis", choices = colnames(base), selected = colnames(base)[7]),
      selectInput("selectedColY", "Select colum for Y axis", choices = colnames(base), selected = colnames(base)[4]),
      selectInput("selectedColor", "Select colum for colour axis", choices = colnames(base), selected = colnames(base)[6]),
      selectInput("seletedGraph", "Select type of graph", choices = tipos, selected = tipos[1])
    ),


    fluidRow(

      column(width = 12, class = "well",
             h4("Left plot controls right plot"),
             fluidRow(
               column(width = 10,
                      plotOutput("Disp", height = 300,
                                 brush = brushOpts(
                                   id = "Disp_brush",
                                   clip = TRUE,
                                   resetOnNew = TRUE
                                 )
                      )
               ),
               column(width = 10,
                      plotOutput("DispZoom", height = 300)
               )
             )
      )

    )

#    mainPanel(
#      
#      plotOutput("Hist"),
#      plotOutput("Box"),
#      plotOutput("Ar")
#    )
  )
))

And then my Server.R: 然后我的Server.R:

library(shiny)
library(ggplot2)

base = read.csv("TESTE.csv", sep = ";")
tipos <- c("Dispersão", "Histograma", "Boxplot", "Área")

shinyServer(function(input, output) {

  output$Disp <- renderPlot({

    validate(need(input$seletedGraph=="Dispersão", message=FALSE))

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis))
    gg <- gg  + geom_point()

    plot(gg)

  })

  ranges2 <- reactiveValues(x = NULL, y = NULL)

  output$DispZoom <- renderPlot({

    validate(need(input$seletedGraph=="Dispersão", message=FALSE))

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) + geom_point() + coord_cartesian(xlim = ranges2$x, ylim = ranges2$y)
    plot(gg)

  })

  output$Hist <- renderPlot({

    validate(need(input$seletedGraph=="Histograma", message=FALSE))

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis))
    gg <- gg  + geom_histogram()
    gg

  })

  output$Box <- renderPlot({

    validate(need(input$seletedGraph=="Boxplot", message=FALSE))

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis))
    gg <- gg  + geom_boxplot()
    gg

  })

  output$Ar <- renderPlot({

    validate(need(input$seletedGraph=="Área", message=FALSE))

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis))
    gg <- gg  + geom_area()
    gg

  })

  observe({
    brush <- input$Disp_brush
    if (!is.null(brush)) {
      ranges2$x <- c(brush$xmin, brush$xmax)
      ranges2$y <- c(brush$ymin, brush$ymax)

    } else {
      ranges2$x <- NULL
      ranges2$y <- NULL
    }
  })

})

Just ignore the other plots that are not the geom_point. 只需忽略不是geom_point的其他图。 As soon as I get this one working the others should work just fine, I guess... 我想,只要我使这个工作正常,其他人就应该工作正常。

Thank you so much, I'm having such a pain trying to figure this out! 非常感谢您,我很难解决这个问题! Some texts are in portuguese, but I think everything is understandable enough. 有些文本是葡萄牙语,但我认为一切都可以理解。

Your brushed points are on scale from 0 to 1 in the brushOpts because you print or plot your variable instead of just returning it. brushOpts中,刷点的比例是从0到1,因为您printplot变量而不是仅仅返回变量。

1. Short desmonstration 1.简短的示范

This short app show the difference between the brushed points scales according to how it has been returned. 这个简短的应用程序根据返回的方式显示刷点之间的差异。

library(shiny)


ui <- fluidPage(

  fluidRow(
    column(6,
      # My plot rendering with print or plot
      h4("Plot with print or plot variable"),
      plotOutput("plot1", height = 300, brush = brushOpts(id = "plot1_brush", clip = TRUE, resetOnNew = TRUE)),
      p(),
      # Brushed points
      "Brushed points informations, scale from 0 to 1",
      verbatimTextOutput("brush1")
    ),
    column(6,
      # My plot rendering without print or plot
      h4("Plot with a return variable"),
      plotOutput("plot2", height = 300, brush = brushOpts(id = "plot2_brush", clip = TRUE, resetOnNew = TRUE)),
      p(),
      # Brushed points
      "Brushed points informations, scale according to x and y variables",
      verbatimTextOutput("brush2")
    )
  )
)


server <- function(input, output) {

  data <- iris

  # Plot1 I render with print or plot
  output$plot1 <- renderPlot({
    gg <- ggplot(data, aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point()
    plot(gg)
  })

  # Brush points from plot1
  output$brush1 <- renderPrint({
    input$plot1_brush
  })

  # Plot2 I render just returning the variable
  output$plot2 <- renderPlot({
    gg <- ggplot(data, aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point()
    return(gg)
  })

  # Brush points from plot2
  output$brush2 <- renderPrint({
    input$plot2_brush
  })
}


shinyApp(ui = ui, server = server)

2. Reproductible example from your question 2.您问题中的可复制示例

Herebelow I made a reproductible example using the iris dataset. 在下文中,我使用iris数据集制作了一个可复制的示例。
Also, I changed some characters because of accents. 另外,由于重音,我更改了一些字符。

ui.R 用户界面

library(shiny)
library(ggplot2)

shinyUI(fluidPage(


  titlePanel("MGM"),


  sidebarLayout(
    sidebarPanel(
      uiOutput("plots_parameters")
    ),

    mainPanel(
      fluidRow(
        column(12,
          h4("Plot without zoom"),
          plotOutput("Disp", height = 300, brush = brushOpts(id = "Disp_brush", clip = TRUE, resetOnNew = TRUE))
        )
      ),
      fluidRow(
        column(12,
          h4("Zoomed plot"),
          plotOutput("DispZoom", height = 300)
        )
      )
    )
  )
))

server.R 服务器

library(shiny)
library(ggplot2)

base = iris


shinyServer(function(input, output) {

  output$plots_parameters <- renderUI({
    tipos <- c("Dispersao", "Histograma", "Boxplot", "Área")
    choices <- colnames(base)
    div(
      selectInput("selectedColX", "Select colum for X axis", choices = choices, selected = "Sepal.Length"),
      selectInput("selectedColY", "Select colum for Y axis", choices = choices, selected = "Petal.Length"),
      selectInput("selectedColor", "Select colum for colour axis", choices = choices, selected = "Species"),
      selectInput("seletedGraph", "Select type of graph", choices = tipos, selected = "Dispersao")
    )  
  })

  output$Disp <- renderPlot({

    req(input$seletedGraph == "Dispersao")

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis))
    gg <- gg  + geom_point()

    # Return variable without print or plot
    gg

  })

  ranges2 <- reactiveValues(x = NULL, y = NULL)

  output$DispZoom <- renderPlot({

    req(input$seletedGraph == "Dispersao")

    y_axis <- input$selectedColY
    x_axis <- input$selectedColX
    color_axis <- input$selectedColor

    gg <- ggplot(base, aes_string(x = x_axis, y = y_axis, color = color_axis)) + geom_point() +
      coord_cartesian(xlim = ranges2$x, ylim = ranges2$y)
    # Return variable without print or plot
    gg

  })

  observe({
    brush <- input$Disp_brush
    if (!is.null(brush)) {
      ranges2$x <- c(brush$xmin, brush$xmax)
      ranges2$y <- c(brush$ymin, brush$ymax)

    } else {
      ranges2$x <- NULL
      ranges2$y <- NULL
    }
  })

})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM