2016-08-18 1 views
0

Ich möchte jede Zeile dieser Matrix auf separaten Plot in einem grafischen Fenster darstellen.Wie erstelle ich eine schönere Grafik für meine kategorischen Zeitreihendaten in einer Matrix?

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" 

Von der Antwort auf meine yesterday's post, ich brauche diese Matrix numerische ersten zu konvertieren.

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 

Jetzt verwende ich den folgenden Code, um mein Diagramm zu generieren.

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

Aber ich habe einige Probleme:

  1. Das Etikett auf der y-Achse für jede Handlung der fünf nur Teilergebnisse enthält (sagen, dass die zweite Handlung fehlt „ein "). Gibt es eine Möglichkeit, alle kategorialen Variablen auf der y-Achse für alle fünf Diagramme aufzulisten? (Das heißt, jedes Plot hat Labels: a, b, c, d, e, f, g.
  2. Im Moment muss ich dieses Plot auf einer großen Seite erstellen, um alle Y-Achsen-Labels anzuzeigen klar. gibt es eine Möglichkeit, meine Plots mehr nahe beieinander zu arrangieren Platz zu sparen, so dass sie in einer kleineren Seite passen könnte?

Danke.

+0

Ich habe Sie. Ich habe versucht, "Plot" anstelle von "Matplot" zu verwenden, aber es hat immer noch nicht funktioniert. Da ich alle kategorischen Variablen auf der y-Achse auflisten wollte. –

+0

plot (mat_int [1,], yaxt = "n", type = "l", xlab = "zeit", ylab = "kategorie") achse (2, seq_along (lev), etiketten = lev) –

+0

Aber wenn Sie sehen sich den zweiten Plot an, selbst wenn Sie den zweiten Plot nur auf einer großen Seite zeichnen, werden Sie immer noch die kategorische Bezeichnung "a" finden. –

Antwort

0

ich möchte drei Fragen hinweisen.

Verwenden plot hier

Gestern in R graphics: How to plot a sequence of characters (pure categorical time series) haben Sie versucht, 2 oder mehr Zeilen einer Matrix in einem einzelnen Diagramm zu plotten, also schlage ich matplot vor. Aber jetzt wollen Sie nur verschiedene Zeilen getrennt darstellen, daher wird die normale plot ausreichen.

Wie Sie aktualisiert, können Sie

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

Stellen ein gemeinsames ylim

Sobald Sie verschiedene Graphen erzeugen entscheiden, können Sie eine gemeinsame ylim so einstellen möchten, dass die Y-Achse zwischen den verschiedenen Parzellen vergleichbar sein. Setzen Sie

ylim = c(1, length(lev)) 

in jedem plot. Beachten Sie, dass ylim einen Vektor der Länge 2 mit Min- und Max-Werten verwendet, sodass ylim = 1:length(lev) falsch ist.

Passen Sie Ihre Ploträndern und/oder Grundstück auf einer größeren Seite

R Grundstück zwei Ränder hat. Einer ist der äußere Rand für ein grafisches Fenster, ein anderer ist der innere Rand. Die Ränder werden in zwei Einheiten gemessen: Linien und Zoll.Die damit verbundenen grafischen Parameter sind:

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 

Oft ist es bequemer, Linien als Einheit zu verwenden, als X-Achsenbeschriftungen, Plot-Titel, usw. werden durch Linien platziert, so mit oma und mar statt omi und mai ergibt uns eine bessere Idee, wie man Margen entsprechend unserem Bedarf einstellt. Alle Parameter nehmen einen Vektor der Länge 4 an und ergeben einen Rand auf "unten", "links", "oben", "rechts", d.h. im Uhrzeigersinn von unten.

Normalerweise müssen Sie nichts mit äußeren Rändern tun, und sie sind standardmäßig nur Nullen. Sie können dies durch par(c("oma","omi")) überprüfen. Beachten Sie, dass ein neues grafisches Fenster geöffnet wird, aber Sie ignorieren es einfach oder schließen es, wenn Sie möchten. Es ist nicht möglich, grafische Parameter abzufragen, ohne ein solches Fenster zu aktivieren, siehe grab par values without opening a graphics device?.

Wir wollen den inneren Rand bei "top", "bottom" auf 0 setzen, so dass alle Plots vertikal miteinander verbunden werden. Dazu müssen wir den äußeren Rand auf "top" und "bottom" setzen, um Platz für Achsen und Titel zu schaffen (falls nötig).

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

Ich kann mehr nicht zustimmen! –

Verwandte Themen