麻烦使用缩放ggplot2闪亮

时间:2017-12-22 16:37:28

标签: r plot ggplot2 shiny zoom

作为用户,我是新来的,但我在尝试使用Rstudio中的闪亮创建数据可视化应用程序时遇到了一个问题,我疯狂地搜索过。

问题是,我想读一个.csv,了解它的列,选择我想要的列作为x和y轴,用我选择的图形类型绘制它们并且能够放大到二级随时随地绘制。

我几乎就在那里,事实是我试图用刷子做的缩放是不能正常工作的。它不能正确理解轴的值,而是像两个轴一样只有0到1,然后用正确的方式放大,但是xlim和ylim是错误的。

这是我的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")
#    )
  )
))

然后我的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
    }
  })

})

只需忽略不是geom_point的其他图。一旦我得到这个工作,其他人应该工作得很好,我猜...

非常感谢,我正在努力解决这个问题! 有些文章是葡萄牙文,但我认为一切都是可以理解的。

1 个答案:

答案 0 :(得分:0)

您的刷卡点在brushOpts中的比例从0到1,因为您printplot是您的变量,而不是仅仅返回它。

<强> 1。简短的劝告

这个简短的应用程序显示了拉丝点刻度之间的差异,根据它的返回方式。

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。来自您问题的可重复示例

下面我使用iris数据集创建了一个可重现的示例 另外,由于重音,我改变了一些字符。

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
    }
  })

})
相关问题