Как построить все столбцы кадра данных в R
У меня есть кадр данных в 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-точки зрения) решения?
Спасибо.
Alessandro
Ответы
Ответ 1
Пакет 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 ~ .)
![enter image description here]()
![enter image description here]()
Ответ 2
Существует очень простой способ построения всех столбцов из фрейма данных с использованием отдельных панелей или одной панели:
plot.ts(data)
Что дает (где X1 - X4 - имена столбцов):
![enter image description here]()
Посмотрите? plot.ts для всех параметров.
Если вы больше не контролируете функцию построения графика и не используете цикл, вы также можете сделать что-то вроде:
par(mfcol = c(ncol(data), 1))
Map(function(x,y) plot(x, main =y), data, names(data))
Ответ 3
Вы можете перейти через обручи и преобразовать свое решение в вызов 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)
Что дает:
![Example of zoo plotting capabilities]()
Ответ 4
Используя некоторые из приведенных выше советов (особенно спасибо @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])}
}
}
С наилучшими пожеланиями, Матем.
Ответ 5
Я удивлен, что никто не упомянул 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)
Ответ 6
Вы можете указать заголовок (а также заголовок осей с помощью 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 графиков в одно и то же "изображение".
Ответ 7
У меня нет R на этом компьютере, но здесь есть трещина. Вы можете использовать par
для отображения нескольких графиков в окне или как это, чтобы вызвать клик перед отображением следующей страницы.
plotfun <- function(col)
plot(data[ , col], ylab = names(data[col]), type = "l")
par(ask = TRUE)
sapply(seq(1, length(data), 1), plotfun)
Ответ 8
С 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)
Ответ 9
Если имена столбцов в файле файла .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")