Почему geom_text () выдает ошибки приведения, когда hjust и vjust являются строками?

Я заметил неожиданное поведение ggplot2 в geom_text() geom. Если атрибуты hjust и vjust указаны как строки, R возвращает ошибки приведения, хотя графики кажутся нормальными. Проблема возникла в разрабатываемом мной пакете на основе ggplot2. Для простоты я создал урезанные примеры, которые все еще вызывают ошибку.

Сначала попробовал с qplot()

##qplot version
library(ggplot2)
p <- qplot(cty, hwy, 
           label = drv, 
           hjust = "right", 
           geom  = "text", 
           data  = mpg
)

print(p)

И я получил такую ​​ошибку:

Warning message:
In validDetails.text(x) : NAs introduced by coercion

Потом попробовал с 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)

и получил идентичный сюжет и идентичную ошибку:

Warning message:
In validDetails.text(x) : NAs introduced by coercion

Затем я попытался установить как 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)

Если оба параметра заданы с использованием строк, R возвращает две ошибки приведения:

Warning messages:
1: In validDetails.text(x) : NAs introduced by coercion
2: In validDetails.text(x) : NAs introduced by coercion

Но, когда параметры являются числами, 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)

Я не совсем уверен, почему это происходит и имеет ли это значение, но я этого не ожидал.

Документы ggplot2 не согласны

/ a> (стр. 196) говорит, что hjust и vjust могут принимать строковые аргументы:

Обоснование строки (или легенды) определяет положение внутри строки, которое помещается в данную позицию. Есть два значения для горизонтального и вертикального выравнивания. Значения могут быть:

  • Строка: «слева», «справа», «по центру», «по центру», «снизу» и «сверху».
  • Число от 0 до 1, указывающее позицию в строке (от нижнего левого угла).

Но файл man для geom_text() в версии 0.8.9 говорит, что hjust и vjust являются числовыми, хотя не говорит, что они могут быть только числовыми:

Эстетика

Следующая эстетика может использоваться с geom_text. Эстетика сопоставляется с переменными в данных с помощью функции aes: geom_text (aes (x = var))

  • x: x позиция (обязательно)
  • y: y позиция (обязательно)
  • label: текстовая метка (обязательно)
  • цвет: цвет границы
  • размер: размер
  • угол: угол
  • hjust: горизонтальное выравнивание, от 0 до 1
  • vjust: выравнивание по вертикали, от 0 до 1
  • альфа: прозрачность

person briandk    schedule 22.02.2011    source источник
comment
Чтобы быть очень конкретным, ggplot2 в книге на странице 196 НЕ говорит, что hust и vjust могут иметь эти значения ... он только говорит (примерно), что оправдание может быть одним из ... См. Мой полный ответ ниже.   -  person William Doane    schedule 22.02.2011


Ответы (2)


Итак, я мало знаю о том, ЧТО КОД определяет или потребляет 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>

Итак, это textGrob, и просто, hjust и vjust просто передаются в него ... off to 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>

итак, это гроб ... пошли гробить ......

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>

Ничего особо полезного, поэтому я гулю

R сетка hjust vjust

и после отмены автокоррекции Google моего поиска я нахожу

http://rwiki.sciviews.org/doku.php?id=tips:graphics-grid:hvjust

Оглядываясь назад на книгу Хэдли, я замечаю, что ссылка на стр.196 на самом деле не УМЕНИЕ hjust или vjust ... просто оправдание.

Чтение документации для

R> ?textGrob

я вижу это

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.

Итак, вот мои мысли.

  • параметр just может быть строковым или числовым
  • hjust и vjust являются только числовыми и могут заменять только
  • если вы попытаетесь использовать для них строки, это может "сработать", но выдаст предупреждения

Итак, давайте посмотрим на демонстрационный код 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)

Теперь обратите внимание на разницу, если я изменю draw.text на hjust и vjust КАК СТРОКИ.

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)

Короче говоря: я думаю, что когда вы используете hjust или vjust в качестве строки, вы нарушаете документацию (его значение должно быть числовым 0 ‹= x‹ = 1), и что если вы хотите использовать строки, вы должны используйте параметр just ....

person William Doane    schedule 22.02.2011
comment
Просматривая документацию для textGrob, я думаю, что мой реальный вопрос: почему theme_text() ggplot2 не может просто принять и передать параметр just, чтобы пользователи могли указать векторы согласования, такие как just=c("bottom", "centre")? - person briandk; 11.08.2011
comment
Это могло ... это просто не. Возможно, это предполагает пул-реквест для ggplot2? - person William Doane; 19.08.2011

hjust и vjust должны быть числами, см. Руководство (?geom_text):

  • hjust ’: выравнивание по горизонтали, от 0 до 1
  • ‘Vjust’: выравнивание по вертикали, от 0 до 1
person daroczig    schedule 22.02.2011
comment
Я согласен, что в руководстве написано, что hjust и vjust должны быть числами. Я отредактировал вопрос, чтобы отразить тот факт, что в книге Хэдли довольно четко указано, что они также могут быть строками. Мне не ясно, какая документация заменяет какую. - person briandk; 22.02.2011
comment
Код заменяет всю документацию; документация ложь. :) - person William Doane; 19.08.2011