对 GGplot2 使用反应式数据集?

Posted

技术标签:

【中文标题】对 GGplot2 使用反应式数据集?【英文标题】:Using Reactive Dataset for GGplot2? 【发布时间】:2019-02-24 10:03:39 【问题描述】:

我正在尝试使用 ggplot2 而不是基本 R 的绘图函数来渲染绘图。

但是,我在 ggplot2 中使用响应式数据集时遇到了一些问题。

以下是与 base R 的绘图一起使用的代码:

library(shiny)
library(ggplot2)

# Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Javier Test"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(

      # Input: Select a file ----
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),

      # Horizontal line ----
      tags$hr(),

      checkboxInput('header', 'Header', TRUE),
      radioButtons('sep', 'Separator',
                   c(Comma=',',
                     Semicolon=';',
                     Tab='\t'),
                   ','),
      radioButtons('quote', 'Quote',
                   c(None='',
                     'Double Quote'='"',
                     'Single Quote'="'"),
                   '"'),

      #implementing dropdown column 
      selectInput('xcol', 'X Variable', ""),
      selectInput('ycol', 'Y Variable', "", selected = "")),

    # Show a plot of the generated distribution
    mainPanel(
      # Output: Data file ----
      plotOutput('MyPlot')
    )
  )
)

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output, session) 
  # added "session" because updateSelectInput requires it


  data <- reactive( 
    req(input$file1) ## ?req #  require that the input is available

    inFile <- input$file1 

    # tested with a following dataset: write.csv(mtcars, "mtcars.csv")
    # and                              write.csv(iris, "iris.csv")
    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep,
                   quote = input$quote)


    # Update inputs (you could create an observer with both updateSel...)
    # You can also constraint your choices. If you wanted select only numeric
    # variables you could set "choices = sapply(df, is.numeric)"
    # It depends on what do you want to do later on.

    updateSelectInput(session, inputId = 'xcol', label = 'X Variable',
                      choices = names(df), selected = names(df))
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable',
                      choices = names(df), selected = names(df)[2])

    return(df)
  )

  output$MyPlot <- renderPlot(
    x <- data()[,c(input$xcol, input$ycol)]
    plot(x)
  )
)

shinyApp(ui, server)

这是我试图改为 ggplot2 渲染图的部分:

  output$MyPlot <- renderPlot(
    ggplot(data, aes(x=input$xcol, y=input$ycol)) + geom_point()
  )

错误:ggplot2 不知道如何处理 reactiveExpr/reactive 类的数据

知道如何为 ggplot2 使用反应式数据集吗?

非常感谢!

更新

这是代码!我已经想通了。不是很好,有没有更好的表示方式?

  output$MyPlot <- renderPlot(
    x <- data()[,c(input$xcol, input$ycol)]
    ggplot(x, aes(x=x[,1], y=x[,2])) + geom_point()
  )

【问题讨论】:

嗨@SalmanLashkarara,是的,我可以将数据加载到df中。如果您使用基本 R 绘图运行第一个代码,则该应用程序可以运行。只是想用 ggplot2 代替! 是的,这是正确的。代码就像我提到的那样工作。如果将其插入 R 并使用任何 .csv 文件,它是可重现的。只是不确定我应该为 ggplot2 使用的参数 @SalmanLashkarara 我添加了正确的代码!去看看吧,希望可以改进!看起来很糟糕 我得到了答案 【参考方案1】:

现在效果很好:

  output$MyPlot <- renderPlot(
       x <- data()[,c(input$xcol, input$ycol)]

        ggplot(x, aes(x=data()[,c(input$xcol)], 
                      y=data()[,c(input$ycol)])) + geom_point()

      )

【讨论】:

【参考方案2】:

您可以使用ggplot 包中的aes_string 函数代替aes 函数,而不是在renderPlot 函数中多次设置数据。所以一个班轮解决方案将是:

output$MyPlot <- renderPlot(
ggplot(data = data(), aes_string(x = input$xcol, y = input$ycol)) + geom_point()
)

【讨论】:

哇这太棒了!非常感谢您分享您的知识! 乐于助人:)

以上是关于对 GGplot2 使用反应式数据集?的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 中 ggplot2 的 facet_wrap 功能对多个数据集进行箱线图比较?

在 ggplot2 中创建具有不同数据集的图例

R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组(只为椭圆形圈定的数据集配置色彩)

默认数据集示例 mtcars 和 ggplot2 中的“错误:提供给离散比例的连续值”

R CMD 检查:全局变量没有可见绑定(使用包中的数据/数据集时)

使用 ggplot2 复制食物可视化的节奏