我想创建一个包含shiny
和ggplot2
的互动图。我已经成功地使用geom_point
和其他geoms
以及明显的x
和y
轴进行此操作。但是,当使用类似geom_bar
的内容时,由于您没有y
变量,因此更难。
有一个解决方案here和here从click事件中提取x
变量以进行所需的过滤,但这些变量都不能处理带有facet的图。我想在ggplot
上使用facet上的点击选项。我尝试在第一个链接调整代码,但这并没有成功。
library(ggplot2)
library(shiny)
ui <- fluidPage(
fluidRow(
plotOutput("plot1", height = 300, width = 300,
click = "plot1_click",
)
),
verbatimTextOutput("x_value"),
verbatimTextOutput("selected_rows")
)
server <- function(input, output) {
output$plot1 <- renderPlot({
ggplot(ToothGrowth, aes(supp)) + geom_bar(stat = "count") + facet_wrap(~dose)
})
# Print the name of the x value
output$x_value <- renderPrint({
if (is.null(input$plot1_click$x)) return()
lvls <- levels(ToothGrowth$supp)
lvls[round(input$plot1_click$x)]
})
# Print the rows of the data frame which match the x value
output$selected_rows <- renderPrint({
if (is.null(input$plot1_click$x)) return()
keeprows <- round(input$plot1_click$x) == as.numeric(ToothGrowth$supp)
ToothGrowth[keeprows, ]
})
}
shinyApp(ui, server)
点击任意一个条形图可以过滤到x
值,但包含所有方面的结果。我想只包含点击面的结果。
我已尝试将nearPoints
与pannelvar1
一起使用,但由于我没有传递y
变量,因此会抛出错误。
有什么想法吗?
答案 0 :(得分:4)
我改变了你的最后一个功能并得到了我认为你想要的结果。
output$selected_rows <- renderPrint({
if (is.null(input$plot1_click$x)) return()
panel = input$plot1_click$panelvar1
keeprows <- round(input$plot1_click$x) == as.numeric(ToothGrowth$supp) & ToothGrowth$dose==panel
ToothGrowth[keeprows, ]
})
我不确定您尝试访问panelvar1时遇到了什么错误,但我使用配置选项options(shiny.trace=TRUE)
来检查如何访问面板变量(下面添加的日志消息)。也许你只是想从错误的位置拉出价值
RECV {"method":"update","data":{"plot1_click":{"x":1.1651034873830555,"y":4.268063179119527,"panelvar1":2,"mapping":{"x":"supp","y":null,"panelvar1":"dose"},"domain":{"left":0.4,"right":2.6,"bottom":-0.5,"top":10.5},"range":{"left":213.995433789954,"right":294.520547945205,"bottom":268.013698630137,"top":23.4383561643836},"log":{"x":null,"y":null},".nonce":0.39996409229934216}}}