将多个“滑块”添加到同一个图表

2023-12-13

我正在使用 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/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)

enter image description here

现在,我正在尝试制作两个单独的“滑块”:一个“滑块”用于“group_a”,另一个“滑块”用于“group_b”。看起来像这样的东西:

enter image description here

我的逻辑是,“ggplot()”语句中的“frame”参数应该有两个级别:

gg <-ggplot(final, aes(frame = c(var,group), color = group)) + geom_line(aes(x=month, y=mean, group=1))+ theme(axis.text.x = element_text(angle=90)) + ggtitle("title")

gg
Error: Aesthetics must be either length 1 or the same as the data (550): frame

有人可以告诉我如何解决这个问题吗?

Thanks


我认为你不能用标准做到这一点plotly API.

我认为对于这样的情况最好使用shiny并创建一个网络应用程序。您可以根据需要添加任意数量的滑块,然后根据需要过滤数据以更新绘图。

这样做的缺点是您只是用新数据重新绘制绘图,而不是像以前那样制作动画。所以你最终会失去之前的平滑过渡。

实际上有一种我不知道的保持动画方面的方法,但你需要更深入地研究shiny/plotly。看一眼这个链接。我不知道这一点,所以我没有尝试这样做。不过我稍后会看一下!

这是我的闪亮解决方案:

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)

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个“滑块”添加到同一个图表 的相关文章

随机推荐

  • 为什么 setTimeout(fn, 0) 有时很有用?

    我最近遇到了一个相当讨厌的错误 其中代码正在加载一个
  • 为了防止内存泄漏,已强制取消注册 JDBC 驱动程序

    当我运行网络应用程序时 我收到此消息 它运行良好 但我在关机期间收到此消息 严重 Web 应用程序注册了 JBDC 驱动程序 oracle jdbc driver OracleDriver 但在 Web 应用程序停止时无法取消注册 为了防止
  • C# ASP.NET MVC 手动访问 Request.Form 和潜在危险值

    我正在针对每个用户请求将表单和查询字符串数据序列化并保存到数据库中 这个特定的提交模型已经具有 AllowHtml 属性 并且可以很好地提交给控制器 问题出在我记录请求的 Global asax 文件内 当我访问此表单值时 出现异常 从以下
  • .BAT 文件中未读取 SET 变量

    我有这个 Windows 批处理文件 但无法正常运行 基本上 我在一个位置有一个文件夹 我需要将其复制到另一个文件夹 但还要重命名新文件夹名称 Echo off set 836147398 Taunus A3 Echo Copying 83
  • 如何以正确的顺序导入Scrapy项目密钥?

    我正在导入 Scrapy 项目密钥items py into pipelines py 问题是order导入的项目与它们在中的定义方式不同items py file My items py file class NewAdsItem Ite
  • 如何使用 python 创建字典列表

    我有一个函数返回一个列表 我在其中序列化为 json 对象并将其写入 JSON 文件 结果是正确的 但问题是它返回分隔列表中的每条记录 我想要的是返回一个包含多个字典项的列表 example 返回结果 file Name test1 txt
  • iPhone ivar命名约定[重复]

    这个问题在这里已经有答案了 可能的重复 可可 Objective C 类中变量前面的下划线如何工作 我注意到 在很多参考资料中 我发现很多时候 变量在 h 文件中被命名为 variable 然后在 m 文件中被 synthesize d 为
  • 时钟和steady_clock测量的时间差

    我试图测量在代码中执行特定函数所需的时间 最初我使用的是clock 功能如下 clock t start clock do something clock t end clock printf Time taken f ms n doubl
  • 如何使用 Python/Django 在电子邮件中发送内联图像?

    我正在尝试使用 Python Django 发送带有内联图像的电子邮件 Here是显示我是如何做的代码 它仍在开发中 因此 现在要做的就是发送一封虚拟电子邮件 其中嵌入了大黄蜂的图片 然而 当我在 Gmail 收件箱中收到电子邮件时 我只看
  • 头文件中的变量声明 - 静态与否?

    当重构一些 defines我在 C 头文件中遇到类似于以下内容的声明 static const unsigned int VAL 42 const unsigned int ANOTHER VAL 37 问题是 静电会产生什么差异 如果有的
  • 检查 Glassfish DAS 是否正在以编程方式运行

    即使 Glassfish DAS 部署在本地计算机或远程计算机上 如何检查它是否正在以编程方式运行 使用Java6 我找到了一种除了 Linux 脚本之外检查 DAS 是否启动的方法 通过这种方式 我的应用程序和 DAS 是否位于同一台计算
  • PyQt5 GUI - 使用 PyInstaller 制作的 exe 无法打开

    我有一个 GUI 当我从 Anaconda Prompt 执行它时 它运行得非常好 我得到以下窗口作为输出 我已经使用 pip 安装了 pyinstaller 然后运行了该行 pyinstaller exe onefile my file
  • 如何将正在迭代的迭代器传递给函数?

    我正在迭代一个数组 根据当前值 我想将迭代器传递给子函数并让它处理多个值 然后在退出子函数时 继续迭代数组 下面是我迄今为止所能达到的最接近的结果 但我不断得到error use of moved value iter 我尝试过研究生命周期
  • 将 shell 输出重定向到文件 [重复]

    这个问题在这里已经有答案了 我正在 AIX 6 上工作 在 Korn Shell 上运行 java 命令 并尝试调试类加载问题 我把 verbose class 打印加载的类 然后 gt gt h ome user log log 将控制台
  • 如何配置 Unity 为 IEnumerable 注入数组

    我有一个课程需要IEnumerable我想用 Unity 解析它的构造函数参数并注入一个对象数组 这些简单的类说明了问题 public interface IThing int Value get public class SimpleTh
  • 如何构建支持超过 223 列鼠标输入的 Curses 程序

    我正在尝试让一个curses程序与我的终端跨显示器一起工作 但是 x 坐标无法移过第 223 列 而是循环移动 在源代码中 这似乎是因为它们被定义为 8 位 并且位置值仅在前 32 个值之后开始 即 x raw x 这是一个示例程序http
  • C++ 数组初始化

    float minTime 7 FLT MAX for int i 0 i lt 7 i cout lt lt Min lt lt minTime i lt lt endl 为什么我会得到以下输出 Min 3 40282e 038 Min
  • 全局变量和Python多重处理[重复]

    这个问题在这里已经有答案了 可能的重复 Python 多处理全局变量更新未返回到父级 我使用的是一台具有多个内核的计算机 为了提高性能 我真的应该使用多个内核 但是 我很困惑为什么这些代码没有达到我的预期 from multiprocess
  • 字符串中的 JavaScript var

    所以我有这段代码 想知道如何将我的 javascript var 放入这个字符串中 我似乎无法为自己编写工作代码 对于我想要的图像源picture value在那里 我尝试过不同的解决方案 但自己没能解决 非常感谢所有帮助 var text
  • 将多个“滑块”添加到同一个图表

    我正在使用 R 编程语言 使用 plotly 库 我能够制作以下交互式图表 library dplyr library ggplot2 library shiny library plotly library htmltools libra