Графика 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)
Участок из выбранных двух рядов: