Chapter 63 Translation of ‘parcoords’ Introduction

Yichi Liu and Michi Liu

This is a Chinese translation version of the introduction and examples to the R package “parcoords”.
这是R包“parcoords”的使用说明和示例教程的中文翻译。

63.1 1. ‘parcoords’包使用说明 - 中文翻译

翻译自英文原版说明:https://cran.r-project.org/web/packages/parcoords/parcoords.pdf

63.1.1 parcoords

基于“d3.js”的交互式平行坐标图。

63.1.1.1 描述

创建由d3.js parallel-coordinates的htmlwidget外包的交互式平行坐标图。

63.1.1.2 使用方法

parcoords(data = NULL, rownames = TRUE, color = NULL, brushMode = NULL, brushPredicate = "and", alphaOnBrushed = NULL, reorderable = FALSE, axisDots = NULL, margin = NULL, composite = NULL, alpha = NULL, queue = FALSE, mode = FALSE, rate = NULL, dimensions = NULL, bundleDimension = NULL, bundlingStrength = 0.5, smoothness = 0, tasks = NULL, autoresize = FALSE, withD3 = FALSE, width = NULL, height = NULL, elementId = NULL)

63.1.1.3 参数

参数 描述
data 用来画图的数据集,格式为data.frame。
rownames 逻辑值,代表是否显示data.frame里的行名称。不论此处是什么值,我们都会将带有行名称的数据发送给JavaScript。如果此处是False(否),则在平行坐标中不显示行名称。
color 颜色可以是单一的rgb或hex。对于一个颜色函数,需要提供一个list( colorScale = , colorBy = , colorScheme =, colorInterpolator = , colorDomain =),其中colorScale是d3-scale的名字,例如scaleOrdinal或 scaleSequential。colorBy是数据中用来决定颜色的列的名称。如果将一个离散型或序数型变量用于color,则请提供colorScheme,例如schemCategory10。如果将一个连续性变量用于color,则请提供colorInterpolator,作为d3内插器的名称,例如interpolateViridis。如果用了d3的色阶,请确保使用参数withD3 = TRUE。
brushMode 字符串格式。根据需要的呈现效果选择刷子的模式,可以选择“1D-axes”或“1D-axes-multi”或“2D-strums”。
brushPredicate 字符串格式。可以选择“and”或者“or”,用来表示多个刷子的逻辑关系。
alphaOnBrushed 取值范围为0到1,表示被刷后的不透明度(缺省值为0)。
reorderable 逻辑值,表示是否对坐标重新排序。
axisDots 逻辑值,表示是否在多段线与坐标轴相交处用点标记。
margin list格式,列出边界空白的大小(单位为像素)。现阶段如果brushMode = “2D-strums”,需要左边边界空白为0, 因此可能会由于自动更正而导致异常结果。
composite 前景的合成类别。
alpha 取值范围是0到1,表示多段线的不透明度。
queue 逻辑值(缺省值为否:FALSE),用来表示是否将渐进式呈现的模式改为队列。如果数据集很大,此处通常为TRUE。
rate integer格式,表示队列渐进式呈现速率。
dimensions list格式,用来自定义坐标的维度。
bundleDimension 字符格式,表示需要捆绑的列/变量的名称。
bundlingStrength 数值格式,取值范围是0到1,表示捆绑的力度。如果bundleDimension是空的,那么这个参数将被忽略,不会对平行坐标产生影响。
smoothness 数值格式,取值范围是0到1,表示平滑度或曲率。如果bundleDimension是空的,那么这个参数将被忽略,不会对平行坐标产生影响。
tasks 可以是一个字符串,或者一个JS,或者一列字符串,或者一列JS。表示在parcoords呈现图像后运行的JavaScript函数。这为高级定制化图像提供了可能。请注意,函数运行的机制是JavaScript call。对于在函数内部的对象this来说,this.el代表了parcoords包含的元素,this.parcoords代表了parcoords的实体。
autoresize 逻辑值(缺省值是FALSE),代表在容器大小变化时是否自动改变parcoords的大小。在使用rmarkdown幻灯片展示或者flexdashboard的情境中,这将非常有用。但如果数据集很大或者在一个典型的html环境中则不太有用。
withD3 逻辑值,代表是否要包含d3r中的从属附件。parcoords htmlwidget独立使用了JavaScript,因此在global/window命名空间中不会包含完整的d3。若要包含d3.js,则应设置withD3 = TRUE。
width 整数值(单位为像素),代表了宽度。如果此处width = NULL,则会自动拉宽到100。
height 整数值(单位为像素),代表了高度。如果此处height = NULL,则高度会自动设置为400px。
elementId CSS选择器的ID。

63.1.1.4 返回值

一个属于htmlwidget类型的对象,可以作为HTML自动在不同环境中显示,包括R控制台里,Markdown文件内,和Shiny的输出文件内等。

63.1.2 parcoords-shiny

在Shiny中使用parcoords。

63.1.2.1 描述

用以在Shiny应用程序中使用sunburst和在交互式Rmd文件中输出并显示的函数。

63.1.2.2 使用方法

parcoordsOutput(outputId, width = "100%", height = "400px") renderParcoords(expr, env = parent.frame(), quoted = FALSE)

63.1.2.3 参数

参数 描述
outputId 返回的变量名称(用于读取)。
width, height 必须是有效的CSS单位(例如’100%‘, ’400px’, ‘auto’)或者一个数字。若是数字,则会转换成字符并在后方加上“px”。
expr 用来生成sunburst的表达式。
env 运行表达式expr的环境。
quoted expr是否是一个被引用的表达式(用quote())。若是想将表达式存在一个变量之中,这个参数将非常有用。

63.1.2.4 使用示例

if(interactive()) {

    #### filter proxy example ----
    library(parcoords)
    library(shiny)
    
    ui <- tagList(
        textOutput("filteredstate", container=h3),
        parcoordsOutput("pc")
    )
    
    server <- function(input, output, session) {
        rv <- reactiveValues(filtered = FALSE)
        output$pc <- renderParcoords({
            parcoords(mtcars)
        })
    
        observe({
            # toggle between filtered and unfiltered every 2.5 seconds
            invalidateLater(2500)
            rv$filtered <- !isolate(rv$filtered)
        })
        
        observeEvent(rv$filtered, {
            # create a proxy with which we will communicate between
            # Shiny and the parallel coordinates without a re-render
            pcp <- parcoordsProxy("pc")
            
            if(rv$filtered) {
                pcFilter(
                    pcp,
                    list(
                        cyl = c(6,8),
                        hp = list(gt = 200)
                    )
                )
            } else {
                pcFilter(pcp, list())
            }
        })
        
        output$filteredstate <- renderText({
            paste0("Filtered:", rv$filtered)
        })
    }
    
    shinyApp(ui = ui, server = server)
    
    ### center proxy example ----
    library(shiny)
    library(parcoords)
    
    ui <- tags$div(
        parcoordsOutput("pc", width = 2500),
        style="width:2500px;"
    )
    
    server <- function(input, output, session) {
        # create a proxy with which we will communicate between
        # Shiny and the parallel coordinates without a re-render
        pcp <- parcoordsProxy("pc")
        
        output$pc <- renderParcoords({
            parcoords(mtcars)
        })
        
        pcCenter(pcp, 'drat')
    }
    
    shinyApp(ui=ui, server=server)
    
    ### hide/unhide proxy example ----
    library(parcoords)
    library(shiny)
    
    ui <- tagList(
        selectizeInput(
            inputId = "columns",
            label = "Columns to Hide",
            choices = c("names",colnames(mtcars)),
            selected = "names",
            multiple = TRUE
        ),
        parcoordsOutput("pc"),
        checkboxInput("hidenames", label="Hide Row Names", value=TRUE),
        parcoordsOutput("pc2")
    )
    
    server <- function(input, output, session) {
        output$pc <- renderParcoords({
            parcoords(mtcars, rownames = FALSE, brushMode = "1d")
        })
        output$pc2 <- renderParcoords({
        parcoords(mtcars, rownames = FALSE)
    })
    
        pcUnhide
    
        observeEvent(input$columns, {
            # create a proxy with which we will communicate between
            # Shiny and the parallel coordinates without a re-render
            pcp <- parcoordsProxy("pc")
            
            pcHide(pcp, input$columns)
        }, ignoreInit = TRUE, ignoreNULL = FALSE)
        
        observeEvent(input$hidenames, {
            # create a proxy with which we will communicate between
            # Shiny and the parallel coordinates without a re-render
            pcp2 <- parcoordsProxy("pc2")
            if(input$hidenames) {
                pcHide(pcp2, "names")
            } else {
                pcUnhide(pcp2, "names")
            }
        })
    }
    
    shinyApp(ui = ui, server = server)
    
    
    ### snapshot example ----
    library(shiny)
    library(parcoords)
    
    ui <- tags$div(
        actionButton(inputId = "snapBtn", label = "snapshot"),
        parcoordsOutput("pc", height=400)
    )
    
    server <- function(input, output, session) {
        # create a proxy with which we will communicate between
        # Shiny and the parallel coordinates without a re-render
        pcp <- parcoordsProxy("pc")
    
        output$pc <- renderParcoords({
            parcoords(mtcars)
        })
    
        observeEvent(input$snapBtn, {
            # create a proxy with which we will communicate between
            # Shiny and the parallel coordinates without a re-render
            pcp <- parcoordsProxy("pc")
            pcSnapshot(pcp)
        })
    }
    
    shinyApp(ui=ui, server=server)
}




