首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高时间序列热图绘制时的切换性能

提高时间序列热图绘制时的切换性能
EN

Stack Overflow用户
提问于 2020-03-19 18:21:38
回答 1查看 1.5K关注 0票数 7

我正在构建一个R中的交互式时间序列热图,它使用的是透明和闪亮的功能。作为这个过程的一部分,我重新编码了从连续格式到序号格式的热图值,所以我有一个热图,其中六种颜色代表特定的计数类别,而这些类别是从聚合计数值创建的。但是,随着使用ggplotly()创建热图的速度加快,这将导致一个主要的性能问题。我从Plotly跟踪它到tooltip()函数,它呈现交互框。标签数据从我的热图以某种方式超载这个功能,它的执行非常缓慢,即使我只是添加一个标签组件到tooltip()。我正在使用来自Johns Hopkins CSSE储存库的新冠肺炎疫情数据的一个处理子集。下面是一个简化的热图代码,它也使用ggsci

代码语言:javascript
复制
#Load packages
library(shiny)
library(plotly)
library(tidyverse)
library(RCurl)
library(ggsci)

#Read example data from Gist
confirmed <- read_csv("https://gist.githubusercontent.com/GeekOnAcid/5638e37c688c257b1c381a15e3fb531a/raw/80ba9704417c61298ca6919343505725b8b162a5/covid_selected_europe_subset.csv")

#Wrap ggplot of time-series heatmap in ggplotly, call "tooltip"  
ggplot_ts_heatmap <- confirmed %>%
  ggplot(aes(as.factor(date), reorder(`Country/Region`,`cases count`), 
             fill=cnt.cat, label = `cases count`, label2 = as.factor(date), 
             text = paste("country:", `Country/Region`))) + 
  geom_tile(col=1) +
  theme_bw(base_line_size = 0, base_rect_size = 0, base_size = 10) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.title = element_blank()) +
  scale_fill_manual(labels = levels(confirmed$cnt.cat),
                    values = pal_simpsons("springfield")(7)) +
  labs(x = "", y = "")
ggplotly(ggplot_ts_heatmap, tooltip = c("text","label","label2"))

一旦tooltip = c("text","label","label2")减少(例如,tooltip = c("text")),性能就会提高。现在,我知道延迟并不是“巨大的”,但我正在将它与一个闪亮的应用程序集成在一起。一旦它与更多的数据结合起来,就会变得非常、非常、非常缓慢。我甚至没有显示tooltip中的所有变量,而且它仍然很慢--当您单击“已确认”的案例时,您可以在应用程序的当前版本中看到它。

有什么建议吗?我考虑过替代交互式热图包,如d3heatmapheatmaplyshinyHeatmaply,但所有这些解决方案都更适合于相关热图,而且它们缺乏ggplot的自定义选项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-23 10:01:18

如果您将其重写为“纯”(没有ggplotly转换),它将更快。大约3000倍。以下是一个非常小的基准的结果:

代码语言:javascript
复制
Unit: milliseconds
 expr       min        lq       mean     median        uq       max neval
    a 9929.8299 9929.8299 9932.49130 9932.49130 9935.1527 9935.1527     2
    b    3.1396    3.1396    3.15665    3.15665    3.1737    3.1737     2

ggplotly速度慢得多的原因是,它没有将输入识别为热图,而是创建了一个散点图,其中每个矩形都用所有必要的属性分别绘制。如果将ggplotlyplot_ly的结果包装在plotly_json()中,则可以查看生成的JSON。

您还可以查看地块的object.size,其中您将看到ggplotly对象在4616.4 Kb附近,而plotly-heatmap只有40.4KB大。

代码语言:javascript
复制
df_colors = data.frame(range=c(0:13), colors=c(0:13))
color_s <- setNames(data.frame(df_colors$range, df_colors$colors), NULL)
for (i in 1:14) {
  color_s[[2]][[i]] <- pal_simpsons("springfield")(13)[[(i + 1) / 2]]
  color_s[[1]][[i]] <-  i / 14 - (i %% 2) / 14
}

plot_ly(data = confirmed, text = text) %>%
  plotly::add_heatmap(x = ~as.factor(date), 
                      y = ~reorder(`Country/Region`, `cases count`),
                      z = ~as.numeric(factor(confirmed$`cnt.cat`, ordered = T, 
                                             levels = unique(confirmed$`cnt.cat`))),
                      xgap = 0.5,
                      ygap = 0.5,
                      colorscale = color_s,
                      colorbar = list(tickmode='array',
                                      title = "Cases",
                                      tickvals=c(1:7),
                                      ticktext=levels(factor(x = confirmed$`cnt.cat`,
                                                             levels = unique(confirmed$`cnt.cat`),
                                                             ordered = TRUE)), len=0.5),
                      text = ~paste0("country: ", `Country/Region`, "<br>",
                                    "Number of cases: ", `cases count`, "<br>",
                                    "Category:  ", `cnt.cat`),
                      hoverinfo ="text"
  ) %>% 
  layout(plot_bgcolor='black',
         xaxis = list(title = ""),
         yaxis = list(title = ""));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60763006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档