-
Notifications
You must be signed in to change notification settings - Fork 1
/
primorye.clj
96 lines (70 loc) · 4.86 KB
/
primorye.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
(ns ru.lj.alamar.elegraph
(:require spiral data image util))
(def данные (read-data "data/primorye-2018-12-16/data.csv"))
(def заголовки (first данные))
(def уики (rest данные))
(defn фракции [уик]
[(nth уик 14) (nth уик 13) (nth уик 15) (nth уик 16)])
(def избиратели second)
(defn явка [уик]
(/ (сумма (фракции уик)) (избиратели уик)))
(defn доля-ер [уик]
(/ (nth уик 14) (сумма (фракции уик))))
(def окно-явки (окно (fn [x] (- 1 x)) (map явка уики)))
(def окно-ер (окно (fn [x] (Math/pow x 1.5)) (map доля-ер уики)))
; 60x80 cm at 300 dpi
(def ширина 2560)
(def высота 3640)
(def высота-графика 3400)
(def высота-полоски 200)
(def фон (цвет 0xFF 0xFF 0xFF))
(def цвет-сетки (цвет 0xDD 0xDD 0xDD))
(def цвет-цифр (цвет 0x9A 0x9A 0x9A))
(def большая-сетка 3)
(def малая-сетка 2)
(def размер-шрифта 36)
(def холст (create-image ширина высота фон))
(сетка холст ширина высота-графика (/ 1 20) большая-сетка малая-сетка цвет-сетки размер-шрифта цвет-цифр окно-явки окно-ер)
(подписать холст цвет-цифр
(fn [рисунок]
(вывести-текст рисунок "программирование, идея — alamar.lj.ru" 24 (/ ширина 2) (+ высота 10) false true)
(вывести-текст рисунок "Голосование на участках Приморского края" 48 1295 30 false false)
(вывести-текст рисунок "на повторных выборах Губернатора 16 декабря 2018" размер-шрифта 1385 140 false false)
(вывести-текст рисунок "явка →" размер-шрифта 170 35 false false)
(вывести-текст рисунок "200 голосов, отданные за кандидатов:" размер-шрифта 1660 250 false false)
(вывести-текст рисунок "Кожемяко Олега Николаевича" размер-шрифта 1660 340 false false)
(вывести-текст рисунок "Андрейченко Андрея Валерьевича" размер-шрифта 1660 420 false false)
(вывести-текст рисунок "Тимченко Алексея Павловича" размер-шрифта 1660 500 false false)
(вывести-текст рисунок "Чемерис Розы Басировны" размер-шрифта 1660 580 false false)
(повернуть рисунок)
(вывести-текст рисунок "доля голосов, отданных Кожемяко →" размер-шрифта 130 -160 false false)))
(def шаблон (spiral))
(def цвета-фракций [
(цвет 0 0 0) ;; Кожемяко
(цвет 0xEE 0xBB 0x11) ;; Андрейченко
(цвет 0x66 0x66 0xCC) ;; Тимченко
(цвет 0xCC 0 0) ;; Чемерис
])
(образцы холст цвета-фракций 1630 365 20)
(defn упорядочить-фракции [уик]
(zip (фракции уик) цвета-фракций))
(defn сортировать-фракции [уик]
(reverse (sort-by first (упорядочить-фракции уик))))
; (doseq [уик уики]
; (println (first уик) "явка" (float (явка уик)) "доля Собянина" (float (доля-ер уик))
; "окно" (float (window-weight (явка-для-окна уик) окно-явки)) (float (window-weight (доля-ер уик) окно-ер))))
(полоска холст высота-графика высота-полоски
(for [уик уики]
(let [смещение (int (* ширина (- 1 (окно-явки (явка уик)))))]
[смещение (упорядочить-фракции уик)])))
(сетка-для-полоски холст ширина высота-графика высота-полоски большая-сетка цвет-сетки (/ 1 20) окно-явки (/ 1 10) (окно identity [0 1]))
(println "Полоска нарисована")
(нанести холст 0 [ширина высота]
(for [уик (take 10000 уики)]
(let [смещение
[(int (* ширина (- 1 (окно-явки (явка уик)))))
(int (* высота-графика (окно-ер (доля-ер уик))))]]
[смещение шаблон (сортировать-фракции уик)]))
[фон цвет-сетки])
(println "Запись изображения")
(save-image холст "primorye.png")