簡體   English   中英

帶For循環的R繪圖多圖函數

[英]R Plot Multiple Graph Function with For Loop

事先表示歉意,我對此做了一些介紹。 我有一個相對較大的數據集,如下所示:

問題就在這里。 我一直在創建GLM,從中我獲取混雜變量的估計值並略過(如果您不明白我的意思,基本上,我需要計算我的最佳擬合線,而不僅僅是推算平均值點)。 當我編寫一行代碼為我解決這些問題時,這一切都很好。 但是,令人遺憾的是,我要生成其中的19個圖形-每行1個圖形-並且需要對6個數據集進行此操作。

迄今為止,我試圖使這一過程自動化的努力令人痛苦和沮喪。 如果有人認為生物學家意味着擁抱大熊貓,那就可悲了。 我有代碼來接受變量並一次生成一個圖,但是沒有運氣可以在一幀上全部生成它們。

大致想象一下,但是上面有19個圖形。 這就是現在的夢想![大致想象一下,但是上面有19張圖。 這就是現在的夢想] [2]

不幸的是,您的數據不可重現,但我認為可以改編以下內容。

使用這樣的幾個對象會變得非常混亂。 這是使用list非常有用的地方。 您只需要在my_list對象中使用x,y和攔截。 然后,您可以使用layout和循環繪制所有圖表。

my_list <- list()                                                                                                           
for(i in 1:19){                                                                                                             
    x <- runif(10)                                                                                                          
    y <- rnorm(10)                                                                                                          
    intercept <- lm(y~x)$coefficients[1]                                                                                    
    name <- paste('plot_',i,sep='')                                                                                         
    tmp <- list(x=x, y=y, intercept=intercept)                                                                              
    my_list[[name]] <- tmp                                                                                                  
}                                                                                                                           

layout(matrix(1:20, nrow = 4, ncol = 5, byrow = TRUE))                                                                      
for(j in 1:length(my_list)) {                                                                                               
    plot(x=my_list[[j]]$x, y=my_list[[j]]$y, main=attributes(my_list[j])$names,xlab="x-label",ylab="y-label")               
    abline(h=my_list[[j]]$intercept)                                                                                        
}    

在此處輸入圖片說明

只是想發布您要執行的操作的ggplot2版本,以查看它是否也對您有用。

我還展示了一個示例,該示例針對每個構面內的多個類進行擬合線擬合(取決於您進行的分析的復雜程度)。

如果尚未安裝ggp​​lot2,請先安裝它:

# install.packages('ggplot2')
library(ggplot2)

在這里,我只是使用內置的虹膜數據集設置一些虛擬數據。 我實質上是在嘗試模擬19個不同的數據集。

set.seed(1776)
samples <- list()

num_datasets <- 19
datasets <- list(num_datasets)


# dynamically create some samples
for(i in 1:num_datasets) {
    samples[[i]] <- sample(1:nrow(iris), 20)
}



# dynamically assign to many data sets (keep only 2 numeric columns)
for(i in 1:num_datasets) {
    datasets[[i]] <- cbind(iris[samples[[i]], c('Petal.Length', 'Petal.Width', 'Species')], dataset_id = i)
    # assign(paste0("dataset_", i), iris[samples[[i]], c('Petal.Length', 'Petal.Width')])
}

do.call有點棘手,但是它包含兩個參數,一個函數和一個應用於該函數的參數列表。 因此,我在數據datasets對象(這是數據集列表)內的所有不同數據集上使用rbind() )。

combined_data <- do.call(rbind, datasets)

第一個圖是顯示數據的一個大散點圖。

# all data
ggplot(data=combined_data, aes(x=Petal.Length, y=Petal.Width)) +
    geom_point(alpha = 0.2) +
    ggtitle("All data")

接下來是19個單獨的“方面”,全部在相同的比例和相同的圖形窗口中。

# all data faceted by dataset_id
ggplot(data=combined_data, aes(x=Petal.Length, y=Petal.Width)) +
    geom_point(alpha = 0.5) +
    ggtitle("All data faceted by dataset") +
    facet_wrap(~ dataset_id) +
    geom_smooth(method='lm', se = F)

具有最佳擬合線的刻面圖 具有最佳擬合線的刻面圖

最終,數據再次以小平面繪制,但由鳶尾花的種類着色,每種種類都有自己的最佳擬合線。

# all data faceted by dataset_id
ggplot(data=combined_data, aes(x=Petal.Length, y=Petal.Width, color = Species)) +
    geom_point(alpha = 0.5) +
    ggtitle("All data faceted by dataset with best fit lines per species") +
    facet_wrap(~ dataset_id) +
    geom_smooth(method='lm', se = F)

最適合類別的構面圖 最適合類別的構面圖

我看到您提到您有自己的預先計算的最佳擬合線,但是我認為從概念上講,這可能使您更接近所需的位置?

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM