Как построить все столбцы фрейма данных в R - PullRequest
65 голосов
/ 02 февраля 2011

Во фрейме данных есть 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) решения?

Ответы [ 9 ]

72 голосов
/ 02 февраля 2011

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

36 голосов
/ 03 февраля 2011

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

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))
13 голосов
/ 02 февраля 2011

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

9 голосов
/ 05 декабря 2016

Я удивлен, что никто не упомянул 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)
5 голосов
/ 25 января 2012

Используя некоторые из приведенных выше советов (особенно спасибо @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])}
  }
}

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

3 голосов
/ 21 ноября 2011

С 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)
2 голосов
/ 02 февраля 2011

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

plotfun <- function(col) 
  plot(data[ , col], ylab = names(data[col]), type = "l")
par(ask = TRUE)
sapply(seq(1, length(data), 1), plotfun)
2 голосов
/ 02 февраля 2011

Вы можете указать заголовок (а также заголовок осей через xlab и ylab) с помощью опции main.Например:

plot(data[,i], main=names(data)[i])

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

1 голос
/ 01 марта 2016

В случае, если имена столбцов в файле .csv недопустимы 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...