webdevqa.jp.net

Rのデータフレームのすべての列をプロットする方法

データフレームにはn列あり、各列に1つずつ、nプロットを取得したいと思います。

私は初心者であり、Rに堪能ではありませんが、とにかく2つの解決策を見つけました。

最初のものは動作しますが、列名を印刷しません(そしてそれらが必要です!):

data <- read.csv("sample.csv",header=T,sep=",")
for ( c in data ) plot( c, type="l" )

2番目の方法は、列名を出力するため、より適切に機能します。

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言語の観点から)より良いソリューションはありますか?

66

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 hereenter image description here

74

別のパネルまたは同じパネルを使用して、データフレームからすべての列をプロットする非常に簡単な方法があります。

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))
37
Matti Pastell

フープをジャンプして、ソリューションをlapplysapply、またはapplyの呼び出しに変換できます。 (@jonwはこれを行う1つの方法を示しています。)それ以外は、すでに完全に受け入れ可能なコードです。

これらがすべて時系列または類似のものである場合、次の方法が適切な代替手段である可能性があります。これは、単一のプロット領域に独自のパネルで各シリーズをプロットします。 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

13
Gavin Simpson

誰も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)
9
Rustam Guliev

上記のヒントのいくつかを使用して(特にnames(df)[i]フォームの@daroczigに感謝)、この関数は数値変数のヒストグラムと因子変数の棒グラフを出力します。データフレームの探索の良いスタート:

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

よろしくお願いします、マット。

5
MatW

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

このコンピューターにはRがありませんが、ここにクラックがあります。 parを使用して、ウィンドウに複数のプロットを表示したり、次のページを表示する前にクリックを促すプロンプトを表示したりできます。

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

xlabオプションを使用して、タイトル(およびylabおよびmainを介した軸のタイトル)を指定できます。例えば。:

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

また、データフレームの各変数をプロット(および保存)する場合は、pngpdf、または必要な他のグラフィックドライバーを使用し、その後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つのプロットを含めます。

2
daroczig

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