當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。