Как построить все столбцы кадра данных в R
Кадр данных имеет n столбцов, и я хотел бы получить n графиков, по одному графику для каждого столбца.
Я новичок, и я не владею R, так или иначе, я нашел два решения.
Первый работает, но он не печатает имя столбца (и мне они нужны!):
data <- read.csv("sample.csv",header=T,sep=",") for ( c in data ) plot( c, type="l" )
Второй работает лучше, потому что он печатает имя столбца:
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")
Есть ли лучшие (с точки зрения R-языка) решения?
Пакет ggplot2
немного учится, но результаты выглядят очень красиво, вы получаете приятные легенды, а также множество других приятных функций, без необходимости писать много кода.
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 ~ .)
Существует очень простой способ построения всех столбцов из фрейма данных с помощью отдельных панелей или одной панели:
plot.ts(data)
Что дает (где X1 – X4 – имена столбцов):
Посмотрите на plot.ts для всех вариантов.
Если вы больше не контролируете функцию построения графика и не используете цикл, вы также можете сделать что-то вроде:
par(mfcol = c(ncol(data), 1)) Map(function(x,y) plot(x, main =y), data, names(data))
Вы можете перепрыгнуть через обручи и преобразовать свое решение в lapply
, sapply
или apply
звонок. (Я вижу, что @jonw показывает один из способов сделать это.) Кроме того, что у вас уже есть вполне приемлемый код.
Если это все временные ряды или аналогичные, то подходящей альтернативой может служить следующая альтернатива, которая отображает каждую серию в своей собственной панели в одной области графика. Мы используем пакет zoo
, поскольку он отлично обрабатывает упорядоченные данные.
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)
Который дает:
Я удивлен, что никто не упомянул о matplot
. Это довольно удобно, если вам не нужно рисовать каждую линию в отдельных осях. Только одна команда:
matplot(y = data, type = 'l', lty = 1)
Используйте ?matplot
чтобы просмотреть все параметры.
Чтобы добавить легенду, вы можете установить цветовую палитру, а затем добавить ее:
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)
Используя некоторые из приведенных выше советов (особенно спасибо @daroczig для формы names(df)[i]
), эта функция печатает гистограмму для числовых переменных и гистограмму для переменных факторов. Хорошее начало изучения кадра данных:
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])} } }
С наилучшими пожеланиями, Матем.
Вы можете указать заголовок (а также заголовок осей через xlab
и ylab
) с main
параметром. Например:
plot(data[,i], main=names(data)[i])
И если вы хотите отображать (и сохранять) каждую переменную в dataframe, вы должны использовать png
, pdf
или любой другой графический драйвер, который вам нужен, и после этого выпустить dev.off()
. Например:
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() }
Или нарисуйте все графики на одно и то же изображение с параметром mfrow
из par()
. Например: используйте par(mfrow=c(2,2)
для включения следующих 4 графиков в одно и то же «изображение».
У меня нет R на этом компьютере, но здесь есть трещина. Вы можете использовать par
для отображения нескольких графиков в окне или как это, чтобы вызвать клик, прежде чем отображать следующую страницу.
plotfun <- function(col) plot(data[ , col], ylab = names(data[col]), type = "l") par(ask = TRUE) sapply(seq(1, length(data), 1), plotfun)
С 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)
Если имена столбцов в файле .csv
файла недействительны R-имя:
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")