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


R legend 將圖例添加到繪圖中


R語言 legend 位於 graphics 包(package)。

說明

此函數可用於向繪圖添加圖例。請注意,可以使用對函數locator(1) 的調用來代替xy 參數。

用法

legend(x, y = NULL, legend, fill = NULL, col = par("col"),
       border = "black", lty, lwd, pch,
       angle = 45, density = NULL, bty = "o", bg = par("bg"),
       box.lwd = par("lwd"), box.lty = par("lty"), box.col = par("fg"),
       pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd,
       xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1,
       adj = c(0, 0.5), text.width = NULL, text.col = par("col"),
       text.font = NULL, merge = do.lines && has.pch, trace = FALSE,
       plot = TRUE, ncol = 1, horiz = FALSE, title = NULL,
       inset = 0, xpd, title.col = text.col[1], title.adj = 0.5,
       title.cex = cex[1], title.font = text.font[1],
       seg.len = 2)

參數

x, y

用於定位圖例的 x 和 y 坐標。它們可以通過關鍵字或 xy.coords 接受的任何方式指定:請參閱“詳細信息”。

legend

圖例中出現的字符或長度為 expression 向量。其他對象將被 as.graphicsAnnot 強製。

fill

如果指定,此參數將導致填充指定顏色(或以指定顏色著色)的框出現在圖例文本旁邊。

col

圖例中出現的點或線的顏色。

border

框的邊框顏色(僅在指定 fill 時使用)。

lty, lwd

圖例中出現的線條類型和寬度。必須指定這兩者之一來繪製線條。

pch

圖例中出現的繪圖符號,作為數值向量或 1 字符字符串向量(請參閱 points )。與 points 不同,這都可以指定為單個多字符字符串。必須指定符號繪製。

angle

陰影線的角度。

density

陰影線的密度(如果為數字且為正值)。如果NULL或負數或NA顏色填充被假設。

bty

要在圖例周圍繪製的框的類型。允許的值為 "o" (默認值)和 "n"

bg

圖例框的背景顏色。 (請注意,這僅在 bty != "n" 時使用。)

box.lty, box.lwd, box.col

圖例框的線條類型、寬度和顏色(如果 bty = "o" )。

pt.bg

points 的背景顏色,對應於其參數 bg

cex

相對於當前 par("cex") 的字符擴展因子。用於文本,並提供 pt.cex 的默認值。

pt.cex

點的擴展因子。

pt.lwd

點的線寬,默認為線的線寬,或者如果未設置,則為 par("lwd")

xjust

如何相對於圖例 x 位置調整圖例。值 0 表示左對齊,0.5 表示居中,1 表示右對齊。

yjust

與圖例 y 位置的 xjust 相同。

x.intersp

符號和圖例文本之間的水平 (x) 間距的字符間距因子。

y.intersp

垂直 (y) 距離(以每個圖例條目上方/下方共享的文本行為單位)。可以使用圖例的每一行具有一個元素的向量。

adj

長度為 1 或 2 的數字;圖例文本的字符串調整。當 labelsplotmath 表達式時,對於 y 調整很有用。

text.width

x ( "user" ) 坐標中圖例文本的寬度。 (即使對於反向的 x 軸也應該為正。)可以是單個正數值(圖例的每一列的寬度相同)、向量(圖例的每一列一個元素)、NULL(默認)計算適當的最大值 strwidth(legend) ),或 NA 計算適當的列最大值 strwidth(legend) )。

text.col

用於圖例文本的顏色。

text.font

用於圖例文本的字體,請參閱 text

merge

邏輯性;如果 TRUE ,則合並點和線,但不合並填充框。如果有點和線,則默認為TRUE

trace

邏輯性; if TRUE ,顯示 legend 如何進行所有神奇的計算。

plot

合乎邏輯的。如果 FALSE ,則不會繪製任何內容,但會返回大小。

ncol

設置圖例項的列數(默認為 1,垂直圖例)。

horiz

邏輯性;如果 TRUE ,則水平設置圖例而不是垂直(指定 horiz 覆蓋 ncol 規範)。

title

字符串或長度為 1 的表達式,給出要放置在圖例頂部的標題。其他對象將被 as.graphicsAnnot 強製。

inset

當通過關鍵字放置圖例時,距邊距的插入距離作為繪圖區域的一部分。

xpd

如果提供,則繪製圖例時要使用的 graphical parameter xpd 的值。

title.col

title 的顏色,默認為 text.col[1]

title.adj

title 的水平調整:請參閱 par("adj") 的幫助。

title.cex

標題的擴展因子,默認為 cex[1]

title.font

用於圖例標題的字體,默認為 text.font[1] ,請參閱 text

seg.len

用於說明 lty 和/或 lwd 的線條長度(以字符寬度為單位)。

細節

參數 xylegend 以非標準方式解釋,以允許通過一個或兩個參數指定坐標。如果 legend 缺失且 y 不是數字,則假定第二個參數為 legend,並且第一個參數指定坐標。