63.1.3 ParcoordsProxy

用于发送指令至Shiny 应用程序的代理实例中。

63.1.3.1 描述

创建一个parcoords 形式的对象,该对象可用于控制和自定义化已经渲染的平行坐标图。该函数只能在Shiny 应用程序和 Shiny 文档中使用。

63.1.3.2 使用方法

parcoordsProxy(parcoordsId, session = shiny::getDefaultReactiveDomain(), deferUntilFlush = TRUE)

63.1.3.3 参数

参数 描述
parcoordsID parcoordsID 该参数是一个单元素字符向量,代表需要更改的平行坐标图的输出ID。(注意:如果函数被Shiny模块调用,该命名空间会被自动添加)
session 该参数指向该图所属的Shiny会话控制对象,通常情况下使用默认值即可。
DeferUntilFlush 该参数用于指示是否立刻执行针对该实例的操作。若否,则保留该操作,直到下次所有输出更新后再执行。默认值为TRUE。

63.1.3.4 细节

通常情况下,我们可以直接使用parcoords函数创建平行坐标图。通过此,我们可以自定义一个存储在内存中的平行坐标图。这个平行坐标图可以在R控制台、R markdown 文档以及Shiny输出中显示。而在使用Shiny时,有时在输出/渲染完平行坐标图后,我们可能会想要进一步自定义化我们的平行坐标图。在这种情况下,之前存在内存的平行坐标图早已被清除,我们也早已在网页浏览器上完成了实例的实现。

因此我们需要使用ParcoordsProxy函数。该函数可以返回一个对象,用于代替普通parcoord(平行坐标图)对象。同时可以调用我们平时所用的绘制平行坐标图的函数,实现在动态实例中执行更改和自定义化的指令,而不是对存储在内存中的平行坐标图直接进行更改。


63.1.4 pcCenter

通过parcoordsProxy,实现基于列或者某一变量,将平行坐标图水平居中。

63.1.4.1 使用方法

pcCenter(pc = NULL, dim = NULL)

63.1.4.2 参数

参数 描述
Pc parcoordsProxy对象
dim 字符串向量,选择你想要作为居中基准的列或变量。

63.1.4.3 返回值

parcoordsProxy对象。


63.1.5 pcFilter

通过parcoordsProxy过滤不需要的平行坐标图。

63.1.5.1 使用方法

pcFilter(pc = NULL, filters = NULL)

63.1.5.2 参数

参数 描述
pc parcoordsProxy
filters 应用于parcoordsProxy实现过滤的过滤器列表。可查询参阅search.js中的示例。

63.1.5.3 返回值

parcoordsProxy对象。


63.1.6 pcHide

通过parcoordsProxy,隐藏平行坐标图的某些列。

63.1.6.1 用法

pcHide(pc = NULL, dim = NULL)

63.1.6.2 参数

参数 描述
pc parcoordsProxy对象。
dim 字符串向量,想要隐藏的列名。

63.1.6.3 返回值

parcoordsProxy对象。


63.1.7 pcSnapshot

通过parcoordsProxy获取平行坐标图的图像。

63.1.7.1 用法

pcSnapshot(pc = NULL)

63.1.7.2 参数

参数 描述
pc parcoordsProxy对象。

63.1.7.3 返回值

parcoordsProxy对象。


