在长格式数据集上使用ggplot创建散点图,随后在Shiny

时间:2018-06-19 08:13:11

标签: r ggplot2 shiny

我一直坚持整洁的数据原则,并将我的数据框转换为长数据类型格式。但是,在这样做之后,我意识到我很难从长数据中创建散点图。

以下内容与我的数据类似。有三列:主题ID,键和值。列"键"指的是主题已完成的特定问题编号,其中"值为"列指的是给定问题的实际值。对于某些问题,可能会出现空白"价值"作为主题的专栏未能完成它们。

df <- data.frame(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
             key = c("Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", 
                     "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2",
                     "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3"),
             value = c(1, NA, 3, 4, 3, 5, 5, 3, 2, 7, 2, 1, 8, 3, NA, 1, 8, 2, 1, 4, 6, 7, 1, 5, NA, 1, 5, 8, NA, 3))

我尝试了以下代码来创建散点图:

library(ggplot2)
ggplot(na.omit(df), aes(x = value[key == "Q1"], y = value[key == "Q2"])) + geom_point()

然而,R提示我错误&#34;美学必须是长度1或与数据相同&#34;即使我使用na.omit来删除丢失的案例。

我在Stackoverflow上搜索过,发现了两个类似的线程。第一个帖子(见here)没有答案,而第二个线程有点相似&#34;线程(参见here)建议数据太整洁。对于后者,这是否意味着我应该&#34;不整洁&#34;我的数据,使每个问题/变量代替一列?

我打算在Shiny应用程序中使用这样的散点图(如果长格式数据源有效),使用类似下面的内容(这不起作用):

output$scatterplot <- renderPlot({
    ggplot(df(), aes(x = input$value[var1], y = input$value[var2])) + geom_point()

谢谢,非常感谢!

编辑:

我已经从评论中尝试了@patL解决方案。代码本身就可以运行。但是,它对Shiny无效。

以下是我在Shiny中使用的代码:

# Define the User Interface for app
ui <- fluidPage(
  titlePanel("Scatter Plot App"),

  sidebarLayout(
    sidebarPanel(
      selectInput("x_scatter", "Select variable for x-axis", choices = unique(df$key)),
      selectInput("y_scatter", "Select variable for y-axis", choices = unique(df$key))
    ),
    mainPanel(
      plotOutput("scatter")
    )
  )
)

# Define server logic for app
server <- function(input, output) {
  scatter_data <- reactive({
    df %>%
      na.omit() %>%
      spread(key, value)
  })

  output$scatter <- renderPlot({
    ggplot(scatter_data(), aes(x = input$x_scatter, y = input$y_scatter)) + geom_point()
  })
}

当我运行应用程序时,结果是散点图,中间有一个点,这是不正确的。还有更多的数字变量(例如Q3,Q4,Q5等),但在这个例子中,我把它们遗漏了。

1 个答案:

答案 0 :(得分:0)

我已经设法在@patL帮助下回答了自己的问题。当我在aes中使用ggplot时,散点图无法在Shiny中工作。当我使用aes_string时,散点图显示正确。

@patL建议使用以下dplyr管道:

df %>% na.omit() %>% spread(key, value)

我将其更改为以下内容:

df %>% spread(key, value) %>% filter(complete.cases(.))

上面的dplyr管道在删除具有NA值的行之前,首先将数据帧从长格式转换为宽格式。如果我在na.omit之前使用过spread,则每次我选择其他列作为散点图的输入时,R都会提示警告消息,指出它们已删除了包含缺少值的行。

Shiny应用程序的实际工作脚本如下:

library(shiny)
library(dplyr)
library(ggplot2)
library(tidyr)

df <- data.frame(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
             key = c("Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", 
                     "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2",
                     "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3"),
             value = c(1, NA, 3, 4, 3, 5, 5, 3, 2, 7, 2, 1, 8, 3, NA, 1, 8, 2, 1, 4, 6, 7, 1, 5, NA, 1, 5, 8, NA, 3))


ui <- fluidPage(

   titlePanel("Scatter Plot App"),

   sidebarLayout(
      sidebarPanel(
          selectInput("x_scatter", "Select variable for x-axis", choices = unique(df$key)),
          selectInput("y_scatter", "Select variable for y-axis", choices = unique(df$key))
      ),

      mainPanel(
         plotOutput("scatter")
      )
   )
)

server <- function(input, output) {

    scatter_data <- reactive({
         df %>%
             spread(key, value) %>%
             filter(complete.cases(.))
     })

    output$scatter <- renderPlot({
         ggplot(scatter_data(), aes_string(x = input$x_scatter, y = input$y_scatter)) + geom_point()
     })
}

shinyApp(ui = ui, server = server)