如何将用户输入与 R shiny 中的 gganimate 图形连接起来?
How to connect user input with gganimate graph in R shiny?
有没有办法 link 用户输入(x 轴、y 轴、颜色等)到 R shiny 中的 gganimate 图形?这样当用户从下拉列表中选择不同的输入(x 轴、y 轴、颜色等)时。 gganimate 图表会填充不同的 x 轴、y 轴、颜色等,以便可以相应地更改?
我试过的编码如下。由于我在 UI 中保存的变量名(xValue、yValue、colorValue 等放入 ggplot 函数)导致错误,不适用于服务...
UI 代码的想法来自这里:https://shiny.rstudio.com/articles/layout-guide.html
它会像这样显示:
library(shiny)
library(shinythemes)
library(palmerpenguins)
library(gganimate)
library(dplyr)
library(tidyr)
library(ggplot2)
library(gapminder)
data(package = 'palmerpenguins')
ui <- fluidPage(
navbarPage(
"Animated penguins data",
tabPanel("Navbar 2",
##########
imageOutput('plot'),
hr(),
fluidRow(
column(3,
h4("Diamonds Explorer"),
sliderInput('sampleSize', 'Sample Size',
min=1, max=nrow(penguins), value=min(1000, nrow(penguins)),
step=500, round=0),
br(),
checkboxInput('jitter', 'Jitter'),
checkboxInput('smooth', 'Smooth')
),
column(4, offset = 1,
xValue -> selectInput('x', 'X', names(penguins)),
yValue -> selectInput('y', 'Y', names(penguins), names(penguins)[[2]]),
colorValue -> selectInput('color', 'Color', c('None', names(penguins)))
),
column(4,
rowValue -> selectInput('facet_row', 'Facet Row', c(None='.', names(penguins))),
columnValue -> selectInput('facet_col', 'Facet Column', c(None='.', names(penguins)))
)
)
#########
),
) # navbarPage
) # fluidPage
服务的想法来自这里:How to create and display an animated GIF in Shiny?
服务器是……像这样
# Define server function
server <- function(input, output) {
##########################################
output$plot <- renderImage({
# A temp file to save the output.
# This file will be removed later by renderImage
outfile <- tempfile(fileext='.gif')
# now make the animation
p = myPenguins %>%
ggplot(
aes(xValue, yValue, color = colorValue)) +
geom_point() +
#geom_line() +
facet_grid(rows = vars(rowValue), cols = vars(columnValue))+
theme_bw()+
#theme_minimal() +
transition_time(year)+
labs(title = "Year: {frame_time}")+
view_follow()#+
anim_save("outfile.gif", animate(p)) # New
# Return a list containing the filename
list(src = "outfile.gif",
contentType = 'image/gif')
}, deleteFile = TRUE)
################################################################
}
shinyApp(ui = ui, server = server)
您的代码距离 minimal 还很远,我没有很多您引用的包,但我认为以下内容将说明允许您执行的技术你想要什么。我的代码基于 diamonds
数据集,它是 ggplot2
.
的一部分
你的问题是由于 Shiny 输入小部件(通常)return 字符串,而 ggplot 函数期望符号作为它们的参数。这是tidyverse使用non-standard求值(NSE)的一个特点。
因此,当您第一次遇到 Shiny 和 tidyverse 之间的界面时,可能会感到困惑。一种解决方案是使用 bang-bang 运算符 (!!
) 和 sym
函数。
以下应用显示多面散点图,其中用户可以完全控制
- 绘制在 x 轴上
- 绘制在y-axis
- 定义标绘点的颜色
- 定义构面行
- 定义构面列
library(shiny)
library(tidyverse)
ui <- fluidPage(
selectInput("x", "X variable:", names(diamonds)),
selectInput("y", "Y variable", names(diamonds), selected="price"),
selectInput("colour", "Colour: ", names(diamonds), selected="color"),
selectInput("facetRows", "Facet rows: ", names(diamonds), selected="clarity"),
selectInput("facetCols", "Facet columns", names(diamonds), selected="cut"),
plotOutput("plot")
)
server <- function(input, output) {
output$plot <- renderPlot({
diamonds %>%
ggplot() +
geom_point(aes(x=!!sym(input$x), y=!!sym(input$y), colour=!!sym(input$colour))) +
facet_grid(rows=vars(!!sym(input$facetRows)), cols=vars(!!sym(input$facetCols)))
})
}
shinyApp(ui = ui, server = server)
请注意,diamonds
数据集非常大,对于我上面提到的五个角色中的任何一个,变量选择不当都会导致长时间的延迟!
我 认为 这提供了您问题的答案,但我不完全确定,因为您的代码中有许多不同的功能(例如保存 GIF 文件、使用gganimate
,对 gapminder
) 的引用似乎与在对 renderPlot
的调用中使用 UI 输入的问题无关。如果我没有给你你想要的,请完善你的问题和代码,以便它们仅引用对 fundamnetal 问题至关重要的元素。
This post 将帮助您构建一个最小的可重现示例。
有没有办法 link 用户输入(x 轴、y 轴、颜色等)到 R shiny 中的 gganimate 图形?这样当用户从下拉列表中选择不同的输入(x 轴、y 轴、颜色等)时。 gganimate 图表会填充不同的 x 轴、y 轴、颜色等,以便可以相应地更改?
我试过的编码如下。由于我在 UI 中保存的变量名(xValue、yValue、colorValue 等放入 ggplot 函数)导致错误,不适用于服务...
UI 代码的想法来自这里:https://shiny.rstudio.com/articles/layout-guide.html 它会像这样显示:
library(shiny)
library(shinythemes)
library(palmerpenguins)
library(gganimate)
library(dplyr)
library(tidyr)
library(ggplot2)
library(gapminder)
data(package = 'palmerpenguins')
ui <- fluidPage(
navbarPage(
"Animated penguins data",
tabPanel("Navbar 2",
##########
imageOutput('plot'),
hr(),
fluidRow(
column(3,
h4("Diamonds Explorer"),
sliderInput('sampleSize', 'Sample Size',
min=1, max=nrow(penguins), value=min(1000, nrow(penguins)),
step=500, round=0),
br(),
checkboxInput('jitter', 'Jitter'),
checkboxInput('smooth', 'Smooth')
),
column(4, offset = 1,
xValue -> selectInput('x', 'X', names(penguins)),
yValue -> selectInput('y', 'Y', names(penguins), names(penguins)[[2]]),
colorValue -> selectInput('color', 'Color', c('None', names(penguins)))
),
column(4,
rowValue -> selectInput('facet_row', 'Facet Row', c(None='.', names(penguins))),
columnValue -> selectInput('facet_col', 'Facet Column', c(None='.', names(penguins)))
)
)
#########
),
) # navbarPage
) # fluidPage
服务的想法来自这里:How to create and display an animated GIF in Shiny?
服务器是……像这样
# Define server function
server <- function(input, output) {
##########################################
output$plot <- renderImage({
# A temp file to save the output.
# This file will be removed later by renderImage
outfile <- tempfile(fileext='.gif')
# now make the animation
p = myPenguins %>%
ggplot(
aes(xValue, yValue, color = colorValue)) +
geom_point() +
#geom_line() +
facet_grid(rows = vars(rowValue), cols = vars(columnValue))+
theme_bw()+
#theme_minimal() +
transition_time(year)+
labs(title = "Year: {frame_time}")+
view_follow()#+
anim_save("outfile.gif", animate(p)) # New
# Return a list containing the filename
list(src = "outfile.gif",
contentType = 'image/gif')
}, deleteFile = TRUE)
################################################################
}
shinyApp(ui = ui, server = server)
您的代码距离 minimal 还很远,我没有很多您引用的包,但我认为以下内容将说明允许您执行的技术你想要什么。我的代码基于 diamonds
数据集,它是 ggplot2
.
你的问题是由于 Shiny 输入小部件(通常)return 字符串,而 ggplot 函数期望符号作为它们的参数。这是tidyverse使用non-standard求值(NSE)的一个特点。
因此,当您第一次遇到 Shiny 和 tidyverse 之间的界面时,可能会感到困惑。一种解决方案是使用 bang-bang 运算符 (!!
) 和 sym
函数。
以下应用显示多面散点图,其中用户可以完全控制
- 绘制在 x 轴上
- 绘制在y-axis
- 定义标绘点的颜色
- 定义构面行
- 定义构面列
library(shiny)
library(tidyverse)
ui <- fluidPage(
selectInput("x", "X variable:", names(diamonds)),
selectInput("y", "Y variable", names(diamonds), selected="price"),
selectInput("colour", "Colour: ", names(diamonds), selected="color"),
selectInput("facetRows", "Facet rows: ", names(diamonds), selected="clarity"),
selectInput("facetCols", "Facet columns", names(diamonds), selected="cut"),
plotOutput("plot")
)
server <- function(input, output) {
output$plot <- renderPlot({
diamonds %>%
ggplot() +
geom_point(aes(x=!!sym(input$x), y=!!sym(input$y), colour=!!sym(input$colour))) +
facet_grid(rows=vars(!!sym(input$facetRows)), cols=vars(!!sym(input$facetCols)))
})
}
shinyApp(ui = ui, server = server)
请注意,diamonds
数据集非常大,对于我上面提到的五个角色中的任何一个,变量选择不当都会导致长时间的延迟!
我 认为 这提供了您问题的答案,但我不完全确定,因为您的代码中有许多不同的功能(例如保存 GIF 文件、使用gganimate
,对 gapminder
) 的引用似乎与在对 renderPlot
的调用中使用 UI 输入的问题无关。如果我没有给你你想要的,请完善你的问题和代码,以便它们仅引用对 fundamnetal 问题至关重要的元素。
This post 将帮助您构建一个最小的可重现示例。