【问题标题】:R: "tie" two graphs togetherR:将两个图形“捆绑”在一起
【发布时间】:2021-02-09 23:54:33
【问题描述】:

我正在使用 R 编程语言。使用以下代码,我能够创建两个交互式图表:

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)


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

gg = ggplotly(gg)

######

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)


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

gg1 = ggplotly(gg1)

我的问题:是否可以将这些图表配置为:如果您为其中一个图表“移动滑块”,另一个图表的滑块也会移动?

我想出了如何让滑块移动两条线,前提是它们在同一个图表上:

final = rbind(result_1, result_2)

graph <-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")

graph = ggplotly(graph)

但我正在寻找一种方法,如果您将“图表 1”的滑块移动一定距离,“图表 2”的滑块也会移动相同的距离 - 反之亦然。这可能吗?从这里开始,我将使用plotly::subplot() 语句或htmltools:taglist() 并将结果保存为html 文件。

(从长远来看,我想要 4 个图:graph1、graph2 一起移动,graph3、graph4 一起移动)

谢谢

【问题讨论】:

  • 您是否考虑过在一个 ggplot2 对象中将两个图形放在不同的方面?例如。通过将+ facet_grid(~group) 添加到graph,然后将其转换为情节对象。然后,您可以使用相同的滑块控制两个方面面板。
  • 感谢您的建议!我会试试这个!
  • 我刚试过。有效!谢谢!
  • 我发布了您的答案,以防其他人想查看完整的解决方案。如果您想发布它,请告诉我,我可以删除它。感谢您的所有帮助

标签: r ggplot2 plotly


【解决方案1】:

根据@Z.Lin 提供的建议,这是我一直在寻找的答案:

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)


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

gg = ggplotly(gg)

######

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)


final = rbind(result_1, result_2)


graph <-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") + facet_wrap(. ~ group)

graph = ggplotly(graph)

#view graph
graph

感谢@Z.Lin 的所有帮助

【讨论】:

    【解决方案2】:

    如果你想要两组带有两个不同滑块的图表,然后将结果保存为 html 文件:

    library(dplyr)
    library(ggplot2)
    library(shiny)
    library(plotly)
    library(htmltools)
    
    library(dplyr)
    #generate data
    set.seed(123)
    
    ######
    
    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)
    
    
    final = rbind(result_1, result_2)
    
    
    graph <-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") + facet_wrap(. ~ group)
    
    graph = ggplotly(graph)
    
    
    #########
    
    var = rnorm(731, 95,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)
    
    
    final = rbind(result_1, result_2)
    
    
    graph1 <-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") + facet_wrap(. ~ group)
    
    graph1 = ggplotly(graph1)
    
    
    
    #####
    
    library(htmltools)
    
    doc <- htmltools::tagList(
        div(graph, style = "float:left;width:50%;"),
        div(graph1,style = "float:left;width:50%;")
        
    )
    
    htmltools::save_html(html = doc, file = "twin.html")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2014-01-26
      • 2023-03-27
      • 2019-07-15
      相关资源
      最近更新 更多