ggplot2我注意到's geom.中出现了意想不到的行为geom_text()。如果属性hjust和vjust被指定为字符串,R 将返回强制错误,尽管绘图看起来似乎正常。这个问题出现在我正在开发的基于 ggplot2 的包中。为简单起见,我创建了仍然会产生错误的精简示例。
首先,我尝试了qplot()
##qplot version
library(ggplot2)
p <- qplot(cty, hwy,
label = drv,
hjust = "right",
geom = "text",
data = mpg
)
print(p)
Run Code Online (Sandbox Code Playgroud)
我得到了这个错误:
Warning message:
In validDetails.text(x) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
然后我尝试了ggplot():
##ggplot version
library(ggplot2)
p <- ggplot(
aes(x = cty,
y = hwy
), data = mpg
)
p <- p + geom_text(
aes(label = drv),
hjust = "right"
)
print(p)
Run Code Online (Sandbox Code Playgroud)
并得到了相同的情节和相同的错误:
Warning message:
In validDetails.text(x) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
然后我尝试设置 hjust 和 vjust:
library(ggplot2)
p <- ggplot(
aes(x = cty,
y = hwy
), data = mpg
)
p <- p + geom_text(
aes(label = drv),
hjust = "right",
vjust = "top"
)
print(p)
Run Code Online (Sandbox Code Playgroud)
使用字符串设置两个参数后,R 返回两个强制错误:
Warning messages:
1: In validDetails.text(x) : NAs introduced by coercion
2: In validDetails.text(x) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
但是,当参数是数字时,R 不会返回强制错误:
## Using numbers instead of strings
library(ggplot2)
p <- ggplot(
aes(x = cty,
y = hwy
), data = mpg
)
p <- p + geom_text(
aes(label = drv),
hjust = 0,
vjust = 0,
data = mpg
)
print(p)
Run Code Online (Sandbox Code Playgroud)
我不太确定为什么会发生这种情况,或者它是否很重要,但我没想到会发生这种情况。
Hadley 的书(第 196 页)说hjust并且vjust
可以接受字符串参数:
字符串(或图例)的对齐定义了字符串中放置在给定位置的位置。水平和垂直对齐有两个值。这些值可以是:
- 字符串:“左”、“右”、“中心”、“中心”、“底部”和“顶部”。
- 0 到 1 之间的数字,给出字符串中的位置(从左下角开始)。
但是 0.8.9 版本中的 man 文件geom_text()说 hjust 和 vjust 是数字,尽管它并没有说它们只能
是数字:
美学
以下美学可以与 geom_text 一起使用。使用 aes 函数将美学映射到数据中的变量:geom_text(aes(x = var))
- x:x位置(必填)
- y:y 位置(必需)
- label:文字标签(必填)
- 颜色:边框颜色
- 尺寸: 尺寸
- 角度: 角度
- hjust:水平对齐,介于0和1之间
- vjust:垂直对齐,0到1之间
- 阿尔法:透明度
所以,我不太了解什么代码定义或消耗 hjust/vjust,但是使用 TextMate 的“在项目中查找”(在 ggplot2/R/ 目录中)进行 hjust,我没有看到任何看起来像它们的行hjust 的定义或实现...只是将其列为有效 aes 以及传递的位置。
这让我想去阅读网格......
http://stat.ethz.ch/R-manual/R-patched/library/grid/html/grid.text.html
这让我想更多地了解 grid.text 是如何定义的
R> grid.text
function (label, x = unit(0.5, "npc"), y = unit(0.5, "npc"),
just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE,
default.units = "npc", name = NULL, gp = gpar(), draw = TRUE,
vp = NULL)
{
tg <- textGrob(label = label, x = x, y = y, just = just,
hjust = hjust, vjust = vjust, rot = rot, check.overlap = check.overlap,
default.units = default.units, name = name, gp = gp,
vp = vp)
if (draw)
grid.draw(tg)
invisible(tg)
}
<environment: namespace:grid>
Run Code Online (Sandbox Code Playgroud)
所以,它是一个 textGrob,只是,hjust 和 vjust 被简单地传递给它......传递给 textGrob
R> textGrob
function (label, x = unit(0.5, "npc"), y = unit(0.5, "npc"),
just = "centre", hjust = NULL, vjust = NULL, rot = 0, check.overlap = FALSE,
default.units = "npc", name = NULL, gp = gpar(), vp = NULL)
{
if (!is.unit(x))
x <- unit(x, default.units)
if (!is.unit(y))
y <- unit(y, default.units)
grob(label = label, x = x, y = y, just = just, hjust = hjust,
vjust = vjust, rot = rot, check.overlap = check.overlap,
name = name, gp = gp, vp = vp, cl = "text")
}
<environment: namespace:grid>
Run Code Online (Sandbox Code Playgroud)
所以,这是一个grob............去grob......
R> grob
function (..., name = NULL, gp = NULL, vp = NULL, cl = NULL)
{
g <- list(..., name = name, gp = gp, vp = vp)
if (!is.null(cl) && !is.character(cl))
stop("Invalid 'grob' class")
class(g) <- c(cl, "grob", "gDesc")
validGrob(g)
}
<environment: namespace:grid>
Run Code Online (Sandbox Code Playgroud)
那里没有什么太大帮助,所以我谷歌
R网格hjust vjust
在覆盖谷歌对我的搜索的自动更正之后,我发现
http://rwiki.sciviews.org/doku.php?id=tips:graphics-grid:hvjust
回顾哈德利的书,我注意到第 196 页的参考文献实际上并没有提及 hjust 或 vjust...只是证明。
阅读文档
R> ?textGrob
Run Code Online (Sandbox Code Playgroud)
我看到
just The justification of the text relative to its (x, y) location. If there are two values, the first value specifies horizontal justification and the second value specifies vertical justification. Possible string values are: "left", "right", "centre", "center", "bottom", and "top". For numeric values, 0 means left alignment and 1 means right alignment.
hjust A numeric vector specifying horizontal justification. If specified, overrides the just setting.
vjust A numeric vector specifying vertical justification. If specified, overrides the just setting.
Run Code Online (Sandbox Code Playgroud)
所以,这是我的想法。
那么,让我们看一下 grid.text 演示代码,特别是 draw.text 函数,它们仅使用字符串值,并且似乎成功地使用了字符串值:
grid.newpage()
x <- stats::runif(20)
y <- stats::runif(20)
rot <- stats::runif(20, 0, 360)
grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
gp=gpar(fontsize=20, col="grey"))
grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
gp=gpar(fontsize=20), check=TRUE)
grid.newpage()
draw.text <- function(just, i, j) {
grid.text("ABCD", x=x[j], y=y[i], just=just)
grid.text(deparse(substitute(just)), x=x[j], y=y[i] + unit(2, "lines"),
gp=gpar(col="grey", fontsize=8))
}
x <- unit(1:4/5, "npc")
y <- unit(1:4/5, "npc")
grid.grill(h=y, v=x, gp=gpar(col="grey"))
draw.text(c("bottom"), 1, 1)
draw.text(c("left", "bottom"), 2, 1)
draw.text(c("right", "bottom"), 3, 1)
draw.text(c("centre", "bottom"), 4, 1)
draw.text(c("centre"), 1, 2)
draw.text(c("left", "centre"), 2, 2)
draw.text(c("right", "centre"), 3, 2)
draw.text(c("centre", "centre"), 4, 2)
draw.text(c("top"), 1, 3)
draw.text(c("left", "top"), 2, 3)
draw.text(c("right", "top"), 3, 3)
draw.text(c("centre", "top"), 4, 3)
draw.text(c(), 1, 4)
draw.text(c("left"), 2, 4)
draw.text(c("right"), 3, 4)
draw.text(c("centre"), 4, 4)
Run Code Online (Sandbox Code Playgroud)
现在请注意,如果我将draw.text更改为使用hjust和vjust AS STRINGS,请注意差异
grid.newpage()
x <- stats::runif(20)
y <- stats::runif(20)
rot <- stats::runif(20, 0, 360)
grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
gp=gpar(fontsize=20, col="grey"))
grid.text("SOMETHING NICE AND BIG", x=x, y=y, rot=rot,
gp=gpar(fontsize=20), check=TRUE)
grid.newpage()
draw.text <- function(just, i, j) {
grid.text("ABCD", x=x[j], y=y[i], hjust=just[1], vjust=just[2])
grid.text(deparse(substitute(just)), x=x[j], y=y[i] + unit(2, "lines"),
gp=gpar(col="grey", fontsize=8))
}
x <- unit(1:4/5, "npc")
y <- unit(1:4/5, "npc")
grid.grill(h=y, v=x, gp=gpar(col="grey"))
draw.text(c("bottom"), 1, 1)
draw.text(c("left", "bottom"), 2, 1)
draw.text(c("right", "bottom"), 3, 1)
draw.text(c("centre", "bottom"), 4, 1)
draw.text(c("centre"), 1, 2)
draw.text(c("left", "centre"), 2, 2)
draw.text(c("right", "centre"), 3, 2)
draw.text(c("centre", "centre"), 4, 2)
draw.text(c("top"), 1, 3)
draw.text(c("left", "top"), 2, 3)
draw.text(c("right", "top"), 3, 3)
draw.text(c("centre", "top"), 4, 3)
draw.text(c(), 1, 4)
draw.text(c("left"), 2, 4)
draw.text(c("right"), 3, 4)
draw.text(c("centre"), 4, 4)
Run Code Online (Sandbox Code Playgroud)
长话短说:我认为当你使用 hjust 或 vjust 作为字符串时,你违反了文档(它的值应该是数字 0 <= x <= 1),并且如果你想使用字符串,你必须使用 just 参数....
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |