Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中绘制数据帧的所有列_R_Plot_Dataframe - Fatal编程技术网

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

如何在R中绘制数据帧的所有列,r,plot,dataframe,R,Plot,Dataframe,数据框有n列,我想得到n个图,每列一个图 我是一个新手,我对R不太熟练,不管怎样,我找到了两个解决方案 第一个可以工作,但不打印列名(我需要它们!): data您可以使用main选项指定标题(以及通过xlab和ylab指定轴的标题)。例如: plot(data[,i], main=names(data)[i]) 如果要绘制(并保存)数据帧的每个变量,应使用png、pdf或所需的任何其他图形驱动程序,然后发出dev.off()命令。例如: data <- read.csv("sample.

数据框有n列,我想得到n个图,每列一个图

我是一个新手,我对R不太熟练,不管怎样,我找到了两个解决方案

第一个可以工作,但不打印列名(我需要它们!):


data您可以使用
main
选项指定标题(以及通过
xlab
ylab
指定轴的标题)。例如:

plot(data[,i], main=names(data)[i])
如果要绘制(并保存)数据帧的每个变量,应使用
png
pdf
或所需的任何其他图形驱动程序,然后发出
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()
}

data我这台电脑上没有R,但这里有个漏洞。您可以使用
par
在一个窗口中显示多个绘图,或类似的方式在显示下一页之前提示单击

plotfun <- function(col) 
  plot(data[ , col], ylab = names(data[col]), type = "l")
par(ask = TRUE)
sapply(seq(1, length(data), 1), plotfun)

plotfun您可以跳过障碍,将解决方案转换为
lappy
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)
require(动物园)
种子(1)
##示例数据

datggplot2
package需要一点学习,但是结果看起来非常好,你可以得到很好的图例,还有许多其他很好的特性,所有这些都不需要编写太多代码

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 ~ .)
require(ggplot2)
要求(2)

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

plot.ts(data)
其结果(其中X1-X4为列名):

查看所有选项的?plot.ts

如果您不想更多地控制打印功能,也不想使用循环,也可以执行以下操作:

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

使用
晶格

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)
库(晶格)

df使用上面的一些技巧(特别感谢@daroczig提供的
名称(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])}
  }
}
par(mfrow=c(3,3),mar=c(2,1,1,1))#我的示例有9列

dfplot如果
.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")

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

不幸的是,ggplot2没有提供一种不将数据转换为长格式的方法(轻松地)。您可以尝试与之抗争,但这样做只会更容易进行数据转换。以下是所有方法,包括重塑2的
melt
、tidyr的
gather
和tidyr的
pivot\u longer

下面是一个简单的示例,使用:


对于相同的问题,此链接帮助了我很多:

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)

在第二个示例中,我会像这样初始化循环(我在seq_-along(dat))
,我也不会调用我的数据
data
。您的
read.csv
可以简化为
read.csv(“sample.csv”)
,因为其他参数刚刚被设置为默认值。谢谢,即使它与时间序列有关,我认为它也能帮助我掌握数据。我喜欢一个班轮!只是一个小提示:当添加“plot.type=c(“single”)时,您的系列将绘制在单个绘图上,而不是单独的框:
data@GeekOnAcid+1,非常感谢您对“single”的提示。如果您要使用
single
,您还应该添加:
col=rainbow(ncol(my.data))
或类似的方法来保持行的可读性。回答很好,但为什么你真的需要重塑?谢谢@VerenaHaunschmid,我后来发现:-)因为你只使用数据2中的第一行,所以在
read.csv
中设置
nrows=1
会更有效。什么是
matlab.dark.palete
,它来自哪里?@AlessandroJacopson这是我通常使用的调色板功能。它来自
hyperSpec
软件包。但最好在这里使用更多已知的函数,所以我将它改为
rainbow
。如果您不知道调色板函数,请查看
?rainbow
。很抱歉让您感到困惑。我会在您的答案中添加
require(tidyr)
require(ggplot2)
,这样它将成为一个最小的工作示例。@AlessandroJacopson我想我已经明确说明了这些是必需的。不管怎样,如果代码中穿插了解释,MWE有用吗?对我来说,它是有用的,不管怎样,这是一个品味的问题,谢谢你的回答。
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)
> 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

ggplot(df_wide, aes(x = time, y = val, color = colname)) + geom_line()
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)