#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 и т. Д.?