Упорядочить переменные geom_point на основе аналогичного шаблона по оси x в R

#r #ggplot2 #dplyr #geom-point

#r #ggplot2 #dplyr #геометрическая точка

Вопрос:

Как я мог бы упорядочить переменные так, чтобы они отображались, например, в виде тепловой карты / где они показывают аналогичный шаблон, т. Е.: вверху A и D, затем B, C и внизу E. Хотелось бы избежать выполнения этого вручную, поскольку реальные данные содержат гораздо больше переменных.

 Variable1 <- c(rep("A",7), rep("B",7),rep("C",7), rep("D",7), rep("E",7))
Variable2 <- c(rep(1:7, 5))
value <- c(15, 16, 11, 12, 13, 11, 12, 4, 3, 6, 5, 4, 3, 2, 3, 3, 2, 3, 3, 4, 3, 18, 17, 15, 2, 3, 4, 5, 2, 3, 4, 5, 6, 10, 18)
dff <- data.frame(Variable1, Variable2, value)

library(dplyr)
dff <- dff %>%group_by(Variable1)%>%
  mutate(scaled_val = scale(value)) %>%
  ungroup()

dff$Variable <- factor(dff$Variable1,levels=rev(unique(dff$Variable1)))

ggplot(dff, aes(x = Variable2, y = Variable1, label=NA))  
  geom_point(aes(size = scaled_val, colour = value))  
  geom_point(aes(size = scaled_val, colour = value), shape=21, colour="black")  
  geom_text(hjust = 1, size = 2)  
  theme_bw() 
  scale_color_gradient(low = "lightblue", high = "darkblue") 
  scale_x_discrete(expand=c(1,0)) 
  coord_fixed(ratio=4)
 

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

И желаемый:

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

Если вы посмотрите на тепловую карту с кластеризованными строками по сходству, например: https://3.bp.blogspot.com/-AI2dxe95VHk/TgTJtEkoBgI/AAAAAAAAC5w/XCyBw3qViGA/s400/heatmap_cluster2.png вы видите вверху, что у вас есть строка, шаблоном которой являются первые временные точки по оси x, а затем те, что выше в последних временных точках по оси x..

Что делать: итак, мне интересно, можем ли мы, используя масштабированное значение, сделать так, чтобы верхними были те, у которых более высокое среднее значение в Variable2 (1: 2), затем более высокое среднее значение Variable2 (3: 5), затем Variable2 (6: 7). Дайте мне знать, если я здесь не совсем понятен и могу лучше объяснить.

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

1. Не могли бы вы быть немного более конкретным? Какой шаблон вы выбрали?

Ответ №1:

Похоже, вы хотите упорядочить группы A-E на основе их среднего значения. Вы можете сделать это, преобразовав Variable1 в коэффициент с пользовательскими уровнями:

 lvls <- names(sort(by(dff$value, dff$Variable1, mean)))
dff$Variable1 <- factor(dff$Variable1, levels = lvls)
 

Вот решение, которое сортирует группы по which.max :

 peaks <- c(by(dff$value, dff$Variable1, which.max))
lvls <- names(sort(peaks))
dff$Variable1 <- factor(dff$Variable1, levels = lvls)
 

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

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

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

2. Смотрите мое редактирование. Не совсем тот подход, к которому вы стремитесь, но тот же результат. Вам нужно математическое выражение, которое определяет желаемый порядок.

3. Да, это действительно работает! Большое спасибо. Насколько я понимаю, как именно здесь работает функция which.max? На виньетке написано «определение местоположения первого максимума числового значения». означает ли это, что они организованы ECBAD в зависимости от того, где они имеют максимальное значение (наибольший круг)?

4. Точно, это позиция, которая имеет наибольшее value значение