データフレームには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言語の観点から)より良いソリューションはありますか?
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 ~ .)
別のパネルまたは同じパネルを使用して、データフレームからすべての列をプロットする非常に簡単な方法があります。
plot.ts(data)
どちらが得られるか(X1-X4は列名):
すべてのオプションについては?plot.tsをご覧ください。
プロット関数をこれ以上制御せず、ループを使用しない場合は、次のようなこともできます。
par(mfcol = c(ncol(data), 1))
Map(function(x,y) plot(x, main =y), data, names(data))
フープをジャンプして、ソリューションをlapply
、sapply
、または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)
与えるもの:
誰も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)
上記のヒントのいくつかを使用して(特に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])}
}
}
よろしくお願いします、マット。
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)
このコンピューターにはRがありませんが、ここにクラックがあります。 par
を使用して、ウィンドウに複数のプロットを表示したり、次のページを表示する前にクリックを促すプロンプトを表示したりできます。
plotfun <- function(col)
plot(data[ , col], ylab = names(data[col]), type = "l")
par(ask = TRUE)
sapply(seq(1, length(data), 1), plotfun)
xlab
オプションを使用して、タイトル(およびylab
およびmain
を介した軸のタイトル)を指定できます。例えば。:
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()
}
または、par()
のmfrow
パラメータを使用して、すべてのプロットを同じ画像に描画します。例:par(mfrow=c(2,2)
を使用して、同じ「画像」に次の4つのプロットを含めます。
.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")