3 min read

Trelliscope 使用技巧

本文于2020-10-10更新。 如发现问题或者有建议,欢迎提交 Issue

当我们面对大数据时候,EDA成为一个问题,静态图片的展示已经已经不能满足我们的需求,因此需要动态、交互的处理,因此产生了plotly包来替代ggplot2包,但是我们会认为限制与给定的facet还不能满足我们的需求,因此产生了trelliscopejs包,它的优点在于解除了facet限制,是plotly包来替代`ggplot2很好的互补。

  1. 这里的大数据定义是多列的数据,而非多行。因此trelliscopejs包的目的是高效处理数据多列数据或者多facet的数据。

为了让大家最快理解这个包的作用,建议大家run以下代码,查看生成的交互页面。

例子来自于trelliscopejs的help页面。由于trelliscopejs包生成的是交互页面,在博客的静态页面中只能调用不能内置,目前没有很好的解决办法,因此剋呀尝试将这里代码在R中自己运行尝试。

  1. Stack Overflow 上也基于html生成方面尝试解决的探讨。
library(dplyr)
#> 
#> 载入程辑包:'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
library(purrr)
library(rbokeh)
library(gapminder)
library(trelliscopejs)

# nest gapminder data by country
by_country <- gapminder %>%
  group_by(country, continent) %>%
  nest()

# add in a plot column with map_plot
by_country <- by_country %>% mutate(
  panel = map_plot(data,
    ~ figure(xlim = c(1948, 2011), ylim = c(10, 95), width = 300, tools = NULL) %>%
        ly_points(year, lifeExp, data = .x, hover = .x)
  ))

Created on 2018-10-20 by the reprex package (v0.2.0).

1 参数介绍

trelliscopejs包的参数调整参考 Hafen (2018b Chapter 2) 在 DataCamp 上的教程。

library(ggplot2)
library(trelliscopejs)
library(gapminder)

# Create the plot
ggplot(gapminder, aes(year, lifeExp)) +
  geom_line() +
  # Facet on country and continent
  facet_trelliscope(~ country + continent)

ggplot的图作为一个单元,trelliscopejs进行了调用。

library(ggplot2)
library(trelliscopejs)

ggplot(gapminder, aes(year, lifeExp)) +
  geom_line() +
  facet_trelliscope(~ country + continent,
    name = "lifeExp_by_country",
    desc = "Life expectancy vs. year per country",
    nrow = 1, ncol = 2)
  1. 可以指定名字和描述。
  2. 初始 Grid 的排列。
library(trelliscopejs)
library(ggplot2)
library(gapminder)

# Create the plot
ggplot(gapminder, aes(year, lifeExp)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  facet_trelliscope(~ country + continent,
    name = "lifeExp_by_country",
    desc = "Life expectancy vs. year for 142 countries.",
    nrow = 2, ncol = 3,
    # Set the scales
    scales = "sliced",
    # Specify automatic cognostics
    auto_cog = TRUE)
  1. 增加scales = "sliced"auto_cog = TRUE,但是具体作用还不是很明确。
  2. 并且中间加geom_smooth的话,还可以根据lm的metric,来筛选。
library(ggplot2)
library(dplyr)
library(gapminder)
library(trelliscopejs)

# Group by country and create the two new variables
gap <- gapminder %>%
  group_by(country) %>%
  mutate(
    delta_lifeExp = tail(lifeExp, 1) - head(lifeExp, 1),
    ihme_link = paste0("http://www.healthdata.org/", country))

# Add the description
gap$delta_lifeExp <- cog(gap$delta_lifeExp, desc = "Overall change in life expectancy")

# Specify the default label
gap$ihme_link <- cog(gap$ihme_link, default_label = TRUE)

ggplot(gap, aes(year, lifeExp)) +
  geom_point() +
  facet_trelliscope(~ country + continent,
    name = "lifeExp_by_country",
    desc = "Life expectancy vs. year for 142 countries.",
    nrow = 2, ncol = 3,
    scales = c("same", "sliced"))
  1. 产生的报错Error in deparse_vector(x) : x must be a character vector.,在Github上,作者已经回复了在最新版本上已解决,因此建议大家安装Github上的最新版本。

2 更多学习

可以参考 Hafen (2017) 的官方Tutorial。

附录

2.1 部署到博客

Hafen (2016) 的这篇博客上已经显示了trelliscopejs可以正常在博客中运行。

并且 Hafen (2016) 提到,

Easy to embed and share

I haven’t mentioned yet that trelliscopejs is an htmlwidget, producing pure HTML / JavaScript applications, meaning you can easily embed your displays in RMarkdown Notebooks or documents, and can share the generated HTML file with others or post on the web through a simple web server or Github pages. For example, the displays you saw in this post are hosted on Github pages.

  1. 指定导出文档路径 (Hafen 2018a)
  2. 将导出文件复制到 static 路径中,之后具体参考 发布其他.Rmd文档

2.2 x轴不能用时间变量

#> Error in names(cog_desc) <- paste0(non_unique_col, "_", names(cog_desc)): 'names' attribute [1] must be the same length as the vector [0]

报错。 相同的问题在Github上发生我,我给了临时解决方案。

t = as.numeric(t)

参考

Hafen, Ryan. 2016. “Introducing Trelliscopejs.” 2016. http://ryanhafen.com/blog/trelliscopejs.

———. 2017. Trelliscopejs. https://hafen.github.io/trelliscopejs/index.html.

———. 2018a. “Trelliscopejs Doesn’t Work with Blogdown.” Github. 2018. https://github.com/hafen/trelliscopejs/issues/67.

———. 2018b. Visualizing Big Data with Trelliscope. DataCamp. https://www.datacamp.com/courses/visualizing-big-data-with-trelliscope.