坐標可以以 xy.coords 接受的任何方式指定。如果給出一個點的坐標,則將其用作包含圖例的矩形的左上角坐標。如果它給出兩個點的坐標,則這些點指定矩形的對角(任意一對角,順序任意)。

還可以通過將x設置為列表"bottomright" , "bottom" , "bottomleft" , "left" , "topleft" , "top" , "topright" , "right""center"中的單個關鍵字來指定該位置。這會將圖例放置在圖框內部的給定位置。使用部分參數匹配。可選的 inset 參數指定圖例距繪圖邊距的插入距離。如果給出單個值,則該值將用於兩個邊距;如果給出兩個值,第一個值用於 x - 距離,第二個值用於 y - 距離。

如有必要,屬性參數(例如 colpchlty 等)將被回收:merge 則不會。將lty條目設置為0或將lwd條目設置為NA以抑製相應圖例條目中的行;將 pch 值設置為 NA 以抑製點。

點在線條之後繪製,以便它們可以用背景顏色 pt.bg 覆蓋線條(如果適用)。

請參閱示例以了解如何右對齊標簽。

由於它們不用於 Unicode 代碼點,因此 -31:-1 值將被默默省略,NA"" 值也是如此。

包含列表組件的列表

rect

包含組件的列表

w , h

正數給出圖例框的寬度和高度。

left , top

框左上角的 x 和 y 坐標。

text

包含組件的列表

x, y

長度為 length(legend) 的數值向量,給出圖例文本的 x 和 y 坐標。

無形中返回了。

例子

## Run the example in '?matplot' or the following:
leg.txt <- c("Setosa     Petals", "Setosa     Sepals",
             "Versicolor Petals", "Versicolor Sepals")
y.leg <- c(4.5, 3, 2.1, 1.4, .7)
cexv  <- c(1.2, 1, 4/5, 2/3, 1/2)
matplot(c(1, 8), c(0, 4.5), type = "n", xlab = "Length", ylab = "Width",
        main = "Petal and Sepal Dimensions in Iris Blossoms")
for (i in seq(cexv)) {
  text  (1, y.leg[i] - 0.1, paste("cex=", formatC(cexv[i])), cex = 0.8, adj = 0)
  legend(3, y.leg[i], leg.txt, pch = "sSvV", col = c(1, 3), cex = cexv[i])
}
## cex *vector* [in R <= 3.5.1 has 'if(xc < 0)' w/ length(xc) == 2]
legend("right", leg.txt, pch = "sSvV", col = c(1, 3),
       cex = 1+(-1:2)/8, trace = TRUE)# trace: show computed lengths & coords

## 'merge = TRUE' for merging lines & points:
x <- seq(-pi, pi, length.out = 65)
for(reverse in c(FALSE, TRUE)) {  ## normal *and* reverse axes:
  F <- if(reverse) rev else identity
  plot(x, sin(x), type = "l", col = 3, lty = 2,
       xlim = F(range(x)), ylim = F(c(-1.2, 1.8)))
  points(x, cos(x), pch = 3, col = 4)
  lines(x, tan(x), type = "b", lty = 1, pch = 4, col = 6)
  title("legend('top', lty = c(2, -1, 1), pch = c(NA, 3, 4), merge = TRUE)",
        cex.main = 1.1)
  legend("top", c("sin", "cos", "tan"), col = c(3, 4, 6),
       text.col = "green4", lty = c(2, -1, 1), pch = c(NA, 3, 4),
       merge = TRUE, bg = "gray90", trace=TRUE)
  
} # for(..)

## right-justifying a set of labels: thanks to Uwe Ligges
x <- 1:5; y1 <- 1/x; y2 <- 2/x
plot(rep(x, 2), c(y1, y2), type = "n", xlab = "x", ylab = "y")
lines(x, y1); lines(x, y2, lty = 2)
temp <- legend("topright", legend = c(" ", " "),
               text.width = strwidth("1,000,000"),
               lty = 1:2, xjust = 1, yjust = 1, inset = 1/10,
               title = "Line Types", title.cex = 0.5, trace=TRUE)
text(temp$rect$left + temp$rect$w, temp$text$y,
     c("1,000", "1,000,000"), pos = 2)


##--- log scaled Examples ------------------------------
leg.txt <- c("a one", "a two")

par(mfrow = c(2, 2))
for(ll in c("","x","y","xy")) {
  plot(2:10, log = ll, main = paste0("log = '", ll, "'"))
  abline(1, 1)
  lines(2:3, 3:4, col = 2)
  points(2, 2, col = 3)
  rect(2, 3, 3, 2, col = 4)
  text(c(3,3), 2:3, c("rect(2,3,3,2, col=4)",
                      "text(c(3,3),2:3,\"c(rect(...)\")"), adj = c(0, 0.3))
  legend(list(x = 2,y = 8), legend = leg.txt, col = 2:3, pch = 1:2,
         lty = 1)  #, trace = TRUE)
} #      ^^^^^^^ to force lines -> automatic merge=TRUE
par(mfrow = c(1,1))

