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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
%= javascript begin
function show_bargraph(datasource, title, xlab, ylab) {
var margin = {top: 40, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var formatPercent = d3.format(".0%");
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .1);
var y = d3.scale.linear()
.range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
// .tickFormat(formatPercent);
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
return "<strong>Frequency:</strong> <span style='color:red'>" + d.y + "</span>";
})
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
svg.call(tip);
d3.tsv(datasource, type, function(error, data) {
if (error) console.warn(error);
x.domain(data.map(function(d) { return d.x; }));
y.domain([0, d3.max(data, function(d) { return d.y; })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("x", width / 2)
.attr("y", 30)
.style("text-anchor", "middle")
.text(xlab);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text(ylab);
svg.append("text")
.attr("x", (width / 2))
.attr("y", 0 - (margin.top / 2))
.attr("text-anchor", "middle")
.style("font-size", "16px")
.style("text-decoration", "underline")
.text(title);
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.x); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.y); })
.attr("height", function(d) { return height - y(d.y); })
.on('mouseover', tip.show)
.on('mouseout', tip.hide)
});
function type(d) {
d.y = +d.y;
return d;
}
}
show_bargraph('/2ddata.tsv?aggregate=hour&metric=delay', 'Durchschnittliche Verspätung nach Uhrzeit',
'Angebrochene Stunde', 'Minuten');
show_bargraph('/2ddata.tsv?aggregate=hour&metric=cancel_percent', 'Anteil Zugausfälle nach Uhrzeit',
'Angebrochene Stunde', 'Ausfälle [%]');
show_bargraph('/2ddata.tsv?aggregate=weekday&metric=delay', 'Durchschnittliche Verspätung nach Wochentag',
'Wochentag', 'Minuten');
show_bargraph('/2ddata.tsv?aggregate=weekday&metric=cancel_percent', 'Anteil Zugausfälle nach Wochentag',
'Wochentag', 'Ausfälle [%]');
show_bargraph('/2ddata.tsv?aggregate=weekhour&metric=delay', 'Durchschnittliche Verspätung nach Wochentag und Uhrzeit',
'Tag/Stunde', 'Minuten');
show_bargraph('/2ddata.tsv?aggregate=line&metric=delay', 'Durchschnittliche Verspätung nach Linie',
'Typ', 'Minuten');
show_bargraph('/2ddata.tsv?aggregate=line&metric=cancel_percent', 'Anteil Zugausfälle nach Linie',
'typ', 'Ausfälle [%]');
show_bargraph('/2ddata.tsv?aggregate=train_type&metric=delay', 'Durchschnittliche Verspätung nach Zugtyp',
'Typ', 'Minuten');
show_bargraph('/2ddata.tsv?aggregate=train_type&metric=cancel_percent', 'Anteil Zugausfälle nach Zugtyp',
'typ', 'Ausfälle [%]');
msglist = [[2, 'Polizeiliche Ermittlung'],
[3, 'Feuerwehreinsatz neben der Strecke'],
[5, 'Aerztliche Versorgung eines Fahrgastes'],
[6, 'Betaetigen der Notbremse'],
[7, 'Personen im Gleis'],
[8, 'Notarzteinsatz am Gleis'],
[9, 'Streikauswirkungen'],
[10, 'Ausgebrochene Tiere im Gleis'],
[11, 'Unwetter'],
[13, 'Pass- und Zollkontrolle'],
[15, 'Beeintraechtigung durch Vandalismus'],
[16, 'Entschaerfung einer Fliegerbombe'],
[17, 'Beschaedigung einer Bruecke'],
[18, 'Umgestuerzter Baum im Gleis'],
[19, 'Unfall an einem Bahnuebergang'],
[20, 'Tiere im Gleis'],
[21, 'Warten auf weitere Reisende'],
[22, 'Witterungsbedingte Stoerung'],
[23, 'Feuerwehreinsatz auf Bahngelaende'],
[24, 'Verspaetung aus dem Ausland'],
[25, 'Warten auf verspaetete Zugteile'],
[28, 'Gegenstaende im Gleis'],
[31, 'Bauarbeiten'],
[32, 'Verzoegerung beim Ein-/Ausstieg'],
[33, 'Oberleitungsstoerung'],
[34, 'Signalstoerung'],
[35, 'Streckensperrung'],
[36, 'Technische Stoerung am Zug'],
[38, 'Technische Stoerung an der Strecke'],
[39, 'Anhaengen von zusaetzlichen Wagen'],
[40, 'Stellwerksstoerung/-ausfall'],
[41, 'Stoerung an einem Bahnuebergang'],
[42, 'Ausserplanmaessige Geschwindigkeitsbeschraenkung'],
[43, 'Verspaetung eines vorausfahrenden Zuges'],
[44, 'Warten auf einen entgegenkommenden Zug'],
[45, 'Ueberholung durch anderen Zug'],
[46, 'Warten auf freie Einfahrt'],
[47, 'Verspaetete Bereitstellung'],
[48, 'Verspaetung aus vorheriger Fahrt'],
[55, 'Technische Stoerung an einem anderen Zug'],
[56, 'Warten auf Fahrgaeste aus einem Bus'],
[57, 'Zusaetzlicher Halt'],
[58, 'Umleitung'],
[59, 'Schnee und Eis'],
[60, 'Reduzierte Geschwindigkeit wegen Sturm'],
[61, 'Tuerstoerung']];
for (msg in msglist) {
show_bargraph('/2ddata.tsv?aggregate=hour&metric=message_percent&msgnum=' + msg[0],
'Anteil "'+msg[1]+'"', 'Angebrochene Stunde', '%');
show_bargraph('/2ddata.tsv?aggregate=weekday&metric=message_percent&msgnum=' + msg[0],
'Anteil "'+msg[1]+'"', 'Wochentag', '%');
}
show_bargraph('/2ddata.tsv?aggregate=hour&metric=message_percent&msgnum=80',
'Anteil "Abweichende Wagenreihung"', 'Angebrochene Stunde', '%');
show_bargraph('/2ddata.tsv?aggregate=weekday&metric=message_percent&msgnum=80',
'Anteil "Abweichende Wagenreihung"', 'Wochentag', '%');
show_bargraph('/2ddata.tsv?aggregate=hour&metric=message_percent&msgnum=85',
'Anteil "Ein Wagen fehlt"', 'Angebrochene Stunde', '%');
show_bargraph('/2ddata.tsv?aggregate=weekday&metric=message_percent&msgnum=85',
'Anteil "Ein Wagen fehlt"', 'Wochentag', '%');
% end
<div>
Insgesamt: <%= stash('num_departures') %> Züge.
</div>
|