Почему geom_text () генерирует ошибки приведения, когда hjust и vjust являются строками? - PullRequest
3 голосов
/ 22 февраля 2011

Я заметил неожиданное поведение в 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 документация не соответствует

Книга Хэдли (стр. 196) гласит, что hjust и vjust могут принимать строковые аргументы:

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

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

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

Эстетика

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

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

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Итак, я мало что знаю о том, КАКОЙ КОД определяет или потребляет hjust / vjust, но, используя TextMate «Найти в проекте» (в каталоге ggplot2 / R /) для hjust, я не вижу строк, которые выглядят как будто они являются определением или реализацией hjust ... просто места, где он указан как действительный и где он передается.

Это заставляет меня хотеть читать сетку ...

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>

Ничего особо полезного там нет, так что я в Google

R сетка должна быть

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

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

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

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

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 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)

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

1 голос
/ 22 февраля 2011

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

  • hjust ’: горизонтальное выравнивание, от 0 до 1
  • 'vjust': вертикальное выравнивание, от 0 до 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...