2017-10-07 51 views
1

我想在單個圖上繪製13條線。每行代表我的數據的一個子集,按「盆地」列中的字符分組。我有工作,但我想使用for循環更高效。 Here's what the output looks like使用for-loop字符來繪製幾行具有特定顏色的線

簡化數據幀一起工作:

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

需要兩個變量:一個用於'basin'和一個用於彩色指數:'用於(在seq_along(basinlist)ⅱ){I < - basinlist [II];線(sal [basin == i]〜date [basin == i],data = env,col = c(4,4,2)[ii],lty = c(1,1,2)[ii]) }' – rawr

+0

那是票! 'seq_along'是我所需要的。爲了確保我明白了,它會創建一個長度爲'basinlist'(1:13)的序列,這意味着我可以使用ii作爲數字,而我可以用作盆地名稱? –

+0

你明白了。大多數人傾向於使用'1:length(x)'而不是'seq(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

相關問題