当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R interaction 与格子图交互的函数


R语言 interaction 位于 lattice 包(package)。

说明

经典的网格范式是一次性绘制整个对象,之后不可能与其交互。然而,通过跟踪绘制面板和条带的网格视口,之后可以返回它们并一次增强它们一个面板。这些函数提供了方便的接口来帮助实现这一点。请注意,这些仍处于实验阶段,具体细节将来可能会发生变化。

用法

panel.identify(x, y = NULL,
               subscripts = seq_along(x),
               labels = subscripts, 
               n = length(x), offset = 0.5,
               threshold = 18, ## in points, roughly 0.25 inches
               panel.args = trellis.panelArgs(),
               ...)
panel.identify.qqmath(x, distribution, groups, subscripts, labels,
                      panel.args = trellis.panelArgs(),
                      ...)
panel.identify.cloud(x, y, z, subscripts,
                     perspective, distance, 
                     xlim, ylim, zlim,
                     screen, R.mat, aspect, scales.3d,
                     ...,
                     panel.3d.identify,
                     n = length(subscripts),
                     offset = 0.5,
                     threshold = 18,
                     labels = subscripts,
                     panel.args = trellis.panelArgs())
panel.link.splom(threshold = 18, verbose = getOption("verbose"), ...)
panel.brush.splom(threshold = 18, verbose = getOption("verbose"), ...)


trellis.vpname(name = c("position", "split", "split.location", "toplevel",
                        "figure", "panel", "strip", "strip.left",
                        "legend", "legend.region", "main", "sub",
                        "xlab", "ylab", "xlab.top", "ylab.right", "page"),
               column, row,
               side = c("left", "top", "right", "bottom", "inside"),
               clip.off = FALSE, prefix)
trellis.grobname(name,
                 type = c("", "panel", "strip", "strip.left",
                          "key", "colorkey"),
                 group = 0,
                 which.given = lattice.getStatus("current.which.given",
                                                 prefix = prefix),
                 which.panel = lattice.getStatus("current.which.panel",
                                                 prefix = prefix),
                 column = lattice.getStatus("current.focus.column",
                                            prefix = prefix),
                 row = lattice.getStatus("current.focus.row",
                                         prefix = prefix),
                 prefix = lattice.getStatus("current.prefix"))
trellis.focus(name, column, row, side, clip.off,
              highlight = interactive(), ..., prefix,
              guess = TRUE, verbose = getOption("verbose"))
trellis.switchFocus(name, side, clip.off, highlight, ..., prefix)
trellis.unfocus()
trellis.panelArgs(x, packet.number)

参数

x , y , z

定义面板内容的变量。对于 trellis.panelArgs ,是一个 "trellis" 对象。

n

默认情况下要识别的点数(通过右键单击覆盖)

subscripts

与每个点关联的整数索引的可选向量。请参阅下面的详细信息。

labels

与每个点关联的标签的可选向量。默认为subscripts

distribution , groups

panel.qqmath 的典型面板参数。这些通常从panel.args获得

offset

标签打印在识别点的下方、上方、左侧或右侧,具体取决于鼠标单击的相对位置。 offset 指定(以 "char" 为单位)标签应打印到距识别点多远的位置。

threshold

网格 "points" 单位的阈值。不考虑距离鼠标单击位置更远的点

panel.args

包含组件名称 x (通常是 y )的列表,如果缺少 x 则使用。通常,当在 trellis.focus 之后调用时,这将适当地成为传递给该面板的参数。

perspective , distance , xlim , ylim , zlim , screen , R.mat , aspect , scales.3d

传递给 panel.cloud 的参数。这些是重新计算 panel.identify.cloud 中相关三维投影所必需的。

panel.3d.identify

数据重新缩放和旋转计算完成后负责实际交互的函数。默认情况下,使用类似于panel.identify的内部函数。

name

一个字符串,指示我们正在寻找哪个视口或对象。尽管这些不一定提供对由格子图创建的所有视口和对象的访问,但它们涵盖了end-users可能感兴趣的大多数内容。

trellis.vpnametrellis.focus 仅处理视口名称,并且仅接受上面明确列出的值。 trellis.grobname 旨在为 grobs 创建名称,目前可以接受任何值。

如果在对 trellis.focus 的调用中缺少 name 以及 columnrow ,则用户可以在面板(或关联的条带)内部单击以聚焦于该面板。但请注意,这假设每个面板的宽度和高度相等,并且当情况不正确时可能不起作用。

name"panel""strip""strip.left"时,还必须指定columnrow。当 name"legend" 时,还必须指定 side

column , row

整数,指示应在网格布局中分配焦点的面板或条带的位置。行通常是从下往上计算的,除非绘图是使用 as.table=TRUE 创建的

guess

合乎逻辑的。如果 TRUE ,并且显示器只有一个面板,则将通过调用 trellis.focus 自动选择该面板。

side

字符串,仅与图例相关(即,当 name="legend" 时),指示它们的位置。只要明确,部分规范是允许的。

clip.off

逻辑,是否应关闭剪裁,当 name"panel""strip" 时相关。如果要将轴绘制在面板或条带之外,则这是必要的。请注意,设置clip.off=FALSE并不一定意味着剪裁已打开;这是由打印期间的实际条件决定的。

type

指定 grob 是否特定于特定面板或条带的字符串。

type"panel""strip""strip.left" 时,有关面板的信息将添加到 grob 名称中。

group

一个整数,指定该 grob 是否特定于图中的特定组。

group 大于零时,有关组的信息将添加到 grob 名称中。

which.given , which.panel

整数,指示正在表示哪个条件变量(在条带内)以及条件变量的当前级别。

which.panel 的长度大于 1,并且 type"strip""strip.left" 时,有关条件变量的信息将添加到 grob 名称中。

prefix

用作标识 "trellis" 对象图的前缀的字符串,主要用于区分不同图中的等效视口。仅当特定页面被多个绘图占据时,这才变得相关。默认为适合最后打印的 "trellis" 对象的值,由 print.trellis 中的 prefix 参数确定。

用户通常不需要为此参数提供值,除非与最后绘制的绘图以外的现有绘图进行交互。

对于 switchFocus ,除非它与当前活动绘图的前缀不匹配,否则将被忽略,在这种情况下会发生错误。

highlight

逻辑上,是否应突出显示分配焦点的视口。对于 trellis.focus ,在交互模式下默认为 TRUE,而 trellis.switchFocus 默认保留当前活动的设置。

packet.number

整数,从哪个面板获取数据。有关如何计算的详细信息,请参阅packet.number

verbose

是否打印详细信息

...

对于 panel.identify.qqmath ,额外的参数将传递给 panel.identify 。对于 panel.identify ,额外的参数被视为图形参数并用于标记。对于 trellis.focustrellis.switchFocus ,如果有要求,则使用它们(与 lattice.options 组合)突出显示所选视口。可以为 panel.link.splom 提供图形参数。

细节

panel.identifyidentify 类似。调用时,它等待用户通过鼠标单击来识别点(在正在绘制的面板中)。单击 left-clicks 以外的其他按钮会终止该过程。尽管可以将其作为面板函数的一部分进行调用,但更典型的做法是在绘制整个对象后使用它来识别点,在这种情况下,首先需要调用trellis.focus

panel.link.splom 旨在与 splom 一起使用,并且需要在调用之前使用 trellis.focus 选择面板。单击一个点会导致该点以及其他成对散点图中的相应投影突出显示。 panel.brush.splompanel.link.splom 的(错误命名的)别名,保留是为了向后兼容。

panel.identify.qqmath 是一个专门的包装器,用于与 qqmath 生成的显示一起使用。 panel.identify.qqmath 是一个专门的包装器,用于与 cloud 生成的显示一起使用。除非在可通过 trellis.panelArgs 使用默认面板函数参数的上下文中(见下文),否则调用它们是不寻常的。

panel.identify 等与 identify 的不同之处在于它如何使用 subscripts 参数。一般来说,当人们识别面板中的点时,人们希望识别用于生成绘图的 DataFrame 中的原点,而不是该特定面板内的原点。此信息可供面板函数使用,但仅在某些情况下可用。确保 subscripts 可用的一种方法是在高级调用中指定 subscripts = TRUE,例如 xyplot 。如果 subscripts 未在 panel.identify 调用中显式指定,但在 panel.args 中可用,则将使用这些值。否则,它们默认为 seq_along(x) 。无论哪种情况,最终返回值都将是标记的下标。

打印(绘制)网格对象的过程会构建一个带有命名视口的网格布局,然后可以访问该视口以进一步修改绘图。虽然只有直接使用网格函数才能获得完全的灵活性,但一些网格函数可用于更常见的任务。

trellis.focus 可用于移动到特定面板或条带,由其在面板数组中的位置标识。它还可用于聚焦于与标签之一或图例相对应的视口,尽管这种用法不太有用。确切的视口由 name 以及其他参数确定,并非所有参数都与所有名称相关。请注意,当在一页上绘制多个对象时,trellis.focus 将始终转到最后创建的绘图。为了获得更大的灵活性,请直接使用网格函数(请参见下面的注释)。

成功调用 trellis.focus 后,所需的视口(通常是面板或条带区域)将成为 ‘current’ 视口(绘图区域),然后可以通过调用标准晶格面板函数和网格函数来增强该视口。

