Подтвердить что ты не робот

Как построить все столбцы кадра данных в 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

4b9b3361

Ответ 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 hereenter 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")