RShiny:如何使用 selectInput 为特定点(散点图)着色? [ggplotly]

问题描述 投票:0回答:1

我发明了一个包含 3 个变量的数据集:

1.学生姓名(`grades$Name`)

2.数学成绩 (`grades$math`) 和

3.他们参加的课程数量(`成绩$参与`)。

通过这个df,我创建了一个散点图,用ggplot2分析不同学生的成绩和参与度之间的关系。我想要的是创建一个交互式情节,我可以在其中可视化每个学生及其各自的成绩和参与情况。这就是为什么使用 ggplotly 生成交互式绘图,这样我就可以可视化每个学生各自的成绩/参与情况。这是语法:

library(tidyverse)
library(plotly)
library(shiny)

#Data frame
grades <- data.frame(Name = c("A","B","C","D",
                              "E","F","G","H",
                              "I","J","K","L"), math=c(10,15,20,05,
                                                        18,11,08,03,
                                                        19,05,06,13),participation = c(10,10,10,4,
                                                                                       8,5,4,2,
                                                                                       8,6,5,6))
#Graph
Graph <- grades %>% ggplot(aes(math, participation, label=Name)) + 
  geom_point() + 
  geom_smooth(method= "lm",se=F) +
  labs(title= "Grades and Participation of students", 
       x="Grades in math", y="Participation in math's class")
#Interactive graph
iGraph <- ggplotly(Graph, tooltip= c("Name", "x", "y"))
print(iGraph)

尽管如此,我想包括一个“搜索栏”,我可以在其中输入学生的姓名(年级$姓名),以便代表该特定学生的点将被涂上其他颜色(在本例中我选择了红色)。我读到为了合并功能,我需要创建一个 ShinyApp。我是 ShinyApp 的初学者,所以我尝试寻找解决方案,但没有任何效果。这是我一直在使用的代码:

ui <- fluidPage( 
  titlePanel("Grades and Participation"),
  selectInput(inputId = "name", 
              label = "Student's Name",
              choices = grades$Name,
              selected = "A"),
  plotlyOutput("scatterplot")
  )

#Server
server <- function(input, output, session) {
  
  #Subset of filter data
  filter_data <- reactive({grades %>% filter(Name %in% input$name)})
  
  output$scatterplot <- renderPlotly({iGraph + 
  geom_point(filter_data, aes(color= "red"))})
}

#Shiny
shinyApp(ui, server)

向我显示的错误消息如下:

Warning: Error in geom_point: `mapping` must be created by `aes()`
  111: <Anonymous>
  110: signalCondition
  109: signal_abort
  108: rlang::abort
  107: cli::cli_abort
  106: validate_mapping
  105: layer
  104: geom_point
  103: renderPlotly [#6]
  102: func
   99: shinyRenderWidget
   98: func
   85: renderFunc
   84: output$scatterplot
    3: runApp
    2: print.shiny.appobj
    1: <Anonymous>

我认为一个问题是,在创建 ggplotly 后我无法添加另一层 ggplotly,但在这种情况下,如何使图形更改我在“中写入的单个点(又名学生)的颜色” ShinyApp 的搜索栏”?

我想要的是显示用 ggploty 制作的交互式图表(这样我可以在图表中移动光标并查看每个学生的成绩和参与度),但我也希望能够使用“搜索栏”搜索每个学生”。理想的输出是图表仅更改我选择的学生的颜色(例如,如果我指定学生“A”,该点应更改为红色),而其余部分应保持不变。

我非常感谢您的帮助。预先感谢社区阅读我的文章:)

r ggplot2 shiny plotly ggplotly
1个回答
0
投票

在绘制数据之前,您需要包含在数据集中选择的名称的信息。为此,我们将 ggplot 和 ggplotly 调用移至

renderPlotly()
函数中。添加对于所选名称为 TRUE 的
selected
变量,并将其用于
geom_point()
中的点的着色。
scale_color_manual()
控制颜色,使用
guides(color = "none")
我们可以隐藏图例。

library(tidyverse)
library(plotly)
library(shiny)

#Data frame
grades <- data.frame(Name = c("A","B","C","D",
                              "E","F","G","H",
                              "I","J","K","L"), math=c(10,15,20,05,
                                                       18,11,08,03,
                                                       19,05,06,13),participation = c(10,10,10,4,
                                                                                      8,5,4,2,
                                                                                      8,6,5,6))



ui <- fluidPage( 
  titlePanel("Grades and Participation"),
  selectInput(inputId = "name", 
              label = "Student's Name",
              choices = grades$Name,
              selected = "A"),
  plotlyOutput("scatterplot")
)

#Server

server <- function(input, output, session) {
  
  #Subset of filter data
  filter_data <- reactive({grades %>% filter(Name %in% input$name)})
  
  output$scatterplot <- 
    renderPlotly({
      
      #Graph
      Graph <- grades %>%
        mutate(selected = Name == input$name) |>
        ggplot(aes(math, participation, label = Name)) +
        geom_point(aes(color = selected)) +
        scale_color_manual(values = c("TRUE" = "red", "FALSE" = "black")) +
        guides(color = "none") +
        geom_smooth(method = "lm", se = F) +
        labs(title = "Grades and Participation of students",
             x = "Grades in math", y = "Participation in math's class")
      #Interactive graph
      ggplotly(Graph, tooltip = c("Name", "x", "y"))
      
    })
}

#Shiny
shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.