2011-02-02 32 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(DAT))`我也不會打電話給我的數據。 – 2011-02-02 17:25:10

+3

您的`read.csv`可以簡化爲`read.csv(「sample.csv」)`,因爲其他參數只是被設置爲默認值。 – 2011-02-02 18:09:46

回答

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 2016-07-20 10:02:19

+0

@eliasah爲融化命令 – 2017-01-15 16:12:15

+0

謝謝@VerenaHaunschmid我已經想通了之後:-) – eliasah 2017-01-15 16:44:07

2

你可以指定標題(也是通過xlabylab軸的標題)與main選項。例如: -

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

如果你想繪製(並保存)一個數據幀的每個變量,你應該使用pngpdf或者你需要的任何其它顯卡驅動程序,併發出後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 paramater的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

`應用`與'margin = 2`也會起作用,我想呢? – 2011-02-02 23:22:05

12

可以赴湯蹈火,你的解決方案轉換爲lapplysapplyapply電話。 (我看@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)) 
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

使用一些技巧(特別感謝names(df)[i]表單中的@daroczig),此函數爲數字變量打印直方圖,並打印因子變量的條形圖。探索數據框的好開始:

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") 
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) 
相關問題