首页 > 解决方案 > 在 R Shiny 图上选择不同颜色的线条

问题描述

我正在尝试创建一个闪亮的应用程序,该应用程序最多显示 2 条不同颜色的线条,具体取决于用户选择查看的线条。但是,我不断收到“意外字符”错误。

我认为问题出selectInput(inputId = "z", label = "Source", choices = c("social_media", "google_ads"), selected = c("social_media", "google_ads"), multiple = TRUE)在下面代码的行中,当我用choicesselected替换时source,图表似乎可以工作(尽管不允许用户选择和查看不同的选项)。

df 是一个如下所示的数据框:

av_purchase_count     days_since_first_use    source
2                     1                       social_media
5                     2                       social_media
4                     1                       google_ads
6                     2                       google_ads

...这是我尝试过的代码:

library(shiny)
library(ggplot2)
df <- read_xlsx("~/df.xlsx")

ui <- fluidPage(

   titlePanel("df"),

   sidebarLayout(
      sidebarPanel(
         selectInput(inputId = "x", label = "Days since first use", choices = "days_since_first_use", selected = "days_since_first_use"),
         selectInput(inputId = "y", label = "Average Purchase Count", choices = "av_purchase_count", selected = "av_purchase_count"),
         selectInput(inputId = "z", label = "Source", choices = c("social_media", "google_ads"), selected = c("social_media", "google_ads"), multiple = TRUE)
      ),

      mainPanel(
         plotOutput("scatterplot")
      )
   )
)

server <- function(input, output) {

   output$scatterplot <- renderPlot({
      # generate bins based on input$bins from ui.R
     ggplot(data = df, aes_string(x = input$x, y = input$y, colour = input$z)) +
       geom_point()
      })
}

shinyApp(ui = ui, server = server)

我希望最终图表允许用户选择是否要查看 、 或两者的结果google_adssocial_media默认情况下,两者)。

非常感谢,希望这是有道理的。

标签: rshiny

解决方案


你可以通过

output$scatterplot <- renderPlot({
  ggplot(
    data = df %>% filter(source %in% input$z),
    aes_string(x = input$x, y = input$y)
  ) + geom_point(aes(colour = source))
})

变量input$z反映用户选择显示的内容(google_ads 或 social_media 或两者)。这是一个反应向量,它会在每次自身发生变化时触发情节重绘。每次更改时,过滤数据框以仅保留用户想要查看的内容df %>% filter(source %in% input$z)。要注意的另一件事是根据“源”为点着色,您需要使用aes(color = source)notaes_string因为您不想将源评估为变量。

记得安装和加载库(tidyverse),ggplot2 也是 tidyverse 的一部分,所以你可以library(ggplot2)library(tidyverse). 如果你真的不想用tidyverse,那就用df[df$source %in% input$z, ]过滤数据


推荐阅读