2016-05-11 7 views
1

Wie der Titel sagt, möchte ich einige Liniendiagramme machen. Lassen Sie uns das mtcars als ein Beispiel verwenden.Zeichnen von Zeile für Zeile zusammen mit zwei festen Zeilen.

Ich möchte insgesamt 10 Zeilen aus diesem Datensatz plotten. Ich habe mich für diese diejenigen:

> dput(vec) 
c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", 
"Hornet Sportabout", "Valiant", "Duster 360", "Merc 240D", "Merc 230", 
"Merc 280") 

Also zunächst einmal ich den gesamten Datensatz der Teilmenge entschieden:

tbl_mtcars <- mtcars[row.names(mtcars) %in% vec, ] 

und als ich möchte diese Zeilen zeichnen, aber mit der Annahme, dass es auf jeder Parzelle wird nur 3 Zeilen sein. Die Linien für Merc 230 und Merc 280 sollten immer auf der Handlung sein und der Rest sollte eins nach dem anderen hinzugefügt werden.

Wäre toll, wenn das mit ggplot getan werden könnte:

Die Funktion unten nur das Beispiel des Codes, die ich oft zum Zeichnen verwenden.

ggplot(tbl_mtcars, aes(gear, carb, group=factor(Name))) + 
    theme(legend.title=element_blank()) + 
    geom_line(aes(color=factor(Name))) + 
    ggtitle("Title")+ 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) 
+1

Was meinst du mit "eins nach dem anderen" und fügte hinzu. Sie möchten also mehrere (wie viele?) Plots oder Facetten erstellen? – beetroot

+1

auch, wie wollen Sie Linien mit nur einem x und y Wert? – beetroot

+0

Der Datensatz, den ich plotten möchte, ist anders. Ich habe gerade die mtcars verwendet, um zu zeigen, wie ich die Zeilen auswähle, die geplottet werden sollen. Ich kann die echten Daten nicht teilen. Indem ich "eins nach dem anderen" hinzufüge, beziehe ich mich auf die Erstellung von wenigen Plots. Wenn also die Daten 10 Zeilen enthalten (einschließlich der zwei festen), bedeutet dies, dass es 8 Graphen gibt. –

Antwort

4

Zu allererst mtcars vielleicht nicht die beste Dataset Ihre Notwendigkeit zu verdeutlichen. Stattdessen habe ich einen Datenrahmen von 10 Zeilen und 5 Spalten erstellt (die Beobachtungen darstellen).

Die Sache ist, ggplot benötigt eine bestimmte Form von Daten ('lang' statt 'breit'), bevor wir ein Diagramm zeichnen können, müssen wir zuerst die Daten ändern. Hier verwende ich melt von reshape2 Paket.

Jetzt können wir die Plots generieren, wobei wir die zwei fixen Zeilen (IDs) berücksichtigen, die Sie erwähnt haben. Hier sind die letzten beiden IDs festgelegt. Bitte beachten Sie, dass ich hier nur die vanillentypischen Parzellen ohne viel Kosmetik präsentiere.

(EDIT/UPDATE: gemäß @ Paul Hiemstra Anregung ersetzt for Schleife mit lapply und eval-parse Kombination zu entfernen, obwohl immer noch die grid.arrange Methode halten)

# Generate data: 10 IDs each with 5 observations 
df <- data.frame(matrix(rnorm(50), 10, 5)) 
df$id <- as.numeric(rownames(df)) 

# Melt the data 
require(reshape2) 
df2 <- melt(df, id.vars = "id") 

# Generate plots 
require(ggplot2) 
plot.list <- lapply(1:(max(df2$id)-2), function(i) { 
    df2.i <- df2[df2$id %in% c(i, 9, 10), ] 
    ggplot(df2.i) + 
    geom_line(aes(x = as.numeric(variable), y = value, colour = factor(id))) 
}) 

# Combine plots 
require(gridExtra) 
do.call(grid.arrange, plot.list) 

output: eight graphs

+1

Ich würde vermeiden, die "for" -Schleife zu verwenden, und stattdessen "lapply" verwenden. Vermeiden Sie es auch, 'assign' zu verwenden, um die Objekte im globalen Arbeitsbereich zu speichern. Speichern Sie sie einfach als' list'. Dies vermeidet auch, dass Sie die sehr hässliche und fehleranfällige 'eval'-'parse'-Kombination verwenden müssen. Schließlich sehe ich meine Antwort für eine Möglichkeit, 'ggplot' Facette zu verwenden, um das gleiche Bild zu machen und' grid.arrange' zu ​​vermeiden. –

+1

Vielen Dank für die Eingabe, wirklich zu schätzen wissen. Ich habe meinen Code nach Ihrem Vorschlag geändert, obwohl er immer noch die Methode 'grid.arrange' verwendet. – zyurnaidi

+0

Das macht den Code viel lesbarer und robuster. Nett! –

3

Nach einiger Datenmanipulation Sie kann das gleiche Dataset wie @zyurnaidi verwenden, aber mit Facettierung und nicht grid.arrange. Der Trick besteht darin, zwei geom_line 's und facet_wrap zu verwenden. Die erste geom_line zeichnet die Linien, die Sie immer sehen möchten, die zweite die variierende Linie.

library(dplyr) 
library(tidyr) 
df2 = as.data.frame(t(df)) %>% 
    gather(variable_id, value, -V9, -V10) %>% 
    gather(always_show_id, value_always, V9, V10) %>% 
    group_by(variable_id, always_show_id) %>% mutate(x_id = seq_len(length(variable_id))) 
head(df2) 
    variable_id  value always_show_id value_always x_id 
1   V1 -0.89596500    V9 -0.1758441 1 
2   V1 0.42307486    V9 -0.2183904 2 
3   V1 -1.13538973    V9 0.3609882 3 
4   V1 -0.05927355    V9 -0.3902112 4 
5   V1 -0.69209362    V9 0.1045214 5 
6   V2 -0.56098448    V9 -0.1758441 1 

df2 %>% ggplot() + 
    geom_line(aes(x = x_id, y = value_always, group = always_show_id)) + 
    geom_line(aes(x = x_id, y = value), color = 'red') + 
    facet_wrap(~ variable_id) 

enter image description here

Verwandte Themen