-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmoscow.clj
112 lines (83 loc) · 5.26 KB
/
moscow.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(ns ru.lj.alamar.elegraph
(:require spiral data image util))
(def данные (read-data "data/moscow-2011-12-07/data.csv"))
(def заголовки (first данные))
(def уики (rest данные))
(defn партии [уик]
(subvec уик 19))
(def избиратели second)
(defn явка [уик]
(/ (сумма (партии уик)) (избиратели уик)))
(def максимальная-явка (apply max (map явка уики)))
(println "Максимальная явка" максимальная-явка)
; Для более равномерного распределения
(defn явка-для-окна [явка]
(Math/pow
(- максимальная-явка явка)
1.33))
(defn доля-ер [уик]
(/ (nth уик 24) (сумма (партии уик))))
(def окно-явки (окно явка-для-окна (map явка уики)))
(def окно-ер (окно identity (map доля-ер уики)))
; 60x80 cm at 300 dpi
(def ширина 6000)
(def высота 8000)
(def высота-графика 6800)
(def высота-полоски 1000)
(def фон (цвет 0xFF 0xFF 0xFF))
(def цвет-сетки (цвет 0xDD 0xDD 0xDD))
(def цвет-цифр (цвет 0x9A 0x9A 0x9A))
(def большая-сетка 5)
(def малая-сетка 3)
(def размер-шрифта 72)
(def холст (create-image ширина высота фон))
(сетка холст ширина высота-графика (/ 1 20) большая-сетка малая-сетка цвет-сетки размер-шрифта цвет-цифр окно-явки окно-ер)
(подписать холст цвет-цифр
(fn [рисунок]
(вывести-текст рисунок "программирование, идея — alamar.lj.ru" 72 (/ ширина 2) высота false true)
(вывести-текст рисунок "Голосование на участках Москвы" 112 3500 350 false false)
(вывести-текст рисунок "на выборах Государственной Думы 4 декабря 2011" 72 3500 600 false false)
(вывести-текст рисунок "явка →" 72 300 65 false false)
(вывести-текст рисунок "2500 голосов, отданные за партии:" 72 400 5000 false false)
(вывести-текст рисунок "Справедливая Россия" 72 400 5200 false false)
(вывести-текст рисунок "ЛДПР" 72 400 5400 false false)
(вывести-текст рисунок "Патриоты России" 72 400 5600 false false)
(вывести-текст рисунок "КПРФ" 72 400 5800 false false)
(вывести-текст рисунок "Яблоко" 72 400 6000 false false)
(вывести-текст рисунок "Единая Россия" 72 400 6200 false false)
(вывести-текст рисунок "Правое Дело" 72 400 6400 false false)
(повернуть рисунок)
(вывести-текст рисунок "доля голосов, отданных Единой России →" 72 200 -380 false false)))
(def шаблон (spiral))
(def цвета-партий [
(цвет 0x66 0x66 0xCC) ;; Справедливая Россия
(цвет 0xFF 0xFF 0) ;; ЛДПР
(цвет 0x9A 0x33 0x9A) ;; Патриоты России
(цвет 0xCC 0 0) ;; КПРФ
(цвет 0x33 0x99 0) ;; Яблоко
(цвет 0 0 0) ;; Единая Россия
(цвет 0x33 0x9A 0x9A) ;; Правое Дело
])
(образцы холст цвета-партий 325 5235)
(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 400 уики)]
(let [смещение
[(int (* ширина (- 1 (окно-явки (явка уик)))))
(int (* высота-графика (окно-ер (доля-ер уик))))]]
[смещение шаблон (сортировать-фракции уик)]))
[фон цвет-сетки])
(println "Запись изображения")
(save-image холст "moscow.png")