【问题标题】:R: Converting ggplot objects to interactive graphsR:将 ggplot 对象转换为交互式图形
【发布时间】:2021-05-07 02:53:54
【问题描述】:

我正在使用 R 编程语言。我正在尝试采用不同类型的图表(条形图、饼图)并将它们放在同一页面上。我生成了一些假数据并制作了几张图表 - 然后我将它们放在一起(请参阅:Combining Different Types of Graphs Together (R)

  library(dplyr)
    library(ggplot2)
    library(cowplot)
    library(gridExtra)
    library(plotly)
    
    date= seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
    
    var <- rnorm(731,10,10)
    
    
    group <- sample( LETTERS[1:4], 731, replace=TRUE, prob=c(0.25, 0.22, 0.25, 0.25) )
    
    data = data.frame(date, var, group)
    
    data$year = as.numeric(format(data$date,'%Y'))
    data$year = as.factor(data$year)
    
    ###Pie
    Pie_2014 <- data %>% 
        filter((data$year == "2014")) %>% 
        group_by(group) %>% 
        summarise(n = n())
    
    Pie_2014_graph = ggplot(Pie_2014, aes(x="", y=n, fill=group)) +
        geom_bar(stat="identity", width=1) +
        coord_polar("y", start=0) +ggtitle( "Pie Chart 2014") 
    
    
    Pie_2015 <- data %>% 
        filter((data$year == "2015")) %>% 
        group_by(group) %>% 
        summarise(n = n())
    
    Pie_2015_graph = ggplot(Pie_2015, aes(x="", y=n, fill=group)) +
        geom_bar(stat="identity", width=1) +
        coord_polar("y", start=0) +ggtitle( "Pie Chart 2015") 
    
    
    Pie_total = data %>% 
        group_by(group) %>% 
        summarise(n = n())
    
    Pie_total_graph = ggplot(Pie_total, aes(x="", y=n, fill=group)) +
        geom_bar(stat="identity", width=1) +
        coord_polar("y", start=0) +ggtitle( "Pie Chart Average") 
    
    ###bars
    
    Bar_years = data %>%
        group_by(year, group) %>%
        summarise(mean = mean(var))
    
    Bar_years_plot = ggplot(Bar_years, aes(fill=group, y=mean, x=year)) +
        geom_bar(position="dodge", stat="identity") + ggtitle("Bar Plot All Years")
    
    Bar_total = data %>%
        group_by(group) %>%
        summarise(mean = n())
    
    Bar_total_plot = ggplot(Bar_total, aes(x=group, y=mean, fill=group)) +
        geom_bar(stat="identity")+theme_minimal() + ggtitle("Bar Plot Average")
    
    
   #assembling the graphs can be done two different ways 
#first way
    g1 <- grid.arrange(Pie_2014_graph, Pie_2015_graph , Pie_total_graph, nrow = 1)
    g2 <- grid.arrange(Bar_total_plot, Bar_years_plot, nrow = 1)
    g = grid.arrange(g1, g2, ncol = 1)
    
    #second way
    
    # arrange subplots in rows
    top_row <- plot_grid(Pie_2014_graph, Pie_2015_graph, Pie_total_graph)
    middle_row <- plot_grid(Bar_years_plot, Bar_total_plot)
    
    # arrange our new rows into combined plot
    p <- plot_grid(top_row, middle_row, nrow = 2)
    p

从这里开始,我尝试使用plotly::ggplotly() 命令使上述输出“交互”(将鼠标移到图表上并查看标签)。我知道这适用于个别地块:

ggplotly(Bar_years_plot)

但是,此命令似乎不适用于“cowplot”和“gridExtra”输出:

#gridExtra version:

 ggplotly(g)
Error in UseMethod("ggplotly", p) : 
  no applicable method for 'ggplotly' applied to an object of class "c('gtable', 'gTree', 'grob', 'gDesc')"

#cowplot version: (produces empty plot)

ggplotly(p)
Warning messages:
1: In geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) :
  geom_GeomDrawGrob() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issues
2: In geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) :
  geom_GeomDrawGrob() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issues

有谁知道是否有一种快速的方法可以将ggplotly() 函数用于使用“gridExtra”或“cowplot”创建的对象?

我知道通过一些工作,使用“htmltools”可能是可能的:

library(htmltools)

doc <- htmltools::tagList(
    div(Pie_2014_graph, style = "float:left;width:50%;"),
    div(Pie_2015_graph,style = "float:left;width:50%;"),
    div(Pie_total_graph, style = "float:left;width:50%;"),
    div(Bar_years_plot, style = "float:left;width:50%;"),
    div(Bar_total_plot, style = "float:left;width:50%;"))
    
    save_html(html = doc, file = "out.html")

但我不知道该怎么做。

有人可以告诉我如何使用 ggplotly() 或 htmltools() 使图形集合交互吗?

谢谢。

【问题讨论】:

    标签: html r ggplot2 plotly data-visualization


    【解决方案1】:

    您应该将 ggplotly() 应用于单个图,而不是集合图。

    例如:

    Pie_2014_graph = ggplotly(ggplot(Pie_2014, aes(x="", y=n, fill=group))    +
        geom_bar(stat="identity", width=1) +
        coord_polar("y", start=0) +ggtitle( "Pie Chart 2014") )
    

    【讨论】:

    • 感谢您的回复!这是我已经做过的。我正在尝试使图形集合具有交互性。你知道这是否可以做到吗?谢谢!
    • 您可以使用正在运行的更新脚本来编辑您的帖子吗?在单个图表上使用 ggplotly() 应该可以解决您的问题
    • 我知道如何一一做。我想看看是否可以同时对他们所有人。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2010-12-04
    • 2016-10-26
    • 2021-11-09
    • 2015-06-28
    相关资源
    最近更新 更多