Реализация построения матрицы в функции R

#r #function #plot

#r #функция #построение

Вопрос:

Приведенная ниже функция представляет собой функцию, которая использует распределения для последующего заполнения матрицы значениями.

 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 . Спасибо!

Ответ №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
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Это имеет большой смысл вместо того, чтобы возвращать график вместо того, чтобы пытаться его построить. Приводит ли руководство в конце кода к тому, что программа фактически отображает график вместо этого?

2. @Nhyi Да, это способ печати объекта. В противном случае он будет сохранен только в руководстве по объекту. Я надеюсь, что это было полезно и полезно для вас!

3. @Nhyi Дайте мне знать, было ли мое объяснение достаточно ясным!

4. Да, это было! Я думаю, что до того, как я ее построил, она не обновлялась, потому что я фактически не возвращал объект для печати. В этом гораздо больше смысла, чем в том, что я делал ранее!

5. Быстрый вопрос относительно построения. Как бы мне изменить метку для ключа с правой стороны или можно ли изменить ее, чтобы точки данных были пронумерованы? Итак, для одного цвета все точки данных помечаются как 1, а затем для второго цвета — 2 и т. Д.?