我正在创建一个简单的折线图,它可以在 Shiny 中正确呈现.
I'm creating a simple line chart which renders correctly in Shiny.
我现在添加了一个 selectInput,其中包含 2 个不同度量的名称,按照它们出现在我的数据集中的方式编写.我希望我的 y 变量相应地改变.
I've now added a selectInput with the names of 2 different measures, written as they appear in my data set. I'd like my y variable to change accordingly.
p <- plot_ly(data = LineChartData(), x= Calendar.Month, y = input$Measure, type = "line", group = Calendar.Year, col = Calendar.Year)
不幸的是,图表只显示了一个点.它没有使用 input$Measure 并在我的数据集中找到该字段.
Unfortunately, the chart renders with just one point. It's not taking input$Measure and finding that field in my data set.
我知道在使用 ggplot 时,我会将 aes 切换为 aes_string.在情节中有类似的解决方案吗?
I know when using ggplot, i'd switch my aes to aes_string. Is there a similar solution in plotly?
这里有一些可重现的代码
here's some reproducible code
这是 ui.R 文件
#ui.R
shinyUI(
fluidPage(
titlePanel("Inbound Intermediary Performance"),
sidebarLayout(
sidebarPanel(
h4("Parameters"),
br(),
selectInput("Measure", "Measure", c("Var1","Var2"))
),
mainPanel(
plotlyOutput("lineChart")
)
)
)
)
服务器.R
#server.R
library(plotly)
library(shiny)
library(ggplot2)
#Create data
data <- data.frame(Month = c(1,2,3,4,5,6,7,8,9,10,11,12), Var1 = c(36,33,30,27,24,21,18,15,12,9,6,3), Var2 = c(4,8,12,16,20,24,28,32,36,40,44,48))
shinyServer(function(input, output) {
#Create plot
output$lineChart <- renderPlotly({
#using ggplot
p <- ggplot(data=data, aes_string(x='Month', y = input$Measure)) +geom_line(size = 1.5) + theme_minimal()
ggplotly(p)
#Using PLotly
#p <- plot_ly(data = data, x= Month, y = input$Measure, type = "line")
})
})
在上面的示例中,我可以使用下拉菜单在 Var1 和 Var2 之间切换.我的情节也随之改变.该代码使用 ggplot 和它的 aes_string 函数来获取输入.然后使用 ggplotly 函数将其转换为交互式绘图.
In the example above, I can use my drop down to switch between Var1 and Var2. My plot changes accordingly. The code uses ggplot and it's aes_string function to take an input. This is then converted into a plotly interactive plot using the ggplotly function.
有没有办法我可以在本地使用 plotly 做到这一点?
Is there a way I can do this natively with plotly?
使用base::get()函数:
Use base::get() function:
p <- plot_ly(data = data, x = ~Month, y = ~get(input$Measure), type = "line")
或同样使用ggplot:
or the same using ggplot:
p <- ggplot(data = data, aes(x = Month, y = get(input$Measure))) +
geom_line(size = 1.5) +
theme_minimal()
ggplotly(p)