Как аннотировать текст на отдельном фасете в ggplot2 - PullRequest
1 голос
/ 25 апреля 2019

Этот вопрос является продолжением: Аннотирующего текста на отдельном фасете в ggplot2

Я пробовал код, предоставленный в принятом ответе, и получил что-то, что странным образом отличалось отрезультат обеспечен.Конечно, пост старше, и я использую R 3.5.3 и ggplot2 3.1.0, но то, что я получаю, похоже, не имеет смысла.

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)

#below is how the original post created a dataframe for the text annotation
#this will produce an extra facet in the plot for reasons I don't know
ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",cyl = factor(8,levels = c("4","6","8")))

p+geom_text(data = ann_text,label = "Text")

Это код из принятого ответа в связанном вопросе.Для меня это создает следующий график с дополнительным аспектом (то есть, кажется, что добавленная категориальная переменная 3 была добавлена ​​к cyl)

https://github.com/RamenZzz/hello-world/blob/master/Rplot09b.jpeg?raw=true

#below is an alternative version that produces the correct plot, that is,
#without any extra facets.
ann_text_alternate <- data.frame(mpg = 15,wt = 5,lab = "Text",cyl = 8)

p+geom_text(data = ann_text_alternate,label = "Text")

Это дает мне правильный график:

https://raw.githubusercontent.com/RamenZzz/hello-world/master/Rplot09a.jpeg

У кого-нибудь есть какие-либо объяснения?

1 Ответ

1 голос
/ 25 апреля 2019

То, что происходит, является проблемой факторов.
Сначала вы получаете 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")
...