【问题标题】:Implementing Matrix Plotting in R Function在 R 函数中实现矩阵绘图
【发布时间】:2023-03-13 20:19:02
【问题描述】:

下面的函数是一个使用分布然后用值填充矩阵的函数。

library(tidyverse)

occ_simulation <- function(nyears, lambda, alpha, beta){
  
  data_matrix <- matrix(, nrow = nyears, ncol = 6)
  
  for (z in 1:nyears){
    data_matrix[z][1] <- z
  }
  
  for (yr in 1:nyears){
    
    poisson_sim = rpois(1, lambda)
    
    for (number_of_events in poisson_sim){
      
      if (number_of_events == 1){
        
        beta_sim = rbeta(1, alpha, beta)
        data_matrix[yr, 2] <- beta_sim
        
      } else if (number_of_events == 2){
        
          for (i in 2:3){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
            
          }
        
      } else if (number_of_events == 3){
          
          for (i in 2:4){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        
          }
        
      } else if (number_of_events == 4){
        
          for (i in 2:5){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        
          }
          
      } else{
        
          for (i in 2:6){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, i] <- beta_sim
        }
    
      }
      
    }
    
  }
  
  sorted_matrix <- cbind(data_matrix[,1],t(apply(data_matrix[,2:6],1,function(x) sort(x))))
  print(sorted_matrix)
  
}


manual = occ_simulation(10, 10, 2, 20)

比如这个函数的输出矩阵是:

      [,1]        [,2]       [,3]       [,4]       [,5]       [,6]
 [1,]    1 0.083134569 0.08617405 0.09887510 0.11772536 0.22531132
 [2,]    2 0.031942297 0.05572298 0.13227172 0.13373033 0.18225673
 [3,]    3 0.034385791 0.05340521 0.06165728 0.08298166 0.09168579
 [4,]    4 0.051670957 0.08783456 0.10290313 0.11267966 0.14254834
 [5,]    5 0.005269822 0.01229135 0.03251302 0.03560609 0.12144208
 [6,]    6 0.059678131 0.06291472 0.07521237 0.08371512 0.17253282
 [7,]    7 0.020974306 0.03211666 0.03951780 0.12363214 0.12707027
 [8,]    8 0.066050034 0.09113262 0.11433074 0.11642412 0.19931177
 [9,]    9 0.042327058 0.08072802 0.15232605 0.17718338 0.19237172
[10,]   10 0.034537165 0.07571227 0.09081958 0.11202394 0.11799924

我想知道的是,我如何能够在我的函数中实现绘图,以便我将矩阵的第一列作为 x 轴的值,然后根据它们的 x 值绘制点的行绘制在 y 轴上。

例如,对于 x 值为 1,我将在其正上方绘制 5 个点,这 5 个点是第一行中的点:0.083134569, 0.08617405, 0.09887510, 0.11772536, 0.22531132。谢谢!

【问题讨论】:

    标签: r function plot


    【解决方案1】:

    试试这个方法。在函数末尾使用tidyverse 连接绘图草图。当您使用一些参数应用它时,该图将存储在对象manual 中。代码如下:

    library(tidyverse)
    #Function
    occ_simulation <- function(nyears, lambda, alpha, beta){
      
      data_matrix <- matrix(, nrow = nyears, ncol = 6)
      
      for (z in 1:nyears){
        data_matrix[z][1] <- z
      }
      
      for (yr in 1:nyears){
        
        poisson_sim = rpois(1, lambda)
        
        for (number_of_events in poisson_sim){
          
          if (number_of_events == 1){
            
            beta_sim = rbeta(1, alpha, beta)
            data_matrix[yr, 2] <- beta_sim
            
          } else if (number_of_events == 2){
            
            for (i in 2:3){
              
              beta_sim = rbeta(1, alpha, beta)
              data_matrix[yr, i] <- beta_sim
              
            }
            
          } else if (number_of_events == 3){
            
            for (i in 2:4){
              
              beta_sim = rbeta(1, alpha, beta)
              data_matrix[yr, i] <- beta_sim
              
            }
            
          } else if (number_of_events == 4){
            
            for (i in 2:5){
              
              beta_sim = rbeta(1, alpha, beta)
              data_matrix[yr, i] <- beta_sim
              
            }
            
          } else{
            
            for (i in 2:6){
              
              beta_sim = rbeta(1, alpha, beta)
              data_matrix[yr, i] <- beta_sim
            }
            
          }
          
        }
        
      }
      
      sorted_matrix <- cbind(data_matrix[,1],t(apply(data_matrix[,2:6],1,function(x) sort(x))))
      #Plot
      G <- sorted_matrix %>% as.data.frame %>%
        pivot_longer(-V1) %>%
        ggplot(aes(x=factor(V1),y=value,color=name,group=name))+
        geom_point()+
        labs(color='Column',x='V1')+
        theme_bw()
      return(G)
    }
    #Apply
    manual = occ_simulation(10, 10, 2, 20)
    manual
    

    输出:

    【讨论】:

    • 这很有意义,而不是返回绘图而不是尝试绘制它。代码末尾的手册是否会导致程序实际显示绘图?
    • @Nhyi 是的,这是一种打印对象的方法。否则它只会存储在对象手册中。我希望这对你有用和有帮助!
    • @Nhyi 如果我的解释足够清楚,请告诉我!
    • 是的!我想在我绘制它之前但它没有更新,因为我实际上并没有返回要打印的对象。这样做比我以前做的更有意义!
    • 关于绘图的快速问题。我将如何更改右侧键的标签,或者是否可以更改它以便对数据点进行编号?所以对于一种颜色,所有数据点都标记为 1,然后对于第二种颜色,它是 2 等等?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2018-03-25
    • 1970-01-01
    • 2017-02-27
    • 2021-04-13
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多