С Новым годом и Рождеством
🎄🎅🎁✨🔔🕯️🦌🎉🍪🥛⛄🌨️🧤🧣🍬🍭
Благодарим за проявленный интерес к нашей деятельности.
Благодарим за уделенное время и сотрудничество.
Подведение итогов года
- За отчетный период, составляющий почти полгода (25 недель), было подготовлено 25 аналитических материалов ⏳
- Объем разработанного кода превысил 10 тысяч строк 💻
- Создано более 50 графических изображений 📊
- Количество подписчиков по электронной почте достигло 950 📬
Просим оценить нашу деятельность
Представленный опрос является кратким.
На следующей неделе выпуск рассылки не планируется. Встреча состоится в следующем году. Желаем приятных выходных.
Публикации в средствах массовой информации
Предлагаем ознакомиться с недавним интервью, данным Нверу Мнацаканяну, в котором подводятся итоги 2023 года.
В ходе интервью были затронуты следующие темы:
- Причины увеличения налоговых поступлений в Армении на 242 млрд драмов в 2023 году.
- Рост экономики Армении на 7% при ведущей роли туризма и сектора информационных технологий.
- Возвращение строителей из России в Армению и укрепление драма по отношению к рублю.
Алгоритм построения рождественской елки
Все аналитические материалы, направляемые пользователям, были подготовлены с использованием программного кода, преимущественно на языках R и Markdown. При проведении исследований офисные программы не применялись. Все аналитические материалы также доступны на нашем веб-сайте, а код и данные для всех анализов размещены на Github.
🎄 Сегодня впервые принято решение поделиться кодом, в данном случае — кодом для построения рождественской елки. 🎄
Выражаем надежду на вдохновение и стимулирование к новым достижениям в наступающем году.
The main colors of the Christmas Three and the main parameter
scale_factor, which desides the hight of the three and
ajast everything acordingly.
# Change to adjust the tree height. Provide an odd number to works properly
scale_factor = 15
# defining the colors
tree_colors = c(
"#A8D185", "#04905E", "#9acd32", "#3D9618", "#8AD378", "#3FD485",
"#089E79", "#079094", "#2F9B61", "#50C878", "#008000", "#008000"
)
bauble_colours = c(
"#646F75", "#949399", "#8C9EAA", "#C3C4C6",
"#9CC6D4", "#CD936D", "#DB7076", "#E04C52"
)
garland_reds <- c(
"#ff0000", "#ffa07a", "#fa8072", "#ff6347",
"#cd5c5c", "#ff4500", "#dc143c", "#b22222"
)
green_shades <-
tibble(
x = seq(0, scale_factor, by = 1),
y = scale_factor/2 + 1,
fill = colorRampPalette(c("#013220", "darkgreen"))(scale_factor + 1)
)
set.seed(1234)
Формирование базы данных для елочных игрушек (шаров) и их визуализация.
# Christmas tree bubbles database
bubbles <-
crossing(
x = 1:(scale_factor*2),
y = 1:scale_factor
) |>
filter(
x %% 2 != y %% 2,
y <= x,
y <= -x + max(x)
) %>%
mutate(
x = x / 2,
shp = sample(1:6, nrow(.), replace = T),
sz = sample(seq(0.5, 1, by=0.1), nrow(.), replace = T),
color = sample(bauble_colours, nrow(.), replace = T),
)
# Let's see the bubbles in a plot
bubbles |>
ggplot(aes(x = x, y = y + 0.4, shape = factor(shp), size=sz, color = I(color))) +
geom_point() +
scale_shape_manual(values = c(20:24,8))
Построение базы данных елки с геометрическими масштабами и верхушкой. Ниже представлен график масштабов рождественской елки. Основная вычислительная нагрузка приходится на уравнение окружности x^2 + y^2 = 1: y_prime = sqrt(1 - x_prime^2).
main_shape_contour <- function(tbl) {
tbl <-
tbl |>
mutate(
y_prime = sqrt(1 - x_prime^2),
y_prime2 = ifelse(x_prime >= 0, x_prime - 1, x_prime + 1),
y_prime2 = sqrt(1 - (y_prime2)^2)-1,
x_prime = x_prime + x,
y_prime = y_prime + y,
y_prime2 = y_prime2 + y,
x_prime = x_prime / 2,
x = x / 2,
) |>
pivot_longer(contains("y_prime"), values_to = "y_prime") |>
filter(y_prime >= 1)
return(tbl)
}
main_tree <-
crossing(
x = 1:(scale_factor*2),
y = 1:scale_factor,
x_prime = seq(-1, 1 , 0.01)
) |>
filter(
x %% 2 != y %% 2,
y <= x,
y <= -x + max(x)
) %>%
mutate(
color = sample(tree_colors, nrow(.), replace = TRUE)
) %>%
main_shape_contour()
treetopper_data <-
tibble(
x = scale_factor,
y = scale_factor + 1,
x_prime = seq(-1, 1 , 0.01)
) |>
main_shape_contour() |>
crossing(
nesting(
linetype = as.factor(1:7),
color = sample(garland_reds, 7)
)
)
# Let's see the tree in a plot
main_tree |>
ggplot(aes(x_prime, y_prime, group = paste(x, y))) +
geom_polygon(aes(fill = I(color), color = I(color)))
Данная функция является наиболее сложной. Она случайным образом генерирует линию гирлянды, имитирующую чешуйки елки.
# This function plots a random gerland based on the geometry of the tree
garland <-
function(len = scale_factor * 2, resalution = 500) {
j = NULL
j[1] = 0
for (i in 1:len) {
# j[i + 1] = cumsum(j)
if ((i + sum(j)) %% 2 == 0) {
j[i + 1] = sample(c(0, 1), size = 1)
} else{
j[i + 1] = sample(c(0, -1), size = 1)
}
}
j = tail(j, -1)
data <-
tibble(
x_floor = 1:len,
y_floor = cumsum(j)
) |>
crossing(x = seq(0, 1 - 1/resalution, 1/resalution)) |>
mutate(
x = x_floor + x,
y = case_when(
(x_floor + y_floor) %% 2 == 0 ~ sqrt(1 - (x %% x_floor)^2),
(x_floor + y_floor) %% 2 == 1 ~ sqrt(1 - (x %% x_floor - 1)^2),
),
y = y + y_floor
) |>
select(x,y)
return(data)
}
# An exsample of a random garland
garland() |>
ggplot(aes(x,y)) +
geom_line()
Эта функция осуществляет многократное дублирование указанной случайной гирлянды для ее размещения по всей елке.
garland_multiplayer <-
function() {
garland(resalution = 70) |>
crossing(
nesting(
linetype = as.factor(1:7),
color = sample(garland_reds, 7)
),
nesting(
hight = seq(-scale_factor, scale_factor * 2, 2),
)
) |>
arrange(hight) |>
mutate(
y = y + hight
) |>
filter(
y > 1,
floor(y) <= floor(x),
floor(y) <= -floor(x) + max(x) - 1
) |>
mutate(x = x /2)
}
# let's see multiplied garlands
garland_multiplayer() |>
filter(linetype == "1") |>
ggplot(aes(x, y, color = I(color), group = hight)) +
geom_line()
Заключительный этап: объединение всех элементов и создание анимации.
# Combine everything together in a animation
christmas_tree_animation <-
main_tree |>
ggplot(aes(x_prime, y_prime, group = paste(x, y))) +
geom_tile(
data = green_shades,
aes(x, y, width = 1, height = scale_factor * 1.266667, fill = I(fill))
) +
geom_tile(aes(x = scale_factor/2, y = 0, width = 2, height = 2), fill = "#b22222") +
geom_polygon(aes(fill = I(color), color = I(color))) +
geom_point(
data = bubbles,
aes(x = x, y = y + 0.4, shape = factor(shp), size=sz, color = I(color)),
show.legend = F
) +
geom_line(
data = garland_multiplayer(),
aes(
x, y,
linetype = as.factor(linetype),
group = hight, color = I(color)
),
linewidth = 1.8
) +
geom_line(
data = treetopper_data,
aes(
x_prime, y_prime,
linetype = as.factor(linetype),
group = paste(x, y), color = I(color)
),
linewidth = 1
) +
labs(
title = "Merry Christmas & Happy New Year",
subtitle = NULL,
caption = "tvyal.com"
) +
scale_shape_manual(values = c(20:24,8)) +
theme_void() +
coord_fixed() +
theme(
legend.position = "drop",
plot.background = element_rect(fill="#013220"),
title = element_text(colour="white"),
plot.title = element_text(
size = 30, hjust = 0.5,
margin = margin(t = 30, unit = "pt")
),
plot.caption = element_text(
size = 14, hjust = 0.5,
margin = margin(b = 12, unit = "pt")
)
) +
transition_states(linetype, transition_length = 2, state_length = 1) +
enter_fade() +
exit_fade()
Рендеринг и сохранение анимации.
animate(
christmas_tree_animation,
nframes = 26,
width = 600,
height = 806
)
gganimate::anim_save("christmas_tree_animation.gif")
Итоговый результат: