Der Datenrahmen hat n Spalten und ich möchte n Diagramme erhalten, ein Diagramm für jede Spalte.
Ich bin ein Neuling und spreche nicht fließend R, trotzdem habe ich zwei Lösungen gefunden.
Der erste funktioniert, aber er druckt den Spaltennamen nicht (und ich brauche sie!):
data <- read.csv("sample.csv",header=T,sep=",")
for ( c in data ) plot( c, type="l" )
Der zweite funktioniert besser, weil er den Spaltennamen druckt:
data <- read.csv("sample.csv",header=T,sep=",")
for ( i in seq(1,length( data ),1) ) plot(data[,i],ylab=names(data[i]),type="l")
Gibt es bessere (aus Sicht der R-Sprache) Lösungen?
for(i in seq_along(dat))
und meine Daten auch nicht aufrufendata
.read.csv
können auf reduziert werden,read.csv("sample.csv")
da die anderen Argumente nur auf ihre Standardwerte gesetzt werden.Antworten:
Das
ggplot2
Paket erfordert ein wenig Lernen, aber die Ergebnisse sehen wirklich gut aus, Sie erhalten schöne Legenden und viele andere nette Funktionen, ohne viel Code schreiben zu müssen.require(ggplot2) require(reshape2) df <- data.frame(time = 1:10, a = cumsum(rnorm(10)), b = cumsum(rnorm(10)), c = cumsum(rnorm(10))) df <- melt(df , id.vars = 'time', variable.name = 'series') # plot on same grid, each series colored differently -- # good if the series have same scale ggplot(df, aes(time,value)) + geom_line(aes(colour = series)) # or plot on different plots ggplot(df, aes(time,value)) + geom_line() + facet_grid(series ~ .)
quelle
Es gibt eine sehr einfache Möglichkeit, alle Spalten aus einem Datenrahmen mithilfe separater Bedienfelder oder desselben Bedienfelds zu zeichnen:
Welche Ausbeuten (wobei X1 - X4 Spaltennamen sind):
Schauen Sie sich? Plot.ts für alle Optionen an.
Wenn Sie nicht mehr Kontrolle über Ihre Plotfunktion haben und keine Schleife verwenden möchten, können Sie auch Folgendes tun:
par(mfcol = c(ncol(data), 1)) Map(function(x,y) plot(x, main =y), data, names(data))
quelle
data <- data.frame(x=c(rnorm(10)),y=c(rnorm(10)),z=c(rnorm(10))) plot.ts(data,plot.type=c("single"),lty=1:3)
single
, sollten Sie auch Folgendes hinzufügen:col=rainbow(ncol(my.data))
oder etwas Ähnliches, um die Zeilen lesbar zu halten.Sie können durch Reifen springen und wandeln Sie Ihre Lösung auf einen
lapply
,sapply
oderapply
Anruf. (Ich sehe, dass @jonw einen Weg zeigt, dies zu tun.) Abgesehen davon ist das, was Sie bereits haben, vollkommen akzeptabler Code.Wenn dies alles Zeitreihen oder ähnliche sind, ist das Folgende möglicherweise eine geeignete Alternative, bei der jede Reihe in einem eigenen Bereich in einem einzelnen Darstellungsbereich dargestellt wird. Wir verwenden das
zoo
Paket, da es bestellte Daten wie diese sehr gut verarbeitet.require(zoo) set.seed(1) ## example data dat <- data.frame(X = cumsum(rnorm(100)), Y = cumsum(rnorm(100)), Z = cumsum(rnorm(100))) ## convert to multivariate zoo object datz <- zoo(dat) ## plot it plot(datz)
Welches gibt:
quelle
Ich bin überrascht, dass niemand erwähnt hat
matplot
. Dies ist sehr praktisch, wenn Sie nicht jede Linie in separaten Achsen zeichnen müssen. Nur ein Befehl:matplot(y = data, type = 'l', lty = 1)
Verwenden Sie
?matplot
diese Option, um alle Optionen anzuzeigen.Um die Legende hinzuzufügen, können Sie die Farbpalette festlegen und dann hinzufügen:
mypalette = rainbow(ncol(data)) matplot(y = data, type = 'l', lty = 1, col = mypalette) legend(legend = colnames(data), x = "topright", y = "topright", lty = 1, lwd = 2, col = mypalette)
quelle
matlab.dark.palette
, woher kommt es?hyperSpec
Paket. Aber es wäre besser, hier eine bekanntere Funktion zu verwenden, also habe ich sie geändertrainbow
. Wenn Sie sich der Palettenfunktionen nicht bewusst sind, schauen Sie sich diese an?rainbow
. Entschuldigung für die Verwirrung.Mit einigen der obigen Tipps (insbesondere danke @daroczig für das
names(df)[i]
Formular) druckt diese Funktion ein Histogramm für numerische Variablen und ein Balkendiagramm für Faktorvariablen. Ein guter Anfang, um einen Datenrahmen zu erkunden:par(mfrow=c(3,3),mar=c(2,1,1,1)) #my example has 9 columns dfplot <- function(data.frame) { df <- data.frame ln <- length(names(data.frame)) for(i in 1:ln){ mname <- substitute(df[,i]) if(is.factor(df[,i])){ plot(df[,i],main=names(df)[i])} else{hist(df[,i],main=names(df)[i])} } }
Beste Wünsche, Mat.
quelle
Mit
lattice
:library(lattice) df <- data.frame(time = 1:10, a = cumsum(rnorm(10)), b = cumsum(rnorm(10)), c = cumsum(rnorm(10))) form <- as.formula(paste(paste(names(df)[- 1], collapse = ' + '), 'time', sep = '~')) xyplot(form, data = df, type = 'b', outer = TRUE)
quelle
Mit der Option können Sie den Titel (und auch den Titel der Achsen über
xlab
undylab
) angebenmain
. Z.B:Und wenn Sie zeichnen möchten (und speichern) jede Variable eines Datenrahmen, die Sie verwenden sollten
png
,pdf
oder jede andere Grafiktreiber Sie benötigen, und nach dieser Ausgabe einendev.off()
Befehl. Z.B:data <- read.csv("sample.csv",header=T,sep=",") for (i in 1:length(data)) { pdf(paste('fileprefix_', names(data)[i], '.pdf', sep='') plot(data[,i], ylab=names(data[i]), type="l") dev.off() }
Oder zeichnen Sie alle Diagramme mit dem
mfrow
Parameter von auf dasselbe Bildpar()
. Beispiel: Verwenden Sie diese Optionpar(mfrow=c(2,2)
, um die nächsten 4 Diagramme in dasselbe "Bild" aufzunehmen.quelle
Ich habe kein R auf diesem Computer, aber hier ist ein Riss. Sie können
par
mehrere Diagramme in einem Fenster anzeigen oder auf diese Weise einen Klick veranlassen, bevor die nächste Seite angezeigt wird.plotfun <- function(col) plot(data[ , col], ylab = names(data[col]), type = "l") par(ask = TRUE) sapply(seq(1, length(data), 1), plotfun)
quelle
Leider bietet ggplot2 keine Möglichkeit, dies (einfach) zu tun, ohne Ihre Daten in ein Langformat umzuwandeln. Sie können versuchen, dagegen anzukämpfen, aber die Datentransformation ist einfacher. Hier alle Methoden, einschließlich
melt
von reshape2,gather
von tidyr undpivot_longer
von tidyr: Umformen von data.frame vom Breit- zum LangformatHier ist ein einfaches Beispiel mit
pivot_longer
:> df <- data.frame(time = 1:5, a = 1:5, b = 3:7) > df time a b 1 1 1 3 2 2 2 4 3 3 3 5 4 4 4 6 5 5 5 7 > df_wide <- df %>% pivot_longer(c(a, b), names_to = "colname", values_to = "val") > df_wide # A tibble: 10 x 3 time colname val <int> <chr> <int> 1 1 a 1 2 1 b 3 3 2 a 2 4 2 b 4 5 3 a 3 6 3 b 5 7 4 a 4 8 4 b 6 9 5 a 5 10 5 b 7
Wie Sie sehen können, werden
pivot_longer
die ausgewählten Spaltennamen in die vonnames_to
(Standard "Name") angegebenen Werte und die langen Werte in die vonvalues_to
(Standard "Wert") angegebenen Werte eingefügt . Wenn ich mit den Standardnamen einverstanden bin, kann ich use verwendendf %>% pivot_longer(c("a", "b"))
.Jetzt können Sie wie gewohnt zeichnen, z.
quelle
require(tidyr)
undrequire(ggplot2)
zu Ihrer Antwort hinzufügen , damit es ein minimales Arbeitsbeispiel wird.Falls die Spaltennamen in der
.csv
Dateidatei nicht gültig sind R-Name:data <- read.csv("sample.csv",sep=";",head=TRUE) data2 <- read.csv("sample.csv",sep=";",head=FALSE,nrows=1) for ( i in seq(1,length( data ),1) ) plot(data[,i],ylab=data2[1,i],type="l")
quelle
nrows = 1
inread.csv
.