Визуализация кластеризации временных рядов на ggplot2- разные цвета кластера

#r #ggplot2

#r #ggplot2

Вопрос:

Я применил иерархическую кластеризацию к следующему набору данных, используя динамическое искажение времени. Когда я строю график с использованием ggplot2, я бы хотел, чтобы разные кластеры имели разные цвета вместо разных цветов для каждого временного ряда (в настоящее время показано на рисунке 1: Кластеры транспортных средств). Рисунок 2 — результат, который я получаю при попытке достичь этого. Кажется, что кластеры правильно окрашены, но заполняет промежутки между которыми я не хочу. Я подозреваю, что это связано с функциями group_by и когда я пытаюсь использовать функцию mutate.

Рисунок 1
Рисунок 2

Для полноты я включил необработанный набор данных и программу. Спасибо

 library(ggplot2)
library(fpc)
library(readr)
library(plotly)
library(dplyr)
library(tidyr)
library(dtw)
library(gghighlight)

#Importing data
df <- read_csv("01_tracks.csv")

#Preparing data 
df1 <- filter(df,laneId == 2, width <= 6) #Filtering to only lane 3 and no trucks
#df1$id <- as.numeric(df1$id)
df1$xVelocity <- abs(df1$xVelocity)

#Creates a Data Frame of just the x-Velocity
df2 <- df1 %>% 
  group_by(id) %>%
  mutate(time = 1:n()) %>%
  dplyr::select(time, xVelocity) %>%
  pivot_wider(id_cols = time, values_from = xVelocity,
              names_from = id) %>%
  select(-time) %>%
  t()

 tdf <- df2[1:10,] #Only using first 10 vehicles to make computing time quick for convience in tests

xy.list <- setNames(split(tdf, seq(nrow(tdf))), rownames(tdf)) #Turn the data frame into a list
new.list <- lapply(xy.list, function(x) x[!is.na(x)]) #Take out all the NA values in the list

#Hierarchial Clustering
distance.matrix <- dist(new.list, method= "DTW") #Create a distance Matrix
hc <- hclust(distance.matrix, method= "average") #Performing hierarchical clustering

#Processing cluster groups
Number_of_clusters <- 3
clustered_data <- cutree(hc, k = Number_of_clusters)
clustered_data_tidy <- as.data.frame(as.table(clustered_data)) %>% glimpse()
colnames(clustered_data_tidy) <- c("id","cluster")
clustered_data_tidy$id <- as.character(clustered_data_tidy$id)
clustered_data_tidy$id <- as.numeric(clustered_data_tidy$id)

#Making a data frame with the cluster group
joined_clusters <- df1 %>% inner_join(clustered_data_tidy, by = "id") %>% glimpse()

  pl2 <- joined_clusters %>% #replace pl3 with joined_clusters
  group_by(id) %>%
  mutate(time = 1:n()) %>% #Creating time variable for the x-axis
  ggplot(aes(x = time, y = xVelocity))   
  geom_line(aes(color = cluster), show.legend = FALSE)  
  ggtitle(paste("Vehicle clusters"))
  print(gpl2 <- ggplotly(pl2))
  

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

1. Вместо публикации всех ваших данных-код предварительной обработки ссылка на полный набор данных, можете ли вы включить вывод из dput(joined_clusters) в свой вопрос? Если вы спрашиваете о ggplot2, предыдущие части на самом деле не актуальны.

Ответ №1:

Проблема, по-видимому, в том, что вы говорите ggplot, что вам нужны только три строки с тремя разными цветами, но вы хотите десять строк с тремя разными цветами.

В вашем вызове ggplot вы передаете только три переменные, которые будут сопоставлены с эстетикой: координату x, координату y и цвет. Вы не сказали ggplot, что координаты x и y внутри каждого цвета должны быть разделены на разные линии, поэтому он просто объединяет их все в каждой цветовой группе.

Чтобы исправить это, вам нужно добавить идентификатор транспортного средства в качестве group эстетики, чтобы указать, что вы по-прежнему хотите, чтобы координаты x и y из каждой линии отображались отдельно:

   joined_clusters %>%
    group_by(id) %>%
    mutate(time = 1:n()) %>%
    ggplot(aes(x = time, y = xVelocity))   
    geom_line(aes(color = factor(cluster), group = id), 
              size = 1, show.legend = FALSE)  
    ggtitle(paste("Vehicle clusters"))
  

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