7
7
<!-- Load plotly.js into the DOM -->
8
8
< script src ="https://cdn.plot.ly/plotly-2.16.1.min.js "> </ script >
9
9
10
- < script src ="https://code.jquery.com/jquery-3.6.3.min.js "
11
- integrity ="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU= " crossorigin ="anonymous "> </ script >
10
+ < script
11
+ src ="https://code.jquery.com/jquery-3.6.3.min.js "
12
+ integrity ="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU= "
13
+ crossorigin ="anonymous "
14
+ > </ script >
12
15
13
16
< body >
14
17
< label > Election Type:</ label >
86
89
87
90
function findWinner ( cityData ) {
88
91
//rtype: winner party name
89
- var items = cityData . map ( function ( i ) { //map to ["親民黨", "4.34"]
90
- return [ i [ "candidate_party" ] , i [ 'ticket_percentage' ] ] ;
92
+ var items = cityData . map ( function ( i ) {
93
+ //map to ["親民黨", "4.34"]
94
+ return [ i [ "candidate_party" ] , i [ "ticket_percentage" ] ] ;
91
95
} ) ;
92
96
items . sort ( function ( a , b ) {
93
97
return + b [ 1 ] - + a [ 1 ] ;
110
114
}
111
115
}
112
116
113
-
114
117
async function plotWinnerMap ( title , dataByCity , candidateData ) {
115
118
let geoJson = await d3 . json ( "Taiwan_geo.json" ) ;
116
119
let cities = Array . from ( new Set ( d3 . map ( dataByCity , ( d ) => d . city ) ) ) ;
117
120
let candidateInfo = { } ;
118
121
//compatible with president and legialator-at-large
119
- let candidates = ! candidateData . columns . includes ( "candidate" ) ? Array . from ( new Set ( candidateData . map ( d => [ d [ "candidate_party" ] , d [ "candidate_party" ] ] ) ) ) : Array . from ( new Set ( candidateData . map ( d => [ d [ "candidate" ] , d [ "candidate_party" ] ] ) ) ) ;
122
+ let candidates = ! candidateData . columns . includes ( "candidate" )
123
+ ? Array . from (
124
+ new Set (
125
+ candidateData . map ( ( d ) => [
126
+ d [ "candidate_party" ] ,
127
+ d [ "candidate_party" ] ,
128
+ ] )
129
+ )
130
+ )
131
+ : Array . from (
132
+ new Set (
133
+ candidateData . map ( ( d ) => [ d [ "candidate" ] , d [ "candidate_party" ] ] )
134
+ )
135
+ ) ;
120
136
for ( let c of candidates ) {
121
- candidateInfo [ c [ 0 ] ] = { "party" : c [ 1 ] , "color" : partyColor ( c [ 1 ] ) , "winZone" : { "type" : "FeatureCollection" , "features" : [ ] } } ;
137
+ candidateInfo [ c [ 0 ] ] = {
138
+ party : c [ 1 ] ,
139
+ color : partyColor ( c [ 1 ] ) ,
140
+ winZone : { type : "FeatureCollection" , features : [ ] } ,
141
+ } ;
122
142
}
123
143
124
144
for ( let i = 0 ; i < dataByCity . length ; i += candidates . length ) {
125
145
var cityData = dataByCity . slice ( i , i + candidates . length ) ;
126
- var cityName = cityData [ 0 ] . city
146
+ var cityName = cityData [ 0 ] . city ;
127
147
var winnerParty = findWinner ( cityData ) ;
128
- var winner = Object . keys ( candidateInfo ) . find ( ( key ) => candidateInfo [ key ] [ "party" ] == winnerParty ) ;
148
+ var winner = Object . keys ( candidateInfo ) . find (
149
+ ( key ) => candidateInfo [ key ] [ "party" ] == winnerParty
150
+ ) ;
129
151
var cityGeometry = getGeometry ( geoJson , cityName ) ;
130
- candidateInfo [ winner ] [ "winZone" ] [ ' features' ] . push ( cityGeometry ) ;
152
+ candidateInfo [ winner ] [ "winZone" ] [ " features" ] . push ( cityGeometry ) ;
131
153
}
132
154
133
- var layers = [ ]
155
+ var layers = [ ] ;
134
156
for ( let candidate in candidateInfo ) {
135
157
var layer = {
136
158
sourcetype : "geojson" ,
137
159
source : candidateInfo [ candidate ] [ "winZone" ] ,
138
160
type : "fill" ,
139
- color : candidateInfo [ candidate ] [ ' color' ] ,
140
- }
141
- layers . push ( layer )
161
+ color : candidateInfo [ candidate ] [ " color" ] ,
162
+ } ;
163
+ layers . push ( layer ) ;
142
164
}
143
165
144
166
var layout = {
145
167
mapbox : {
146
168
center : { lon : 121 , lat : 23.5 } ,
147
169
zoom : 6 ,
148
170
style : "light" ,
149
- layers : layers
171
+ layers : layers ,
150
172
} ,
151
173
width : 800 ,
152
174
height : 800 ,
153
- title : title
175
+ title : title ,
176
+ colorway : [
177
+ "#f3cec9" ,
178
+ "#e7a4b6" ,
179
+ "#cd7eaf" ,
180
+
181
+ ] ,
154
182
} ;
155
183
156
184
var config = {
159
187
} ;
160
188
161
189
//todo: draw legeng in map ?
162
- Plotly . newPlot ( "map" , [
163
- {
164
- type : "scattermapbox" ,
165
- lat : [ 46 ] ,
166
- lon : [ - 74 ] ,
167
- } ,
168
- ] , layout , config ) ;
190
+ Plotly . newPlot (
191
+ "map" ,
192
+ [
193
+ {
194
+ type : "scattermapbox" ,
195
+ lat : [ 46 ] ,
196
+ lon : [ - 74 ] ,
197
+ } ,
198
+ ] ,
199
+ layout ,
200
+ config
201
+ ) ;
169
202
}
170
203
</ script >
171
204
172
205
< script >
173
206
$ ( "#electionType" ) . on ( "change" , function ( e ) {
174
- let electionType = document . getElementById ( "electionType" ) . value
207
+ let electionType = document . getElementById ( "electionType" ) . value ;
175
208
let selectedFiles = files [ electionType ] ;
176
209
let year = + document . getElementById ( "year" ) . value ;
177
210
//redraw here ...
178
211
if ( electionType == "president" ) presidentPlot ( selectedFiles , year ) ;
179
- if ( electionType == "legislator-at-large" ) legislatoratlargePlot ( selectedFiles , year ) ;
212
+ if ( electionType == "legislator-at-large" )
213
+ legislatoratlargePlot ( selectedFiles , year ) ;
180
214
// other election type ...
181
215
} ) ;
182
216
$ ( "#year" ) . on ( "change" , function ( e ) {
183
- let electionType = document . getElementById ( "electionType" ) . value
217
+ let electionType = document . getElementById ( "electionType" ) . value ;
184
218
let selectedFiles = files [ electionType ] ;
185
219
let year = + document . getElementById ( "year" ) . value ;
186
220
//redraw here ...
187
221
if ( electionType == "president" ) presidentPlot ( selectedFiles , year ) ;
188
- if ( electionType == "legislator-at-large" ) legislatoratlargePlot ( selectedFiles , year ) ;
222
+ if ( electionType == "legislator-at-large" )
223
+ legislatoratlargePlot ( selectedFiles , year ) ;
189
224
// other election type ...
190
225
} ) ;
191
226
195
230
let dataByCity = await d3 . csv ( files [ year ] . by_city ) ;
196
231
let candidateData = await d3 . csv ( files [ year ] . candidate ) ;
197
232
//draw winner map
198
- plotWinnerMap ( '2020' , dataByCity , candidateData ) ;
233
+ let title =
234
+ "Majorities in Taiwan cities of the " + year + " presidential election" ;
235
+ plotWinnerMap ( title , dataByCity , candidateData ) ;
199
236
}
200
237
201
238
async function legislatoratlargePlot ( files , year ) {
202
- console . log ( "hi" )
203
239
let dataByNation = await d3 . csv ( files [ year ] . by_nation ) ;
204
240
let dataByCity = await d3 . csv ( files [ year ] . by_city ) ;
205
241
let candidateData = await d3 . csv ( files [ year ] . candidate ) ;
206
242
//draw winner map
207
- plotWinnerMap ( '2020' , dataByCity , candidateData ) ;
243
+ let title =
244
+ "Majorities in Taiwan cities of the " +
245
+ year +
246
+ " legislator at large election" ;
247
+ plotWinnerMap ( title , dataByCity , candidateData ) ;
208
248
}
209
249
210
250
presidentPlot ( files [ "president" ] , 2016 ) ;
211
- </ script >
251
+ </ script >
0 commit comments