2016-08-18 1 views
0

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

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" 

Из ответа на мой yesterday's post, мне нужно преобразовать эту матрицу числового первым.

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) 

enter image description here

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

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

Спасибо.

+0

я вам. Я попытался использовать «plot» вместо «matplot», но он все еще не работал. Поскольку я хотел перечислить все категориальные переменные по оси y. –

+0

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

+0

Но если вы смотрите на второй сюжет, даже если вы рисуете второй только на большой странице, вы все равно обнаружите, что категорический ярлык «a» отсутствует. –

ответ

0

Я хотел бы отметить, 3 выпуска.

Использование plot здесь

Вчера в R graphics: How to plot a sequence of characters (pure categorical time series) вы пытались построить 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, дающий min и max, поэтому 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 

Часто удобнее использовать линии в качестве единицы, а х-ось этикетку, название сюжета и т.д. размещены линиями, поэтому использование oma и mar вместо omi и mai дает нам лучше понять, как устанавливать поля в соответствии с нашей потребностью. Все параметры принимают вектор длиной 4, задавая край «снизу», «слева», «сверху», «справа», т. Е. По часовой стрелке снизу.

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

Мы хотим установить внутренний край на «верх», «снизу» на 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) 

enter image description here

+0

Я больше не могу согласиться! –

Смежные вопросы