Как создать более качественный график для моих категориальных данных временных рядов в матрице?

Я хотел бы построить каждый ряд этой матрицы на отдельном графике в графическом окне.

mat <- 
structure(c("g", "b", "c", "e", "g", "b", "g", "g", "e", "e", 
"a", "b", "b", "e", "c", "f", "d", "f", "g", "c", "f", "g", "b", 
"e", "a", "b", "c", "a", "c", "g", "c", "d", "e", "d", "b", "f", 
"e", "f", "a", "f", "c", "f", "e", "f", "d", "d", "f", "a", "d", 
"f"), .Dim = c(5L, 10L))

#     [,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"  

Из ответа на мой вчерашний пост мне нужно сначала преобразовать эту матрицу в числовую.

v <- as.character(mat)
lev <- sort(unique(v))   ## sorted unique labels

# [1] "a" "b" "c" "d" "e" "f" "g"

mat_int <- matrix(match(v, 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

Теперь я использую следующий код для генерации моего графика.

par(mfrow=c(5,1))

matplot(t(mat_int)[, c(1)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

matplot(t(mat_int)[, c(2)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

matplot(t(mat_int)[, c(3)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

matplot(t(mat_int)[, c(4)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

matplot(t(mat_int)[, c(5)], yaxt = "n", type = "l", xlab = "time", ylab = "category")
axis(2, seq_along(lev), labels = lev)

Но у меня есть несколько вопросов:

  1. Метка на оси Y для каждого графика из пяти содержит только частичные результаты (скажем, на втором графике отсутствует "a"). Есть ли способ, которым мы можем перечислить все категориальные переменные на оси Y для всех пяти графиков? (То есть каждый график имеет метки: a,b,c,d,e,f,g.
  2. Прямо сейчас мне нужно создать этот график на большой странице, чтобы четко отобразить все метки оси Y. Можно ли как-то расположить мои графики ближе друг к другу, чтобы сэкономить место, чтобы они могли уместиться на маленькой странице?

Спасибо.

1 ответ

Решение

Я хотел бы указать на 3 вопроса.

использование plot Вот

Вчера в графике R: Как построить последовательность символов (чисто категориальные временные ряды), вы пытались отобразить 2 или более строки матрицы на одном графике, поэтому я предлагаю matplot, Но теперь вы хотите только построить разные строки отдельно, следовательно, нормальный plot будет достаточно.

По мере обновления вы можете использовать

 plot(mat_int[2,], yaxt="n", type = "l", ylim = seq_along(lev), xlab = "time", ylab = "category")

Установить общий ylim

Как только вы решили создать отдельные графики, вы хотите установить общий ylim так что ось у будет сопоставима между различными графиками. Положил

ylim = c(1, length(lev))

внутри каждого plot, Обратите внимание, что ylim принимает вектор длины 2, дающий мин и макс, так ylim = 1:length(lev) неправильно.

Настройте маржу и / или график на большой странице

Участок R имеет два поля. Один - это внешнее поле для графического окна, другое - внутреннее поле. Поля измеряются в двух единицах: линии и дюймы. Соответствующие графические параметры:

oma: *o*uter *ma*rgin in lines
omi: *o*uter *m*argin in *i*nches
mar: inner *mar*gin in lines
mai: inner *ma*rgin in *i*nches

Часто бывает удобнее использовать линии в качестве единицы измерения, так как метки оси X, заголовки графиков и т. Д. Располагаются линиями, поэтому oma а также mar вместо omi а также mai дает нам лучшее представление о том, как устанавливать поля в соответствии с нашими потребностями. Все параметры берут вектор длиной 4, что дает поле "снизу", "слева", "сверху", "справа", т. Е. По часовой стрелке снизу.

Обычно вам не нужно ничего делать с внешними полями, и они по умолчанию все нули. Вы можете проверить это par(c("oma","omi")), Обратите внимание, что будет открыто новое графическое окно, но вы просто игнорируете его или закрываете, если хотите. Невозможно запросить графические параметры без пробуждения такого окна, увидеть значения по умолчанию без открытия графического устройства?,

Мы хотим установить внутреннее поле "top", "bottom" в 0, чтобы все графики были вертикально соединены вместе. Делая это, мы должны установить внешнее поле на "верх" и "низ", чтобы оставить дополнительное пространство для осей и заголовков (при необходимости).

new_par <- old_par <- par(c("mar", "oma"))
new_par$mar[1] <- 0; new_par$mar[3] <- 0    ## inner bottom and top margin to 0
new_par$oma[1] <- 3; new_par$oma[3] <- 3    ## outer bottom and top margin to 3
par(new_par)    ## set new par

par(mfrow = c(5,1))

plot(mat_int[1, ], yaxt = "n", type = "l", xlab = "time", ylab = "category",
     xaxt = "n", ylim = c(1, length(lev)))
axis(3, axTicks(3))    ## place an x-axis on the top
axis(2, seq_along(lev), labels = lev)
axis(1, axTicks(1), labels = NA)    ##  draw ticks, but no labels

plot(mat_int[2, ], yaxt = "n", type = "l", xlab = "time", ylab = "category",
     xaxt = "n", ylim = c(1, length(lev)))
axis(2, seq_along(lev), labels = lev)
axis(1, axTicks(1), labels = NA)

plot(mat_int[3, ], yaxt = "n", type = "l", xlab = "time", ylab = "category",
     xaxt = "n", ylim = c(1, length(lev)))
axis(2, seq_along(lev), labels = lev)
axis(1, axTicks(1), labels = NA)

plot(mat_int[4, ], yaxt = "n", type = "l", xlab = "time", ylab = "category",
     xaxt = "n", ylim = c(1, length(lev)))
axis(2, seq_along(lev), labels = lev)
axis(1, axTicks(1), labels = NA)

plot(mat_int[5, ], yaxt = "n", type = "l", xlab = "time", ylab = "category",
     ylim = c(1, length(lev)))
axis(2, seq_along(lev), labels = lev)

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

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