ggplot выдает ошибку «метка не найдена», в то время как `метка` явно присутствует

#r #ggplot2

#r #ggplot2

Вопрос:

Я могу отобразить метки следующего df , используя geom_text :

 df <- data.frame(
  x = c(610, 426, 569, 253), 
  y = c(-226, -276, -364, -185), 
  label = c("accomplishments per week", "hours worked per week", "perceived adequacy of accomplishments", "energy level"),
  stringsAsFactors = FALSE
)

ggplot(df, aes(x, y))   geom_text(aes(label = label))
  

введите описание изображения здесь

Однако при попытке использовать тот же механизм построения графика с моими реальными данными я получаю сообщение об ошибке:

Error in FUN(X[[i]], ...) : object 'label' not found

Почему это так и как я могу это решить?


Вот мои реальные данные df1 :

 df1 <- structure(list(type = c("var", "var", "var", "var"),
                  id = c(1,2, 4, 7), 
                  x = c(610, 426, 569, 253), y = c(-226, -276, -364, -185), 
                  label = c("accomplishments per week", "hours worked per week",  "perceived adequacy of accomplishments", "energy level"), 
                  from = c(NA_real_,NA_real_, NA_real_, NA_real_), 
                  to = c(NA_integer_, NA_integer_,NA_integer_, NA_integer_), 
                  polarity = c(NA_character_, NA_character_, NA_character_, NA_character_), 
                  group = c(1L, 1L, 1L, 1L)), .Names = c("type","id", "x", "y", "label", "from", "to", "polarity", "group"),
             row.names = 7:10, class = c("cld", "data.frame")
             )

df

   type id   x    y                                 label from to polarity group
7   var  1 610 -226              accomplishments per week   NA NA     <NA>     1
8   var  2 426 -276                 hours worked per week   NA NA     <NA>     1
9   var  4 569 -364 perceived adequacy of accomplishments   NA NA     <NA>     1
10  var  7 253 -185                          energy level   NA NA     <NA>     1
  

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

1. Это отличный вопрос, на который было бы очень сложно ответить без предоставления воспроизводимого примера.

Ответ №1:

Ваш df1 класс cld и data.frame (см. Вторую строку в приведенном выше выводе str ). Казалось бы, ggplot не нравится, что объект является cld первым. Чтобы обойти это, используя as.data.frame forces df1 , чтобы стать data.frame только классом. Вы можете использовать class(df1) , чтобы проверить это, или посмотреть str(df1) Вывод ниже. Обратите внимание на строку «Классы».

 > str(df1)
Classes ‘cld’ and 'data.frame': 4 obs. of  9 variables:
 $ type    : chr  "var" "var" "var" "var"
 $ id      : num  1 2 4 7
 $ x       : num  610 426 569 253
 $ y       : num  -226 -276 -364 -185
 $ label   : chr  "accomplishments per week" "hours worked per week" "perceived adequacy of accomplishments" "energy level"
 $ from    : num  NA NA NA NA
 $ to      : int  NA NA NA NA
 $ polarity: chr  NA NA NA NA
 $ group   : int  1 1 1 1
  

Если вы принудите его data.frame , он будет работать нормально.

 ggplot(as.data.frame(df1), aes(x = x, y = y, label = label))  
  geom_text()
  

введите описание изображения здесь

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

1. Пожалуйста, если возможно, добавьте немного больше деталей к этому ответу. Потому что я все еще не понимаю концепцию cld во фрейме данных. @user322912

2. Вы использовали multcomp ( cran.r-project.org/web/packages/multcomp/multcomp.pdf )? Возможно, используемый вами data.frame унаследовал класс от cld объекта из этого пакета.

3. @mnm Я добавил еще несколько деталей. Пожалуйста, дайте мне знать, если теперь все ясно (или нет).

4. @user322912 спасибо за обновление. Теперь это имеет смысл для меня.