То, что происходит, является проблемой факторов.
Сначала вы получаете cyl
, столбец в наборе данных mtcars
.Это объект класса "numeric"
, принимающий 3 разных значения.
unique(mtcars$cyl)
#[1] 6 4 8
Затем вы создаете новый набор данных, фрейм данных ann_text
.Но вы определяете cyl
как объект класса "factor"
.И то, что в этом столбце можно увидеть с помощью str
.
str(ann_text)
#'data.frame': 1 obs. of 4 variables:
# $ mpg: num 15
# $ wt : num 5
# $ lab: Factor w/ 1 level "Text": 1
# $ cyl: Factor w/ 3 levels "4","6","8": 3
R кодирует факторы как целые числа, начиная с 1
, уровень "8"
- это номер уровня 3
.
Такпри объединении обоих наборов данных для cyl
имеются значения 4 , исходные числа 4
, 6
и 8
, а также новое число , 3
.Отсюда и дополнительный аспект.
Это также причина, по которой решение работает, в кадре данных ann_text_alternate
столбец cyl
- это числовая переменная, принимающая одно из уже существующих значений.
Другой способ заставить это работать - заставить cyl
учитывать фактор при огранке.Обратите внимание, что
levels(factor(mtcars$cyl))
#[1] "4" "6" "8"
И новый фрейм данных ann_text
больше не имеет 4-го уровня.Начните строить график, как в вопросе
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))
и добавьте текст.
p + geom_text(data = ann_text, label = "Text")