2017-10-07 6 views
1

私は1つのグラフに13行をプロットしたいと思います。各行は私のデータのサブセットを表し、カラム 'basin'の文字でグループ化されています。私はうまく機能していますが、forループを使って効率を上げたいと思います。 Here's what the output looks like文字のforループを使用して、特定の色で複数の線をプロットする

で動作するように単純化されたデータフレーム:

env <- data.frame(basin = c('BLK','DUC','WHP','BLK','DUC','WHP','BLK','DUC','WHP'), 
        sal = c(5,6,3,2,4,5,6,8,4), 
        date = c(2013,2013,2013,2015,2015,2015,2017,2017,2017)) 

と動作しませんでした何の簡易版(それが実行されますが、すべてのラインが青と固体になる):

basinlist <- c('BLK','DUC','WHP') 
plot(sal~date, data = env, type = 'n', ylim = c(0,10), ylab = 'Salinity') 
for(i in basinlist){ 
    lines(sal[basin==i] ~ date[basin==i], data = env, 
     col = c(4,4,2), 
     lty = c(1,1,2)) 
} 

enter image description here

iが文字の場合、各繰り返しで色を変更する方法がわかりません。この問題を検索すると、iが数字である場合、またはすべての色が異なる線を作成する場合の解決策が得られますが、どちらも私の目標ではありません。

これは私が自分の質問をしたのは初めてですが、回答が他の場所に掲載されていることを発見するのではなく、必要な場合はお知らせください。

+0

次の2つの変数を必要とする: 'basin'用とカラーインデックスのための1つ:'(seq_along(basinlist)におけるII)のために{iが< - basinlistを[II]。データ= env、col = c(4,4,2)[ii]、lty = c(1,1,2)[ii]) } ' – rawr

+0

それはチケットだった! 'seq_along'は私が必要としたものです。私が理解していることを確かめるために、長さ 'basinlist'(1:13)のシーケンスを作っています。これは、iiを底辺の名前として使うことができますか? –

+0

あなたはそれを持っています。ほとんどの人は 'seq(x)'の代わりに '1:length(x)'を使う傾向がありますし、 'seq_along(x)'ループに対しては安全ですが 'x < - character(0)'なら、 '1:length(x)'と 'seq_along(x)' – rawr

答えて

1

この場合、ループ内の繰り返しごとに、ベクトルのインデックスと変数自体の両方が必要です。必要なプロットを取得する簡単な方法は、インデックスを繰り返し(下の例ではii)、各繰り返しでベクトル要素を取得することです(これまでのようにi)。

env <- data.frame(basin = c('BLK','DUC','WHP','BLK','DUC','WHP','BLK','DUC','WHP'), 
        sal = c(5,6,3,2,4,5,6,8,4), 
        date = c(2013,2013,2013,2015,2015,2015,2017,2017,2017)) 

basinlist <- c('BLK','DUC','WHP') 
plot(sal~date, data = env, type = 'n', ylim = c(0,10), ylab = 'Salinity') 

for (ii in seq_along(basinlist)) { 
    i <- basinlist[ii] 
    lines(sal[basin==i] ~ date[basin==i], data = env, 
     col = c(4,4,2)[ii], 
     lty = c(1,1,2)[ii]) 
} 

enter image description here

関連する問題