2011-02-02 2 views
52

У меня есть кадр данных в R. Кадр данных имеет n столбцов, и я хотел бы получить n графиков, по одному графику для каждого столбца.как построить все столбцы кадра данных в R

Я новичок, и я не владею 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-языка) решения?

спасибо. Алессандро

+2

В вашем втором второго примера, я бы инициализировать цикл, как это 'для (я в seq_along (Даты))' и я бы не стал называть мои данные «данными». –

+3

Ваш 'read.csv' может быть сведен к' read.csv ("sample.csv") ', поскольку другие аргументы просто устанавливаются в значения по умолчанию. –

ответ

55

Пакет 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

+0

Хороший ответ, но почему вы действительно нуждаетесь в изменении? – eliasah

+0

@eliasah для команды таяния –

+0

Спасибо @VerenaHaunschmid Я понял это потом :-) – eliasah

2

Вы можете указать заголовок (а также название осей через 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 графиков в одно и то же «изображение».

2

У меня нет R на этом компьютере, но здесь есть трещина. Вы можете использовать par для отображения нескольких графиков в окне или как это, чтобы вызвать клик перед отображением следующей страницы.

plotfun <- function(col) 
    plot(data[ , col], ylab = names(data[col]), type = "l") 
par(ask = TRUE) 
sapply(seq(1, length(data), 1), plotfun) 
+0

'apply' с' margin = 2' тоже сработало бы, полагаю? –

12

Вы можете прыгать через обручи и конвертировать ваше решение в 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

27

Существует очень простой способ построить все столбцы из кадра данных с использованием отдельных панелей или же панели:

plot.ts(data) 

что дает (где X1 - X4 являются названия столбцов):

enter image description here

Посмотрите? Plot.ts для всех вариантов.

Если вы wan't больше контроля над функцией черчения и не использовать цикл, вы также можете сделать что-то вроде:

par(mfcol = c(ncol(data), 1)) 
Map(function(x,y) plot(x, main =y), data, names(data)) 
+0

Спасибо, даже если это связано с временными рядами, я думаю, что это может помочь мне понять мои данные. Мне нравится один лайнер! –

+4

Просто небольшое примечание: при добавлении 'plot.type = c ("single")' ваша серия строится на одном графике вместо отдельных полей: '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) ' –

+0

@GeekOnAcid +1, Большое спасибо за подсказку «single». –

1

С 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) 
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])} 
    } 
} 

С наилучшими пожеланиями, Матем.

1

В случае именами столбцов в файле .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") 
+1

Поскольку вы используете только первую строку из data2, было бы более эффективно устанавливать 'nrows = 1' в' read.csv'. –

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) 
+0

Что такое 'matlab.dark.palette', откуда он? –

+1

@AlessandroJacopson это функция цветовой палитры, которую я обычно использую. Это из пакета 'hyperSpec'. Но было бы лучше использовать более известную функцию здесь, поэтому я изменил ее на «радугу». Если вы не знаете о функциях палитры, посмотрите на «радугу». Извините за смущение. –

Смежные вопросы