Наткнулась на пост в линкедине, где автор (профессор Nuno Sepúlveda) интересовался, из какого распределения пришел дорожный знак лежачий полицейский. Мне показалось забавным и я воспроизвела код для этого знака, а еще попробовала собрать знак “Неровная дорога” в R, опираясь на похожую идею.

Рисуем знак лежачего полицейского

library(truncdist) # для создания truncated (усеченных) распределений
x <- seq(-1.5, 1.5, 0.01)
y <- 0.35 * dtrunc(x, spec='norm', a = -1.5, b = 1.5, sd = 0.35) + 0.65 * dunif(x, -1.5, 1.5)
# y <- 0.35 * dnorm(x, sd = 0.35) + 0.65 * dunif(x, -1.5, 1.5)

plot(x,y,type='n', ylim=c(-0.25,4.5), xlim=c(-3,3), axes=F, xlab='', ylab='') # to create empty space
polygon(c(-2.5,0,2.5,-2.5), c(-0.05,-0.05+sqrt(5^2-2.5^2), -0.05,-0.05), col='red', border=NA) # outer red triangle

leng <- 1.95
polygon(c(-leng,0,leng,-leng), c(0,sqrt((2*leng)^2-leng^2),0,0)+0.275, col='orange', border=NA) # inner triangle

polygon(c(x,x[length(x)],x[1]), c(y,0,0)+0.5,col='black') # our distribution

Я немного упростила код относительно исходного поста, проверила, что ничего не поменялось (убрала избыточный sapply). Основная идея при создании знака в генерации y как суммы нормального и равномерного распределения, чтобы получились более “тяжелые” хвосты.

Сравните с источником

Рисуем знак “Неровная дорога”

Мне понравилась идея создавать знаки в R, поэтому я решила попробовать воспроизвести знак неровная дорога.

Знак “Неровная дорога”

Как думаете, какое распределение нужно взять?

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

# left part of sign
x1 <- seq(-1.6, 0, 0.01)
y1 <- 0.5 * dtrunc(x1, spec='norm', a=-1.8, b=0, mean = -1.8/2, sd = 0.45)+
  0.4*dunif(x1,-1.8,0)

# right part of sign
x2 <- seq(0.01, 1.6, 0.01)
y2 <- 0.5 * dtrunc(x2, spec='norm', a=0, b=1.8, mean = 1.8/2, sd = 0.45)+
  0.4*dunif(x2,0,1.8)

# combine both parts
y <- c(y1, y2)
x <- c(x1, x2)

plot(x, y, type='n', ylim=c(-0.25,5),xlim=c(-3,3),axes=F,xlab='',ylab='') #empty space

polygon(c(-2.5,0,2.5,-2.5), 
        c(-0.05,-0.05 + sqrt(5^2-2.5^2), -0.05,-0.05), col = 'red', border = 'gray10') # outer red triangle

leng <- 1.95

polygon(c(-leng,0,leng,-leng), c(0,sqrt((2*leng)^2-leng^2),0,0)+0.275, col='white', border=NA) # inner white triangle
polygon(c(x,x[length(x)],x[1]),c(y,0,0)+0.5,col='black') # our distribution

Вроде получилось похоже на искомый знак.

Подписывайтесь на телеграм канал, будет много интересного!