63.1.8 pcUnhide

通过parcoordsProxy解除平行坐标图的某些列的隐藏状态。

63.1.8.1 用法

pcUnHide(pc = NULL, dim = NULL)

63.1.8.2 参数

参数 描述
pc parcoordsProxy对象。
dim 字符串向量,想要解除隐藏的列。

63.1.8.3 返回值

parcoordsProxy对象。



63.2 2. ‘parcoords’使用教程 - 中文翻译

翻译自英文原版教程: ftp://cran.r-project.org/pub/R/web/packages/parcoords/vignettes/introduction-to-parcoords-.html

肯顿·罗素
2019-05-21

Parcoords 提供shinycrosstalk完全集成的多元数据集的交互性视图(parcoords-es)。

63.2.1 范例

绘制平行坐标图时,默认视图仅提供有限的交互性。parcoords的多种参数可提供一个更有身临其境感的自定义化过程。

63.2.2 选项

63.2.2.1 刷子模式

通过brushMode参数,我们可以使用多种笔刷,通过该功能用户可以自由过滤/选择数据。

除了brushMode外,parcoords还有其他参数支持进一步自定义化。例如brushPredicatealphaOnBrushed。可通过两个示例图的对比,查看它们的功能。

63.2.2.2 颜色

可以用rgbhex值给平行坐标图上单一颜色。

我们还可以通过提供以下参数list( colorScale = , colorBy = , colorScheme = , colorInterpolator =, colorDomain =)给颜色函数,以对颜色进行更改。其中,colorScaled3-scale中的参数名字,例如scaleOrdinalscaleSequentialcolorBy是原数据中决定颜色的列名。如果根据离散变量或者顺序变量对平行坐标图上色,请同时提供colorScheme参数,如schemCategory10,以保证上色能正常进行。如果通过连续变量对其上色,请同时提供colorInterpolator,该参数为d3插值器的名称,如interpolateViridis。如果使用d3提供的色标,请务必把参数withD3=TRUE包含在函数中。以下示例有助于阐明以上概念。

对使用连续变量上色,list在参数colorScale = ‘scaleSequential’上可能与其他情况下的略有不同。该情况下,默认的插值器是interpolateViridis,而在下面的例子中,我们使用interpolateMagma作为插值器。

63.2.2.3 捆绑

当我们的数据集更大时,使用捆绑功能会很有帮助。为了数据集的大小起见,我们将继续使用mtcars数据。要查看效果,可以尝试使用survival::colonggplot2::diamonds

63.2.2.4 队列和速率

对于较大的数据集(> 1000行),除非设置queue = TRUErate,否则图的交互反应速度会大大降低。这里可能需要进行一些试验才能选择正确的参数达到好的效果。如上所述,我们使用mtcars来示范。而实际上,只有当数据集真的很大时才需要使用这些功能。

63.2.2.5 贴砖模式

我添加了参数mode = 'tiled',以此来使用下述方法

"基于贴砖模式的平行坐标图及其在财务数据可视化中的应用"


Jamal Alsakran, Ye Zhao, and Xinlei Zhao

我很乐意接受关于此方法的反馈或建议。尽管该技术是为较大的数据集设计的,但是此代码尚未经过优化,并且未使用缓存,因此随着数据的增大,它实际上会变慢。对于使用数据集mtcars来说,此方法并没有意义。但出于示例目的,我们将继续使用这个较小的数据集。

63.2.3 方法

该包提供了一些独立使用或在Shiny中使用的辅助方法。例如,我们可以使用快照功能来得到一个png格式的文件,作为对平行坐标图的当前状态的导出。

63.2.3.1 截图快照

先前版本的平行坐标中,提供了一些可以将图表捕获为静态图像的基本支持。但是,功能尚不完善,并且实施存在问题。现在,可以通过JavaScript和R的快照功能来达到目的。生成的图像还将记录刷子的当前状态。

63.2.3.2 使用Shiny的代理方法

leafletplotly类似,parcoords中提供了代理方法,来与Shiny中的平行坐标进行交互,并且无需完全重新渲染。当前,下列功能(名称由pc*分隔)可以使用。

  • pcFilter
  • pcCenter
  • pcSnapshot
  • pcHide
  • pcUnhide
  • pcSnapshot

可以输入?parcoords-shiny来查看相关使用示例。