数据框有n列,我想得到n个图,每列一个图.
我是新手,我不会说R,无论如何我找到了两个解决方案.
第一个工作,但它不打印列名称(我需要它们!):
data <- read.csv("sample.csv",header=T,sep=",")
for ( c in data ) plot( c, type="l" )
Run Code Online (Sandbox Code Playgroud)
第二个更好用,因为它打印列名:
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")
Run Code Online (Sandbox Code Playgroud)
是否有更好的(从R语言的角度来看)解决方案?
Pra*_*ani 78
该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 ~ .)
Run Code Online (Sandbox Code Playgroud)

Mat*_*ell 37
有一种非常简单的方法可以使用单独的面板或同一面板绘制数据框中的所有列:
plot.ts(data)
Run Code Online (Sandbox Code Playgroud)
哪个收益率(其中X1-X4是列名):

对于所有选项,请查看?plot.ts.
如果您不能更好地控制绘图功能而不使用循环,您还可以执行以下操作:
par(mfcol = c(ncol(data), 1))
Map(function(x,y) plot(x, main =y), data, names(data))
Run Code Online (Sandbox Code Playgroud)
Rei*_*son 13
您可以赴汤蹈火,你的解决方案转换为一个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)
Run Code Online (Sandbox Code Playgroud)
这使:

我很惊讶没人提到matplot.如果您不需要在不同的轴上绘制每条线,这将非常方便.只需一个命令:
matplot(y = data, type = 'l', lty = 1)
Run Code Online (Sandbox Code Playgroud)
使用?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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,ggplot2 没有提供一种在不将数据转换为长格式的情况下(轻松地)执行此操作的方法。您可以尝试对抗它,但数据转换会更容易。这里是所有方法,包括melt来自 reshape2、gather来自 tidyr 和pivot_longer来自 tidyr:将 data.frame 从宽格式重塑为长格式
这是一个使用的简单示例pivot_longer:
> df <- data.frame(time = 1:5, a = 1:5, b = 3:7)
> df
time a b
1 1 1 3
2 2 2 4
3 3 3 5
4 4 4 6
5 5 5 7
> df_long <- df %>% pivot_longer(c(a, b), names_to = "colname", values_to = "val")
> df_long
# A tibble: 10 x 3
time colname val
<int> <chr> <int>
1 1 a 1
2 1 b 3
3 2 a 2
4 2 b 4
5 3 a 3
6 3 b 5
7 4 a 4
8 4 b 6
9 5 a 5
10 5 b 7
Run Code Online (Sandbox Code Playgroud)
如您所见,pivot_longer将选定的列名称放入(默认“名称”)指定的任何内容中,并将长值放入(默认“值”)names_to指定的任何内容中。values_to如果我同意默认名称,我可以使用 use df %>% pivot_longer(c("a", "b"))。
现在您可以正常绘图:
ggplot(df_long, aes(x = time, y = val, color = colname)) + geom_line()
Run Code Online (Sandbox Code Playgroud)
与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)
Run Code Online (Sandbox Code Playgroud)
使用上面的一些提示(特别感谢@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])}
}
}
Run Code Online (Sandbox Code Playgroud)
祝福,Mat.