Графика R: Как построить последовательность символов (чисто категориальные временные ряды)

У меня есть матрица, в которой каждый элемент является чисто категориальной переменной "a","b","c","d",... Каждый столбец матрицы является хронологической записью, и теперь я хочу построить матрицу по строка и я надеюсь, что ось Y - это последовательность символов.

Вот оригинальная матрица:

Граф с легендой

Вот что я хотел, чтобы сюжет был: Граф с легендой

Красный график - это первый ряд матрицы, а синий график - пятый.

Я пробовал некоторые существующие пакеты, но в основном они требуют, чтобы я перенес категориальные переменные в числовые переменные. Поэтому мне интересно, может ли кто-нибудь помочь мне с этим. Большое спасибо!

1 ответ

Решение

Без ваших данных я должен сгенерировать игрушку, которая называется mat, с 5 рядами и 10 столбцами, заполненными letters[1:7],

set.seed(0); mat <- matrix(sample(letters[1:7], 5 * 10, TRUE), nrow = 5)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] "g"  "b"  "a"  "f"  "f"  "b"  "c"  "f"  "c"  "d"  
#[2,] "b"  "g"  "b"  "d"  "g"  "c"  "d"  "e"  "f"  "f"  
#[3,] "c"  "g"  "b"  "f"  "b"  "a"  "e"  "f"  "e"  "a"  
#[4,] "e"  "e"  "e"  "g"  "e"  "c"  "d"  "a"  "f"  "d"  
#[5,] "g"  "e"  "c"  "c"  "a"  "g"  "b"  "f"  "d"  "f"  

По сути, вам нужно сначала заново представить вашу матрицу персонажей. mat с целыми числами.

## flatten your object into a vector first
if (is.matrix(mat)) v <- as.character(mat)
if (is.data.frame(mat)) v <- as.character(unlist(mat, use.names = FALSE))
lev <- sort(unique(v))    ## sorted unique labels

## re-representation
mat_int <- matrix(match(v, lev), nrow = nrow(mat))
## or: mat_int <- matrix(as.integer(factor(v, levels = lev)), nrow = nrow(mat))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    7    2    1    6    6    2    3    6    3     4
#[2,]    2    7    2    4    7    3    4    5    6     6
#[3,]    3    7    2    6    2    1    5    6    5     1
#[4,]    5    5    5    7    5    3    4    1    6     4
#[5,]    7    5    3    3    1    7    2    6    4     6

Затем вы просто строите (целую или несколько строк) эту матрицу, используя matplot, Сначала отключите ось Y, а затем добавьте ее, используя axis так что вы можете настроить метки оси.

## this plots the whole matrix
matplot(t(mat_int), yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

## this plots 1st and 5th rows
matplot(t(mat_int)[, c(1,5)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

Участок из выбранных двух рядов:

Другие вопросы по тегам