Отметьте максимальные / минимальные значения на диаграмме рассеяния в ggplot2 r - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть большой фрейм данных, где я хочу сделать диаграмму рассеяния, где помечены только значения max / min.

some_df <- data.frame(
   "Sport" = c(1:5), 
   "avg_height" = c(178, 142, 200, 135, 182), 
   "avg_weight" = c(66, 61, 44, 77, 100))

Я пытался:

library(dplyr)
library(ggplot2)
some_df %>% 
  ggplot(aes(avg_weight, avg_height, label = Sport)) + 
  geom_point(shape = 21) + 
  geom_text(data = subset(avg_height == max(avg_height)))     

Но получаю ошибки, сообщающие, что avg_height не найден.

Я также пытался с geom_text

geom_text(aes(label = ifelse(avg_height=max(avg_height), as.character(Sport), '')), 
          hjust=0, vjust=0)  

с ошибкой для Sport не найдено.

Так что я могу либо пометить все, либо ничего, но с большими данными в фрейме читать будет невозможно.Если бы я мог раскрасить только максимальные / минимальные значения, это тоже было бы хорошо.Я экспериментировал с созданием нового столбца и попыткой объединения с новыми переменными, как показано ниже, но это не помогло мне.

maxw <- some_df %>% summarise_each(Max = max(avg_weight))
maxh <- some_df %>% mutate(summarise(Max = max(avg_height)))

Диаграмма рассеяния, которую я хочу, с метками только для максимума и минимума как avg_heigt, так и avg_weight.

1 Ответ

0 голосов
/ 23 декабря 2018

Если я правильно понимаю, точки данных экстремальных значений как avg_weight, так и avg_weight должны быть помечены значением Sport:

library(dplyr)
library(ggplot2)
some_df %>% 
  ggplot(aes(avg_weight, avg_height, label = Sport)) + 
  geom_point(shape = 21) + 
  geom_label(data = some_df %>% 
               filter(avg_height %in% range(avg_height) | avg_weight %in% range(avg_weight)),
             nudge_x = 1)

создает

enter image description here

Редактировать

Оператор попросил обозначить точки с самым высоким и самым низким ИМТ avg_weight / (avg_height/100)^2.:

library(dplyr)
library(ggplot2)
# append BMI column to dataset
some_df <- some_df %>% 
  mutate(bmi = avg_weight / (avg_height/100)^2) 
some_df %>% 
  ggplot(aes(avg_weight, avg_height, label = Sport)) + 
  geom_point(shape = 21) + 
  geom_label(data = some_df %>% 
               filter(
                 avg_height %in% range(avg_height) | 
                   avg_weight %in% range(avg_weight) |
                   bmi %in% range(bmi)
               ),
             nudge_x = 1)

Полученный график такой же, как и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...