如何绘制R中dataframe的所有列
我在R有一个dataframe。dataframe有n列,我想得到n个图,每列一个图。
我是一个新手,我不是很stream利的R,无论如何,我find了两个解决scheme。
第一个工作,但它不打印列名(我需要他们!):
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语言的angular度来看)解决scheme?
谢谢。 亚历山德罗
ggplot2
软件包需要一点点的学习,但是结果看起来非常好,你可以得到很好的传说,还有许多其他很好的function,所有这些都不需要编写太多的代码。
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 ~ .)
有一种非常简单的方法可以使用单独的面板或同一个面板来绘制数据框中的所有列:
plot.ts(data)
哪个产生(其中X1 – X4是列名):
看看?plot.ts所有的选项。
如果你不想更多地控制你的绘图function,而不是使用循环,你也可以这样做:
par(mfcol = c(ncol(data), 1)) Map(function(x,y) plot(x, main =y), data, names(data))
您可以跳过篮球,并将您的解决scheme转换为lapply
, sapply
或apply
电话。 (我看@jonw显示了一种方法来做到这一点。)除此之外,你已经是完全可以接受的代码。
如果这些都是时间序列或类似的,那么以下可能是一个合适的select,它将每个序列绘制在单个绘图区域的自己的面板上。 我们使用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)
这使:
使用上面的一些技巧(尤其是感谢@daroczig表示names(df)[i]
forms),这个函数打印一个数值variables的直方图和因子variables的条形图。 探索一个数据框的好的开始:
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])} } }
最好的祝愿,马特。
我很惊讶,没有人提到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)
您可以使用main
选项指定标题(以及通过xlab
和ylab
的轴的标题)。 例如:
plot(data[,i], main=names(data)[i])
如果你想绘制(和保存)一个dataframe的每个variables,你应该使用png
, pdf
或者其他需要的graphics驱动程序,然后发出一个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() }
或者使用par()
的mfrow
参数将所有图绘制成相同的图像。 例如:使用par(mfrow=c(2,2)
将相同的“图像”中的下4个地块包括在内。
我在这台电脑上没有R,但是这里是一个破解。 您可以使用par
在窗口中显示多个图,或者像这样在显示下一页之前提示点击。
plotfun <- function(col) plot(data[ , col], ylab = names(data[col]), type = "l") par(ask = TRUE) sapply(seq(1, length(data), 1), plotfun)
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)
如果.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")