在绘制 "trellis" 对象时而不是在此之前选择面板布局是很常见的。有关布局的信息(具体来说,有多少行和列,以及哪个数据包属于此布局中的哪个位置)会为最后绘制的 "trellis" 对象保留,并可通过 trellis.currentLayout 获得。

trellis.unfocus 取消焦点,并使顶层视口成为当前视口。

trellis.switchFocus 是一个方便的函数,可以从一个视口切换到另一个视口,同时保留当前的 rowcolumn 。尽管行和列仅对面板和条带有意义,但即使用户切换到其他视口(其中行/列不相关)然后再切换返回,它们也会被保留。

一旦面板或条带获得焦点,trellis.panelArgs 可用于检索该位置的面板函数可用的参数。在这种情况下,可以不带参数调用它,如下所示

trellis.panelArgs()

当打印 "trellis" 对象时也允许这种用法,例如在面板函数或轴函数内(但不在预面板函数内)。 trellis.panelArgs 还可以从任何 "trellis" 对象检索面板参数。请注意,对于这种用法,需要指定 packet.number(如 xyplot 中的 panel 条目所述)而不是布局中的位置,因为布局仅在打印对象后才确定面板。

通常不需要直接调用trellis.vpnametrellis.grobname。然而,当使用网格函数直接与绘图交互时,它们可以以可移植的方式生成适当的名称,如下面的注释中所述。

panel.identify 返回一个整数向量,其中包含已识别点的下标(请参阅上面的详细信息)。 identifypos=TRUE 的等效项尚未实现,但如果需要,可以考虑添加。

trellis.panelArgs 返回可用于所选面板的面板函数的参数的命名列表。

trellis.vpnametrellis.grobname 返回字符串。

仅当 trellis.focus 用于以交互方式聚焦于面板时,trellis.focus 才具有有意义的返回值,在这种情况下,返回值是一个包含组件 colrow 的列表,分别给出所选面板的列和行位置,除非选择被取消(通过右键单击),在这种情况下返回值为 NULL 。如果单击在面板外部,则 colrow 均设置为 0。

注意

用户可以通过trellis.focus访问由lattice创建的视口,如上所述。 grid 包中的函数也可以直接使用。例如,current.vpTree 可用于检查当前视口树,seekViewportdownViewport 可用于导航到这些视口。对于此类用法,trellis.vpnametrellis.grobname 提供了一种可移植的方式来按名称访问适当的视口和对象。

例子


## Not run: 
xyplot(1:10 ~ 1:10)
trellis.focus("panel", 1, 1)
panel.identify()

## End(Not run)

xyplot(Petal.Length ~ Sepal.Length | Species, iris, layout = c(2, 2))
Sys.sleep(1)

trellis.focus("panel", 1, 1)
do.call("panel.lmline", trellis.panelArgs())
Sys.sleep(0.5)
trellis.unfocus()

trellis.focus("panel", 2, 1)
do.call("panel.lmline", trellis.panelArgs())
Sys.sleep(0.5)
trellis.unfocus()

trellis.focus("panel", 1, 2)
do.call("panel.lmline", trellis.panelArgs())
Sys.sleep(0.5)
trellis.unfocus()


## choosing loess smoothing parameter

p <- xyplot(dist ~ speed, cars)

panel.loessresid <-
    function(x = panel.args$x,
             y = panel.args$y,
             span,
             panel.args = trellis.panelArgs())
{
    fm <- loess(y ~ x, span = span)
    xgrid <- do.breaks(current.panel.limits()$xlim, 50)
    ygrid <- predict(fm, newdata = data.frame(x = xgrid))
    panel.lines(xgrid, ygrid)
    pred <- predict(fm)
    ## center residuals so that they fall inside panel
    resids <- y - pred + mean(y)
    fm.resid <- loess.smooth(x, resids, span = span)
    ##panel.points(x, resids, col = 1, pch = 4)
    panel.lines(fm.resid, col = 1)
}


spans <- c(0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8)
update(p, index.cond = list(rep(1, length(spans))))
panel.locs <- trellis.currentLayout()

i <- 1

for (row in 1:nrow(panel.locs))
    for (column in 1:ncol(panel.locs))
    if (panel.locs[row, column] > 0)
{
    trellis.focus("panel", row = row, column = column,
                  highlight = FALSE)
    panel.loessresid(span = spans[i])
    grid::grid.text(paste("span = ", spans[i]),
                    x = 0.25,
                    y = 0.75,
                    default.units = "npc")
    trellis.unfocus()
    i <- i + 1
}


作者

Deepayan Sarkar Deepayan.Sarkar@R-project.org. Felix Andrews provided initial implementations of panel.identify.qqmath and support for focusing on panels interctively.

也可以看看

identify , Lattice , print.trellis , trellis.currentLayout , current.vpTree , viewports

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Functions to Interact with Lattice Plots。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。