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

How to plot all the columns of a data frame in R

提问人:Alessandro Jacopson 提问时间:2/3/2011 最后编辑:HenrikAlessandro Jacopson 更新时间:1/2/2022 访问量:234644

问:

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

DataFrame R-FAQ

评论

2赞 Gavin Simpson 2/3/2011
在您的第二个示例中,我将像这样初始化循环,并且我也不会调用我的数据。for(i in seq_along(dat))data
3赞 G. Grothendieck 2/3/2011
由于其他参数只是设置为默认值,因此可以简化为 u。read.csvread.csv("sample.csv")

答:

3赞 daroczig 2/3/2011 #1

您可以使用以下选项指定标题(以及通过 和 指定轴的标题)。例如:xlabylabmain

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

如果要绘制(并保存)数据帧的每个变量,则应使用 ,或所需的任何其他图形驱动程序,然后发出命令。例如:pngpdfdev.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()
}

或者将所有绘图绘制到具有 的参数的同一图像上。例如:用于在同一“图像”中包含接下来的 4 个图。mfrowpar()par(mfrow=c(2,2)

3赞 J. Win. 2/3/2011 #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)
15赞 Gavin Simpson 2/3/2011 #3

您可以跳过重重障碍,将解决方案转换为 或调用。(我看到@jonw显示了一种方法。除此之外,你已经拥有的是完全可以接受的代码。lapplysapplyapply

如果这些都是时间序列或类似的时间序列,那么以下可能是一个合适的替代方案,它将每个序列绘制在单个绘图区域上自己的面板中。我们使用这个包,因为它确实可以很好地处理这样的有序数据。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

107赞 Prasad Chalasani 2/3/2011 #4

该软件包需要一点学习,但结果看起来非常好,您可以获得漂亮的图例,以及许多其他不错的功能,所有这些都无需编写太多代码。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赞 eliasah 7/20/2016
很好的答案,但为什么你实际上需要重塑?
0赞 eliasah 1/16/2017
谢谢@VerenaHaunschmid我后来想通了:-)
0赞 Bruce_Warrior 10/11/2021
熔体需要
48赞 Matti Pastell 2/3/2011 #5

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

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

评论

0赞 Alessandro Jacopson 2/19/2011
谢谢,即使它与时间序列有关,我认为它可以帮助我掌握我的数据。我喜欢单行本!
7赞 Geek On Acid 11/20/2011
请注意:当添加 'plot.type=c(“single”)' 时,您的序列将绘制在单个图上,而不是单独的框上:data <- data.frame(x=c(rnorm(10)),y=c(rnorm(10)),z=c(rnorm(10))) plot.ts(data,plot.type=c("single"),lty=1:3)
0赞 Alessandro Jacopson 1/29/2012
@GeekOnAcid+1,非常感谢你对“单身”的提示。
0赞 bright-star 1/6/2014
如果您要使用 ,您还应该添加: 或类似的东西以保持行的可读性。singlecol=rainbow(ncol(my.data))
5赞 Oscar Perpiñán 11/21/2011 #6

跟: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)
9赞 MatW 1/25/2012 #7

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

最好的祝愿,马特。

1赞 Alessandro Jacopson 3/1/2016 #8

如果文件文件中的列名不是有效的 R 名称:.csv

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")

评论

1赞 Rustam Guliev 12/6/2016
由于仅使用 data2 中的第一行,因此在 中设置会更有效。nrows = 1read.csv
14赞 Rustam Guliev 12/6/2016 #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)

评论

0赞 Alessandro Jacopson 12/6/2016
什么是,它来自哪里?matlab.dark.palette
1赞 Rustam Guliev 12/6/2016
@AlessandroJacopson这是我通常使用的调色板功能。它来自包装。但是这里最好使用更已知的功能,所以我把它改成了.如果您不了解调色板功能,请查看 。很抱歉造成混淆。hyperSpecrainbow?rainbow
7赞 qwr 10/23/2020 #10

不幸的是,ggplot2 没有提供一种方法来做到这一点(轻松),而无需将数据转换为长格式。您可以尝试与之抗争,但进行数据转换会更容易。这里是所有的方法,包括 from reshape2、from tidyr 和 from tidyr: 将 data.frame 从宽格式调整为长格式meltgatherpivot_longer

下面是一个使用 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

如您所见,将选定的列名放在 (默认 “name”) 指定的任何内容中,并将长整型值放入 (默认为 “value”) 指定的任何内容中。如果我对默认名称没问题,我可以使用 use .pivot_longernames_tovalues_todf %>% pivot_longer(c("a", "b"))

现在您可以像往常一样绘图了,例如。

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

enter image description here

评论

0赞 Alessandro Jacopson 10/23/2020
我会在你的答案中添加和,所以它将成为最小的工作示例。require(tidyr)require(ggplot2)
0赞 qwr 10/28/2020
@AlessandroJacopson我以为我说得很清楚,这些都是必需的。无论如何,如果代码中穿插着解释,MWE 有用吗?
0赞 Alessandro Jacopson 10/28/2020
对我来说,这很有用,无论如何这是一个品味问题,谢谢你的回答。
1赞 Julien 11/30/2022
它应该是 名称 ,而不是df_longdf_wide
0赞 S.Maria 12/14/2020 #11

对于同样的问题,这个链接对我有很大帮助:

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