如何在R中绘制数据帧的所有列

时间:2011-02-02 16:58:45

标签: r plot dataframe

数据框有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语言的角度来看)解决方案?

11 个答案:

答案 0 :(得分:72)

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

答案 1 :(得分:36)

使用单独的面板或同一面板绘制数据框中的所有列的方法非常简单:

plot.ts(data)

哪个收益率(其中X1-X4是列名):

enter image description here

看看所有选项的情节。

如果您不能更好地控制绘图功能而不使用循环,您还可以执行以下操作:

par(mfcol = c(ncol(data), 1))
Map(function(x,y) plot(x, main =y), data, names(data))

答案 2 :(得分:13)

您可以跳过圈,将解决方案转换为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

答案 3 :(得分:9)

我很惊讶没有人提到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)

答案 4 :(得分:5)

使用上面的一些提示(特别感谢@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])}
  }
}

祝福,Mat。

答案 5 :(得分:3)

使用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)

答案 6 :(得分:2)

您可以使用xlab选项指定标题(以及通过ylabmain的轴标题)。 E.g:

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

如果您想绘制(并保存)数据帧的每个变量,您应该使用pngpdf或您需要的任何其他图形驱动程序,然后发出{{1}命令。 E.g:

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的{​​{1}}参数将所有绘图绘制到同一图像。例如:使用par()将下4个图包含在同一个“图像”中。

答案 7 :(得分: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)

答案 8 :(得分:2)

不幸的是,ggplot2没有提供一种(轻松地)完成此操作的方法,而不会将您的数据转换为长格式。您可以尝试解决它,但是进行数据转换会更容易。这里的所有方法,包括来自reshape2的melt,来自tidyr的gather和来自tidyr的pivot_longerReshaping data.frame from wide to long format

这是一个使用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_wide <- df %>% pivot_longer(c(a, b), names_to = "colname", values_to = "val")
> df_wide
# 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

如您所见,pivot_longer将选定的列名称放入names_to指定的任何内容中(默认为“名称”),并将长值放入values_to指定的任何内容中(默认值”)。如果可以使用默认名称,则可以使用use df %>% pivot_longer(c("a", "b"))

现在您可以正常绘制,例如。

ggplot(df_wide, aes(x = time, y = val, color = colname)) + geom_line()

enter image description here

答案 9 :(得分: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")

答案 10 :(得分:0)

此链接对相同的问题有很大帮助:

p = ggplot() + 
  geom_line(data = df_plot, aes(x = idx, y = col1), color = "blue") +
  geom_line(data = df_plot, aes(x = idx, y = col2), color = "red") 

print(p)

https://rpubs.com/euclid/343644