我发明了一个包含 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”,该点应更改为红色),而其余部分应保持不变。
我非常感谢您的帮助。预先感谢社区阅读我的文章:)
在绘制数据之前,您需要包含在数据集中选择的名称的信息。为此,我们将 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)