#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))
Вероятно, это было ошибкой из-за того, что он принял ИМЯ как дискретную переменную, поэтому его действительно нельзя использовать как переменную, а только как метку?