R 添加多个“;滑块“;到同一个图形
我正在使用R编程语言。使用“plotly”库,我能够制作以下交互式图形:R 添加多个“;滑块“;到同一个图形,r,plotly,data-visualization,interactive,r-plotly,R,Plotly,Data Visualization,Interactive,R Plotly,我正在使用R编程语言。使用“plotly”库,我能够制作以下交互式图形: library(dplyr) library(ggplot2) library(shiny) library(plotly) library(htmltools) library(dplyr) #generate data set.seed(123) var = rnorm(731, 100,25) date= seq(as.Date("2014/1/1"), as.Date("2016/
library(dplyr)
library(ggplot2)
library(shiny)
library(plotly)
library(htmltools)
library(dplyr)
#generate data
set.seed(123)
var = rnorm(731, 100,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
mutate(date = as.Date(date)) %>%
group_by(month = format(date, "%Y-%m")) %>%
summarise( mean = mean(new_var_i))
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_1 <- bind_rows(combine)
result_1$group = "group_a"
result_1$group = as.factor(result_1$group)
######
var = rnorm(731, 85,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
mutate(date = as.Date(date)) %>%
group_by(month = format(date, "%Y-%m")) %>%
summarise( mean = mean(new_var_i))
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_2 <- bind_rows(combine)
result_2$group = "group_b"
result_2$group = as.factor(result_2$group)
#combine all files
final = rbind(result_1, result_2)
gg <-ggplot(final, aes(frame = var, color = group)) + geom_line(aes(x=month, y=mean, group=1))+ theme(axis.text.x = element_text(angle=90)) + ggtitle("title")
gg = ggplotly(gg)
库(dplyr)
图书馆(GG2)
图书馆(闪亮)
图书馆(绘本)
图书馆(htmltools)
图书馆(dplyr)
#生成数据
种子集(123)
var=rnorm(731100,25)
日期=序号(截止日期(“2014/1/1”)、截止日期(“2016/1/1”)、by=“天”)
data=data.frame(变量,日期)
VAL%
分组依据(月=格式(日期,“%Y-%m”))%>%
总结(平均值=平均值(新变量i))
#将文件组合在一起
合计i$var=i
聚合i$var=as.factor(聚合i$var)
count我认为你不能用标准的plotly
API来实现这一点
我认为对于这种情况,最好使用shinny
并创建一个web应用程序。您可以根据需要添加任意多的滑块,然后根据需要过滤数据以更新绘图
这样做的缺点是,您只是使用新数据重新绘制绘图,而不是像以前那样进行动画。所以你最终失去了之前的平滑过渡
实际上,有一种方法可以保持动画方面的效果,我不知道,但您需要深入了解的光泽
/情节
。看一看。我不知道这件事,所以我没有试着去做。但是我以后会看的
以下是我的解决方案:
library(shiny)
library(plotly)
library(dplyr)
gendata <- function(){
#generate data
set.seed(123)
var = rnorm(731, 100,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
dplyr::mutate(date = as.Date(date)) %>%
dplyr::group_by(month = format(date, "%Y-%m")) %>%
dplyr::summarise(mean = mean(new_var_i), .groups='drop')
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_1 <- bind_rows(combine)
result_1$group = "group_a"
result_1$group = as.factor(result_1$group)
######
var = rnorm(731, 85,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
dplyr::mutate(date = as.Date(date)) %>%
dplyr::group_by(month = format(date, "%Y-%m")) %>%
dplyr::summarise(mean = mean(new_var_i), .groups='drop')
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_2 <- bind_rows(combine)
result_2$group = "group_b"
result_2$group = as.factor(result_2$group)
# combine all files
# note: sliderInput needs numeric data, so I converted values of "var" to numeric
final <- rbind(result_1, result_2)
final$var <- as.integer(as.character(final$var))
return(final)
}
final <- gendata()
ui <- fluidPage(
fluidRow(column=12,
plotlyOutput("lineplot")),
fluidRow(column=12,
# create slider for group a
sliderInput("groupa", "Group A:",
min = min(final$var), max = max(final$var),
value = min(final$var), step = 1,
animate =
animationOptions(interval = 300, loop = FALSE),
width='95%')),
fluidRow(column=12,
# create slider for group b
sliderInput("groupb", "Group B:",
min = min(final$var), max = max(final$var),
value = min(final$var), step = 1,
animate =
animationOptions(interval = 300, loop = FALSE),
width='95%')))
server <- function(input, output, session){
# create a reactive dataframe with filtered data for group a at current value of var
df.a <- reactive({
final %>% dplyr::filter(group == 'group_a') %>%
dplyr::filter(var == input$groupa)
})
# create a reactive dataframe with filtered data for group b at current value of var
df.b <- reactive({
final %>% dplyr::filter(group == 'group_b') %>%
dplyr::filter(var == input$groupb)
})
# Create plotly with filtered data
output$lineplot <- renderPlotly({
plot_ly() %>%
add_trace(data=df.a(), x=~month, y=~mean, color=~group, type = 'scatter', mode = 'lines', colors = 'Set1') %>%
add_trace(data=df.b(), x=~month, y=~mean, color=~group, type = 'scatter', mode = 'lines', colors = 'Set1')
})
}
shinyApp(ui, server)
库(闪亮)
图书馆(绘本)
图书馆(dplyr)
性别百分比
dplyr::总结(平均值=平均值(新变量i),.groups='drop')
#将文件组合在一起
合计i$var=i
聚合i$var=as.factor(聚合i$var)
伯爵,您应该决定是否使用对不起,我会设法解决的,非常感谢您的回答!一切都很好!我想在plotly中这样做的唯一原因是,将最终输出保存为html文件要容易得多。我不确定是否可以将rshiny输出保存为html文件?是和否“是”,因为当您使用shiny时,实际上是在客户端通过UI创建html文件。“否”,因为此html文件不包含所有数据。它与拥有数据并执行所有数据操作的服务器“对话”,然后将数据发送回客户端。如果您想要一个自包含的html,那么您可能需要您的方法。也许这是有可能的。让我看看我是否能做到,我会补充我的答案。我在这里贴了一个类似的问题,我试图做这一切都是有计划的:谢谢你的帮助
library(shiny)
library(plotly)
library(dplyr)
gendata <- function(){
#generate data
set.seed(123)
var = rnorm(731, 100,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
dplyr::mutate(date = as.Date(date)) %>%
dplyr::group_by(month = format(date, "%Y-%m")) %>%
dplyr::summarise(mean = mean(new_var_i), .groups='drop')
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_1 <- bind_rows(combine)
result_1$group = "group_a"
result_1$group = as.factor(result_1$group)
######
var = rnorm(731, 85,25)
date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
data = data.frame(var,date)
vals <- 90:100
combine <- vector('list', length(vals))
count <- 0
for (i in vals) {
data$var_i = i
data$new_var_i = ifelse(data$var >i,1,0)
#percent of observations greater than i (each month)
aggregate_i = data %>%
dplyr::mutate(date = as.Date(date)) %>%
dplyr::group_by(month = format(date, "%Y-%m")) %>%
dplyr::summarise(mean = mean(new_var_i), .groups='drop')
#combine files together
aggregate_i$var = i
aggregate_i$var = as.factor(aggregate_i$var)
count <- count + 1
combine[[count]] <- aggregate_i
}
result_2 <- bind_rows(combine)
result_2$group = "group_b"
result_2$group = as.factor(result_2$group)
# combine all files
# note: sliderInput needs numeric data, so I converted values of "var" to numeric
final <- rbind(result_1, result_2)
final$var <- as.integer(as.character(final$var))
return(final)
}
final <- gendata()
ui <- fluidPage(
fluidRow(column=12,
plotlyOutput("lineplot")),
fluidRow(column=12,
# create slider for group a
sliderInput("groupa", "Group A:",
min = min(final$var), max = max(final$var),
value = min(final$var), step = 1,
animate =
animationOptions(interval = 300, loop = FALSE),
width='95%')),
fluidRow(column=12,
# create slider for group b
sliderInput("groupb", "Group B:",
min = min(final$var), max = max(final$var),
value = min(final$var), step = 1,
animate =
animationOptions(interval = 300, loop = FALSE),
width='95%')))
server <- function(input, output, session){
# create a reactive dataframe with filtered data for group a at current value of var
df.a <- reactive({
final %>% dplyr::filter(group == 'group_a') %>%
dplyr::filter(var == input$groupa)
})
# create a reactive dataframe with filtered data for group b at current value of var
df.b <- reactive({
final %>% dplyr::filter(group == 'group_b') %>%
dplyr::filter(var == input$groupb)
})
# Create plotly with filtered data
output$lineplot <- renderPlotly({
plot_ly() %>%
add_trace(data=df.a(), x=~month, y=~mean, color=~group, type = 'scatter', mode = 'lines', colors = 'Set1') %>%
add_trace(data=df.b(), x=~month, y=~mean, color=~group, type = 'scatter', mode = 'lines', colors = 'Set1')
})
}
shinyApp(ui, server)