Ошибка: Дискретное значение, заданное в непрерывном масштабе для числовой переменной

#r #ggplot2 #tibble

#r #ggplot2 #тиббл

Вопрос:

Я получаю повторяющееся сообщение об ошибке» Discrete value supplied to continuous scale «, хотя я использую числовую переменную.

Вот мой код

 name = c("Alberto Manguel", "Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel",)  year = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999)  portion = c(0.0044117647, 0.0191846523, 0.0151898734, 0.0042075736, 0.0044493882, 0.0021881838, 0.0146396396, 0.0162689805, 0.0136054422, 0.0158730159)  df lt;- tibble(name, year, portion)  ggplot(df)   geom_line(aes(x = year, y = portion, group = name), colour="black")   geom_text(aes(year == 1999, label = name), hjust = -.1)  

Моя year переменная уже является числовым значением, поэтому мне не нужно ее преобразовывать? Чего мне не хватает?

Ответ №1:

Проблема заключается в строке geom_text. Предположительно, вы хотите показать каждое имя в соответствующей точке, поэтому поместите значения x и y aes в ggplot, чтобы поделиться ими как с geom_line, так и с geom_text, а затем мы можем просто указать эстетику, специфичную для каждого.

 library(ggplot2)  ggplot(df, aes(x = year, y = portion))    geom_line(aes(group = name), colour = "black")    geom_text(aes(label = name), hjust = -0.1)  

или если намерение состояло в том, чтобы обозначить только последний пункт, то:

 library(dplyr) library(ggplot2)  ggplot(df, aes(x = year, y = portion))    geom_line(aes(group = name), colour = "black")    geom_text(aes(label = name), data = slice_tail, hjust = -0.1)  

В зависимости от того, что вы хотите, slice_tail можно заменить одним из них-тильда является частью аргумента data= и указывает, что она определяет функцию, которую ggplot2 будет применять к df, представленному точкой в определении.

 ~ slice_max(., year) # all rows having the largest year  ~ filter(., year == 1999) # all rows having year 1999  ~ group_by(., name) %gt;% slice_max(year) %gt;% ungroup # row of max year in each name  

Примечание

Входные данные, показанные в вопросе, содержат ошибки, поэтому мы использовали это:

 name = c("Alberto Manguel", "Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel") year = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999) portion = c(0.0044117647, 0.0191846523, 0.0151898734, 0.0042075736, 0.0044493882, 0.0021881838, 0.0146396396, 0.0162689805, 0.0136054422, 0.0158730159) df lt;- data.frame(name, year, portion)  

Комментарии:

1. Спасибо за ваш ответ! В моем реальном наборе данных у меня есть несколько разных имен, и я хотел поместить текст в конце строки в соответствии с каждым именем, поэтому решение фильтра сработало! Еще раз спасибо.

2. Это один из уже перечисленных вариантов, тот, что в самом конце с group_by, или, если у каждого имени в прошлом году было одно и то же, вы можете использовать один из других, более коротких.

Ответ №2:

Может быть, в этом случае и X, и Y должны быть числовыми? Также является Y числовым. Если вы говорите, что решили эту проблему, она должна полагаться на функцию ggplot() или какой-либо слой.

Запустив ваш код, я вижу, что эта проблема должна быть в слое geom_text (). Без этого мы получим прекрасный сюжет. Если вы хотите получить имена в конкретных пунктах, это сработало для меня (хотя я не уверен, что вы это имеете в виду!:

 name lt;- c("Alberto Manguel", "Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel","Alberto Manguel") year = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999)  portion = c(0.0044117647, 0.0191846523, 0.0151898734, 0.0042075736, 0.0044493882, 0.0021881838, 0.0146396396, 0.0162689805, 0.0136054422, 0.0158730159)  df lt;- data.frame(name, year, portion)   plot lt;- ggplot()   geom_line(aes(x = year, y = portion, group = name), colour="black")     geom_text(aes(x=year, y=portion, label=name))  

Вероятно, это было ошибкой из-за того, что он принял ИМЯ как дискретную переменную, поэтому его действительно нельзя использовать как переменную, а только как метку?