2017-01-24 48 views
1

提前道歉,我對R和編程一般都很陌生。如何在R中的循環中創建具有不同y變量的圖?

我有幾個水質變量的數據集都是每年測量一次。我想要做的事似乎很簡單,那就是創建幾個探測散點圖,將x軸上的每個變量與時間對應起來。我一直在尋找這樣做的一個循環(是的,我知道循環不受歡迎,但正如我所說,我是新來的)自動化,因爲我將不得不做一堆分析之後,不想寫一堆冗餘代碼。

生成每個圖形都沒有問題,但我如何爲每個圖形賦予一個唯一的標識符(即,根據我正在循環的特定變量來編寫y標籤和圖表標題)來繪製一個空白圖。

這是我的代碼,但我不知道它可能是多麼有用。如何哄循環功能做我想做的事情會很棒。

WQdata <- data # the dataframe 
names <- colnames(WQdata[, -1]) # names of variables, excluding Year which was first column 
Year <- WQdata$Year 
vars <- c(WQdata[, -1]) # removed year, 

for (i in vars) { 
    xlim <- range(Year) 
    ylim <- range(i) 
    plot(x=Year, 
     y=i, 
     type="p", 
     main=paste(names[i]), 
     xlab="Year", 
     ylab=paste(names[i])) 
} 

到目前爲止,所做的工作是根據需要生成每個圖,但沒有這些自定義標籤。

再一次,我很抱歉,因爲模糊或者讓事情出來 - 感到困惑。

謝謝!

+0

嘗試使用變量名稱和常規舊字符串格式化動態創建標題。對於座標軸,您需要創建一個查找表(類似於Python中的字典),以將適當的軸映射到給定的圖形。 – blacksite

+0

謝謝。鑑於這是一個探索性的程序,我不會糾結於它的完美,所以如果我可以擁有動態標題,那麼我就不會爲軸心而煩惱。 我認爲我遇到的麻煩是確保每個圖是根據它正在繪製的數據列標題的,但現在它在標題中插入比我想要的更多的文本,提示我的參考(「名稱[我]「)不工作,我以爲它應該... – AJK

回答

3

您可以使用ggplot與面少的代碼,而環圈和重複代碼...

library(ggplot2) 
library(tidyverse) 

df <- mtcars %>% 
    gather(-mpg, key="var", value = "value") 

ggplot(df, aes(x = mpg, y = value)) + 
    geom_point(alpha = 0.3) + 
    geom_smooth(method = "lm") + 
    facet_wrap(~var, scales = "free") + 
    theme_bw() 

+1

完美,謝謝!仍然沒有完全解決循環,但這會讓我繼續前進。 – AJK

1

您可以嘗試創建標題和y標籤的列表,並在循環內引用它們。

使用mtcars一個例子:

labels <- list("cyl" = c("main - cylinders", "ylabel - cylinders"), 
       "disp" = c("main displacement", "ylabel - cylinders"), 
       "hp" = c("main horsepower", "ylabel - horsepower") 
       ) 


for (i in colnames(mtcars)[2:4]){ 
    plot(x=mtcars[,'mpg'], 
     y=mtcars[ ,i], 
     type = "p", 
     main = labels[[i]][1], 
     xlab= "mpg", 
     ylab= labels[[i]][2] 
) 
    } 
+0

不錯!但是使用列表清單看起來過分了 - 字符向量列表可能就足夠了。 – Gregor

+0

@格雷戈感謝您的建議!我改進了答案,但是我應該保持相同的下標:'labels [[i]] [[2]]'?我沒有看到更好的方式來做到這一點,但它看起來不太好。 –

+0

您現在可以擺脫第二個子集上的雙括號。也就是說,[[i]] [[2]]'可以是[[i]] [2]'。而且由於你使用的是一個命名列表,可能會更好地說'for(y in c(「cyl」,「disp」,「hp」))'(確保列表名稱匹配'disp'而不是'displacment' )。那麼你可以做'y = mtcars [,y]'而不是依靠索引和列順序。當然,用'y's替換其他'i's。 – Gregor

0

使用特徵向量和索引這裏有一個答案:

df <- data.frame(YEAR = c(2013,2014,2015,2014,2013), 
       INCHES = c(12,36,34,23,12), 
       TEMP = c(89,98,76,87,65), 
       PRESSURE = c(0.05, 0.10, 0.12, 0.85, 0.90)) 

# Must correspond to variables except for `YEAR` in `df` 
# `y_axis_labels` are your custom labels 
y_axis_labels = c("Inches", "Temperature", "Pressure") 
y_axis_vars = names(df[, -1]) 

xlim <- range(df$YEAR) 

for(i in 1:length(y_axis_vars)){ 
    curr_y_axis_var = y_axis_vars[i] 
    ylim <- range(df[[curr_y_axis_var]]) 

    plot(x = df$YEAR, 
     y = df[[curr_y_axis_var]], 

     type = "p", 
     main = paste(curr_y_axis_var), 
     xlab = 'YEAR', 
     ylab = paste(curr_y_axis_var)) 
}