##-- Math expressions:  ------------------------------
x <- seq(-pi, pi, length.out = 65)
plot(x, sin(x), type = "l", col = 2, xlab = expression(phi),
     ylab = expression(f(phi)))
abline(h = -1:1, v = pi/2*(-6:6), col = "gray90")
lines(x, cos(x), col = 3, lty = 2)
ex.cs1 <- expression(plain(sin) * phi,  paste("cos", phi))  # 2 ways
utils::str(legend(-3, .9, ex.cs1, lty = 1:2, plot = FALSE,
           adj = c(0, 0.6)))  # adj y !
legend(-3, 0.9, ex.cs1, lty = 1:2, col = 2:3,  adj = c(0, 0.6))

require(stats)
x <- rexp(100, rate = .5)
hist(x, main = "Mean and Median of a Skewed Distribution")
abline(v = mean(x),   col = 2, lty = 2, lwd = 2)
abline(v = median(x), col = 3, lty = 3, lwd = 2)
ex12 <- expression(bar(x) == sum(over(x[i], n), i == 1, n),
                   hat(x) == median(x[i], i == 1, n))
utils::str(legend(4.1, 30, ex12, col = 2:3, lty = 2:3, lwd = 2))

## 'Filled' boxes -- see also example(barplot) which may call legend(*, fill=)
barplot(VADeaths)
legend("topright", rownames(VADeaths), fill = gray.colors(nrow(VADeaths)))

## Using 'ncol'
x <- 0:64/64
for(R in c(identity, rev)) { # normal *and* reverse x-axis works fine:
  xl <- R(range(x)); x1 <- xl[1]
matplot(x, outer(x, 1:7, function(x, k) sin(k * pi * x)), xlim=xl,
        type = "o", col = 1:7, ylim = c(-1, 1.5), pch = "*")
op <- par(bg = "antiquewhite1")
legend(x1, 1.5, paste("sin(", 1:7, "pi * x)"), col = 1:7, lty = 1:7,
       pch = "*", ncol = 4, cex = 0.8)
legend("bottomright", paste("sin(", 1:7, "pi * x)"), col = 1:7, lty = 1:7,
       pch = "*", cex = 0.8)
legend(x1, -.1, paste("sin(", 1:4, "pi * x)"), col = 1:4, lty = 1:4,
       ncol = 2, cex = 0.8)
legend(x1, -.4, paste("sin(", 5:7, "pi * x)"), col = 4:6,  pch = 24,
       ncol = 2, cex = 1.5, lwd = 2, pt.bg = "pink", pt.cex = 1:3)
par(op)
  
} # for(..)

## point covering line :
y <- sin(3*pi*x)
plot(x, y, type = "l", col = "blue",
    main = "points with bg & legend(*, pt.bg)")
points(x, y, pch = 21, bg = "white")
legend(.4,1, "sin(c x)", pch = 21, pt.bg = "white", lty = 1, col = "blue")

## legends with titles at different locations
plot(x, y, type = "n")
legend("bottomright", "(x,y)", pch=1, title= "bottomright")
legend("bottom",      "(x,y)", pch=1, title= "bottom")
legend("bottomleft",  "(x,y)", pch=1, title= "bottomleft")
legend("left",        "(x,y)", pch=1, title= "left")
legend("topleft",     "(x,y)", pch=1, title= "topleft, inset = .05", inset = .05)
legend("top",         "(x,y)", pch=1, title= "top")
legend("topright",    "(x,y)", pch=1, title= "topright, inset = .02",inset = .02)
legend("right",       "(x,y)", pch=1, title= "right")
legend("center",      "(x,y)", pch=1, title= "center")

# using text.font (and text.col):
op <- par(mfrow = c(2, 2), mar = rep(2.1, 4))
c6 <- terrain.colors(10)[1:6]
for(i in 1:4) {
   plot(1, type = "n", axes = FALSE, ann = FALSE); title(paste("text.font =",i))
   legend("top", legend = LETTERS[1:6], col = c6,
          ncol = 2, cex = 2, lwd = 3, text.font = i, text.col = c6)
}
par(op)

# using text.width for several columns
plot(1, type="n")
legend("topleft", c("This legend", "has", "equally sized", "columns."),
       pch = 1:4, ncol = 4)
legend("bottomleft", c("This legend", "has", "optimally sized", "columns."),
       pch = 1:4, ncol = 4, text.width = NA)
legend("right", letters[1:4], pch = 1:4, ncol = 4,
       text.width = 1:4 / 50)

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

Murrell, P. (2005) R Graphics. Chapman & Hall/CRC Press.

也可以看看

plotbarplot 使用 legend()text 獲取更多數學表達式示例。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Add Legends to Plots。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。