Skip to content

Instantly share code, notes, and snippets.

@laurenancona
Forked from kerryrodden/.block
Last active August 29, 2015 14:19
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save laurenancona/da77c7d19f1b73185e92 to your computer and use it in GitHub Desktop.
Save laurenancona/da77c7d19f1b73185e92 to your computer and use it in GitHub Desktop.

This example shows how it is possible to use a D3 sunburst visualization (partition layout) with data that describes sequences of events.

A good use case is to summarize navigation paths through a web site, as in the sample synthetic data file (visit_sequences.csv). The visualization makes it easy to understand visits that start directly on a product page (e.g. after landing there from a search engine), compared to visits where users arrive on the site's home page and navigate from there. Where a funnel lets you understand a single pre-selected path, this allows you to see all possible paths.

Features:

  • works with data that is in a CSV format (you don't need to pre-generate a hierarchical JSON file, unless your data file is very large)
  • interactive breadcrumb trail helps to emphasize the sequence, so that it is easy for a first-time user to understand what they are seeing
  • percentages are shown explicitly, to help overcome the distortion of the data that occurs when using a radial presentation

If you want to simply reuse this with your own data, here are some tips for generating the CSV file:

  • no header is required (but it's OK if one is present)
  • use a hyphen to separate the steps in the sequence
  • the step names should be one word only, and ideally should be kept short. Non-alphanumeric characters will probably cause problems (I haven't tested this).
  • every sequence should have an "end" marker as the last element, unless it has been truncated because it is longer than the maximum sequence length (6, in the example). The purpose of the "end" marker is to distinguish a true end point (e.g. the user left the site) from an end point that has been forced by truncation.
  • each line should be a complete path from root to leaf - don't include counts for intermediate steps. For example, include "home-search-end" and "home-search-product-end" but not "home-search" - the latter is computed by the partition layout, by adding up the counts of all the sequences with that prefix.
  • to keep the number of permutations low, use a small number of unique step names, and a small maximum sequence length. Larger numbers of either of these will lead to a very large CSV that will be slow to process (and therefore require pre-processing into hierarchical JSON).

I created this example in my work at Google, but it is not part of any Google product. It is covered by the Apache license:

Copyright 2013 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Sequences sunburst</title>
<script src="http://d3js.org/d3.v3.min.js"></script>
<link rel="stylesheet" type="text/css"
href="https://fonts.googleapis.com/css?family=Open+Sans:400,600">
<link rel="stylesheet" type="text/css" href="sequences.css"/>
</head>
<body>
<div id="main">
<div id="sequence"></div>
<div id="chart">
<div id="explanation" style="visibility: hidden;">
<span id="percentage"></span><br/>
of visits begin with this sequence of pages
</div>
</div>
</div>
<div id="sidebar">
<input type="checkbox" id="togglelegend"> Legend<br/>
<div id="legend" style="visibility: hidden;"></div>
</div>
<script type="text/javascript" src="sequences.js"></script>
<script type="text/javascript">
// Hack to make this example display correctly in an iframe on bl.ocks.org
d3.select(self.frameElement).style("height", "700px");
</script>
</body>
</html>
body {
font-family: 'Open Sans', sans-serif;
font-size: 12px;
font-weight: 400;
background-color: #fff;
width: 960px;
height: 700px;
margin-top: 10px;
}
#main {
float: left;
width: 750px;
}
#sidebar {
float: right;
width: 100px;
}
#sequence {
width: 700px;
height: 70px;
fill: #666;
}
#legend {
padding: 10px 0 0 3px;
fill: #666;
}
#sequence text, #legend text {
font-weight: 600;
fill: #fff;
}
#chart {
position: relative;
}
#chart path {
stroke: #fff;
fill: #666;
}
#explanation {
position: absolute;
top: 260px;
left: 305px;
width: 140px;
text-align: center;
color: #666;
z-index: -1;
}
#percentage {
font-size: 2.5em;
}
// Dimensions of sunburst.
var width = 750;
var height = 600;
var radius = Math.min(width, height) / 2;
// Breadcrumb dimensions: width, height, spacing, width of tip/tail.
var b = {
w: 125, h: 30, s: 3, t: 10
};
// Mapping of step names to colors.
var colors = {
"revenue": "#E4002B",
"pages": "#027EA4",
"default": "#B5BD00",
"paymentcenter": "#FF530D",
"personnel": "#1B3B56",
"prisons": "#3497B6",
"not set": "#bbbbbb",
"other": "#666"
};
// Total size of all segments; we set this later, after loading the data.
var totalSize = 0;
var vis = d3.select("#chart").append("svg:svg")
.attr("width", width)
.attr("height", height)
.append("svg:g")
.attr("id", "container")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var partition = d3.layout.partition()
.size([2 * Math.PI, radius * radius])
.value(function(d) { return d.size; });
var arc = d3.svg.arc()
.startAngle(function(d) { return d.x; })
.endAngle(function(d) { return d.x + d.dx; })
.innerRadius(function(d) { return Math.sqrt(d.y); })
.outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });
// Use d3.text and d3.csv.parseRows so that we do not need to have a header
// row, and can receive the csv as an array of arrays.
d3.text("visit-sequences.csv", function(text) {
var csv = d3.csv.parseRows(text);
var json = buildHierarchy(csv);
createVisualization(json);
console.log(csv);
});
// Main function to draw and set up the visualization, once we have the data.
function createVisualization(json) {
// Basic setup of page elements.
initializeBreadcrumbTrail();
drawLegend();
d3.select("#togglelegend").on("click", toggleLegend);
// Bounding circle underneath the sunburst, to make it easier to detect
// when the mouse leaves the parent g.
vis.append("svg:circle")
.attr("r", radius)
.style("opacity", 0);
// For efficiency, filter nodes to keep only those large enough to see.
var nodes = partition.nodes(json)
.filter(function(d) {
return (d.dx > 0.005); // 0.005 radians = 0.29 degrees
});
var path = vis.data([json]).selectAll("path")
.data(nodes)
.enter().append("svg:path")
.attr("display", function(d) { return d.depth ? null : "none"; })
.attr("d", arc)
.attr("fill-rule", "evenodd")
.style("fill", function(d) { return colors[d.name]; })
.style("opacity", 1)
.on("mouseover", mouseover);
// Add the mouseleave handler to the bounding circle.
d3.select("#container").on("mouseleave", mouseleave);
// Get total size of the tree = value of root node from partition.
totalSize = path.node().__data__.value;
};
// Fade all but the current sequence, and show it in the breadcrumb trail.
function mouseover(d) {
var percentage = (100 * d.value / totalSize).toPrecision(3);
var percentageString = percentage + "%";
if (percentage < 0.1) {
percentageString = "< 0.1%";
}
d3.select("#percentage")
.text(percentageString);
d3.select("#explanation")
.style("visibility", "");
var sequenceArray = getAncestors(d);
updateBreadcrumbs(sequenceArray, percentageString);
// Fade all the segments.
d3.selectAll("path")
.style("opacity", 0.3);
// Then highlight only those that are an ancestor of the current segment.
vis.selectAll("path")
.filter(function(node) {
return (sequenceArray.indexOf(node) >= 0);
})
.style("opacity", 1);
}
// Restore everything to full opacity when moving off the visualization.
function mouseleave(d) {
// Hide the breadcrumb trail
d3.select("#trail")
.style("visibility", "hidden");
// Deactivate all segments during transition.
d3.selectAll("path").on("mouseover", null);
// Transition each segment to full opacity and then reactivate it.
d3.selectAll("path")
.transition()
.duration(1000)
.style("opacity", 1)
.each("end", function() {
d3.select(this).on("mouseover", mouseover);
});
d3.select("#explanation")
.style("visibility", "hidden");
}
// Given a node in a partition layout, return an array of all of its ancestor
// nodes, highest first, but excluding the root.
function getAncestors(node) {
var path = [];
var current = node;
while (current.parent) {
path.unshift(current);
current = current.parent;
}
return path;
}
function initializeBreadcrumbTrail() {
// Add the svg area.
var trail = d3.select("#sequence").append("svg:svg")
.attr("width", width)
.attr("height", 50)
.attr("id", "trail");
// Add the label at the end, for the percentage.
trail.append("svg:text")
.attr("id", "endlabel")
.style("fill", "#666");
}
// Generate a string that describes the points of a breadcrumb polygon.
function breadcrumbPoints(d, i) {
var points = [];
points.push("0,0");
points.push(b.w + ",0");
points.push(b.w + b.t + "," + (b.h / 2));
points.push(b.w + "," + b.h);
points.push("0," + b.h);
if (i > 0) { // Leftmost breadcrumb; don't include 6th vertex.
points.push(b.t + "," + (b.h / 2));
}
return points.join(" ");
}
// Update the breadcrumb trail to show the current sequence and percentage.
function updateBreadcrumbs(nodeArray, percentageString) {
// Data join; key function combines name and depth (= position in sequence).
var g = d3.select("#trail")
.selectAll("g")
.data(nodeArray, function(d) { return d.name + d.depth; });
// Add breadcrumb and label for entering nodes.
var entering = g.enter().append("svg:g");
entering.append("svg:polygon")
.attr("points", breadcrumbPoints)
.style("fill", function(d) { return colors[d.name]; });
entering.append("svg:text")
.attr("x", (b.w + b.t) / 2)
.attr("y", b.h / 2)
.attr("dy", "0.35em")
.attr("text-anchor", "middle")
.text(function(d) { return d.name; });
// Set position for entering and updating nodes.
g.attr("transform", function(d, i) {
return "translate(" + i * (b.w + b.s) + ", 0)";
});
// Remove exiting nodes.
g.exit().remove();
// Now move and update the percentage at the end.
d3.select("#trail").select("#endlabel")
.attr("x", (nodeArray.length + 0.5) * (b.w + b.s))
.attr("y", b.h / 2)
.attr("dy", "0.35em")
.attr("text-anchor", "middle")
.text(percentageString);
// Make the breadcrumb trail visible, if it's hidden.
d3.select("#trail")
.style("visibility", "");
}
function drawLegend() {
// Dimensions of legend item: width, height, spacing, radius of rounded rect.
var li = {
w: 125, h: 30, s: 3, r: 3
};
var legend = d3.select("#legend").append("svg:svg")
.attr("width", li.w)
.attr("height", d3.keys(colors).length * (li.h + li.s));
var g = legend.selectAll("g")
.data(d3.entries(colors))
.enter().append("svg:g")
.attr("transform", function(d, i) {
return "translate(0," + i * (li.h + li.s) + ")";
});
g.append("svg:rect")
.attr("rx", li.r)
.attr("ry", li.r)
.attr("width", li.w)
.attr("height", li.h)
.style("fill", function(d) { return d.value; });
g.append("svg:text")
.attr("x", li.w / 2)
.attr("y", li.h / 2)
.attr("dy", "0.35em")
.attr("text-anchor", "middle")
.text(function(d) { return d.key; });
}
function toggleLegend() {
var legend = d3.select("#legend");
if (legend.style("visibility") == "hidden") {
legend.style("visibility", "");
} else {
legend.style("visibility", "hidden");
}
}
// Take a 2-column CSV and transform it into a hierarchical structure suitable
// for a partition layout. The first column is a sequence of step names, from
// root to leaf, separated by hyphens. The second column is a count of how
// often that sequence occurred.
function buildHierarchy(csv) {
var root = {"name": "root", "children": []};
for (var i = 0; i < csv.length; i++) {
var sequence = csv[i][0];
var size = +csv[i][1];
if (isNaN(size)) { // e.g. if this is a header row
continue;
}
var parts = sequence.split("-");
var currentNode = root;
for (var j = 0; j < parts.length; j++) {
var children = currentNode["children"];
var nodeName = parts[j];
var childNode;
if (j + 1 < parts.length) {
// Not yet at the end of the sequence; move down the tree.
var foundChild = false;
for (var k = 0; k < children.length; k++) {
if (children[k]["name"] == nodeName) {
childNode = children[k];
foundChild = true;
break;
}
}
// If we don't already have a child node for this branch, create it.
if (!foundChild) {
childNode = {"name": nodeName, "children": []};
children.push(childNode);
}
currentNode = childNode;
} else {
// Reached the end of the sequence; create a leaf node.
childNode = {"name": nodeName, "size": size};
children.push(childNode);
}
}
}
return root;
};
revenue-revenue-revenue 129869
prisons-prisons-prisons 14419
default-not set-default 13929
pages-not set-pages 13321
pages-pages-pages 11115
default-default-default 9575
pages-revenue-revenue 8773
pages-revenue-revenue 8758
paymentcenter-paymentcenter-paymentcenter 7118
property-property-property 6181
personnel-personnel-personnel 5925
personnel-personnel-personnel 5644
default-revenue-revenue 5586
paymentcenter-paymentcenter-paymentcenter 5396
pages-paymentcenter-paymentcenter 5199
pages-paymentcenter-paymentcenter 4950
paymentcenter-paymentcenter-paymentcenter 4930
pages-paymentcenter-pages 4917
pages-paymentcenter-paymentcenter 4809
revenue-revenue-revenue 4523
pages-personnel-personnel 4394
pages-personnel-personnel 4182
pages-personnel-pages 4008
zoningarchive-zoningarchive-zoningarchive 3023
revenue-revenue-revenue 2853
pages-opa-default 2716
revenue-not set-revenue 2550
opa-default-default 2417
personnel-personnel-personnel 2404
pages-opa-pages 2383
brt-brt-brt 2357
brt-brt-default 2352
personnel-not set-personnel 2332
pages-opa-opa 2312
brt-brt-brt 2297
revenue-not set-revenue 2284
brt-brt-revenue 2254
opa-default-opa 2226
revenue-not set-revenue 2173
pages-opa-revenue 2090
opa-opa-default 2042
revenue-revenue-revenue 2028
opa-opa-opa 1970
opa-opa-opa 1966
revenue-revenue-revenue 1890
pages-revenue-pages 1837
revenue-not set-revenue 1834
opa-default-revenue 1729
paymentcenter-paymentcenter-paymentcenter 1701
revenue-revenue-paymentcenter 1671
health-health-health 1668
pages-residents-revenue 1648
revenue-revenue-revenue 1634
revenue-revenue-revenue 1627
brt-default-default 1623
revenue-not set-revenue 1621
default-revenue-default 1619
pages-revenue-pages 1609
paymentcenter-paymentcenter-paymentcenter 1590
revenue-revenue-revenue 1585
pages-pages-revenue 1578
opa-opa-revenue 1573
pages-revenue-revenue 1567
revenue-revenue-revenue 1553
revenue-revenue-revenue 1546
paymentcenter-paymentcenter-paymentcenter 1524
brt-default-brt 1481
pages-revenue-revenue 1475
paymentcenter-paymentcenter-paymentcenter 1453
pages-personnel-personnel 1434
brt-not set-brt 1427
revenue-revenue-paymentcenter 1394
revenue-revenue-revenue 1390
prisons-prisons-prisons 1368
pages-revenue-pages 1347
revenue-revenue-revenue 1342
revenue-revenue-revenue 1325
revenue-revenue-paymentcenter 1324
opa-default-default 1278
pages-li-li 1260
revenue-revenue-revenue 1258
revenue-paymentcenter-paymentcenter 1254
opa-default-opa 1248
pages-opa-opa 1244
revenue-revenue-revenue 1212
revenue-revenue-revenue 1206
revenue-revenue-default 1187
prisons-prisons-prisons 1176
revenue-revenue-revenue 1167
pages-pages-pages 1162
water-revenue-revenue 1144
personnel-personnel-personnel 1141
revenue-paymentcenter-paymentcenter 1138
brt-default-revenue 1133
revenue-revenue-paymentcenter 1125
prisons-prisons-prisons 1115
paymentcenter-paymentcenter-paymentcenter 1114
revenue-not set-revenue 1110
opa-default-revenue 1078
pages-pages-pages 1046
parksandrecreation-not set-parksandrecreation 1035
water-revenue-water 1026
revenue-paymentcenter-revenue 1020
revenue-revenue-revenue 1017
revenue-paymentcenter-paymentcenter 1014
paymentcenter-not set-paymentcenter 1001
personnel-personnel-personnel 969
pages-residents-residents 965
water-revenue-paymentcenter 932
revenue-revenue-revenue 926
pages-li-pages 925
residents-revenue-revenue 922
bikeshare-not set-bikeshare 917
revenue-revenue-revenue 896
pages-residents-pages 878
brt-revenue-revenue 874
revenue-revenue-revenue 854
revenue-revenue-revenue 842
prisons-not set-prisons 836
water-revenue-paymentcenter 836
revenue-not set-revenue 834
paymentcenter-paymentcenter-paymentcenter 833
personnel-personnel-personnel 833
revenue-revenue-revenue 811
default-default-revenue 793
revenue-not set-revenue 776
revenue-revenue-revenue 761
water-paymentcenter-paymentcenter 759
revenue-revenue-revenue 758
revenue-revenue-revenue 752
revenue-revenue-revenue 742
health-health-health 738
li-li-li 738
revenue-revenue-revenue 738
personnel-personnel-personnel 737
revenue-revenue-revenue 733
water-revenue-paymentcenter 733
revenue-not set-revenue 729
revenue-revenue-revenue 725
revenue-revenue-paymentcenter 725
revenue-revenue-revenue 720
water-paymentcenter-paymentcenter 715
revenue-revenue-revenue 713
revenue-revenue-revenue 709
revenue-revenue-revenue 708
revenue-revenue-revenue 707
records-not set-records 699
revenue-revenue-revenue 695
revenue-revenue-paymentcenter 694
revenue-revenue-revenue 689
revenue-revenue-revenue 688
revenue-revenue-revenue 661
water-not set-water 658
water-paymentcenter-paymentcenter 652
revenue-revenue-revenue 649
revenue-revenue-revenue 639
residents-not set-residents 637
waterrev-not set-waterrev 628
revenue-not set-revenue 619
revenue-revenue-paymentcenter 618
revenue-revenue-pages 614
revenue-revenue-revenue 609
water-paymentcenter-water 608
revenue-revenue-revenue 603
revenue-revenue-revenue 600
prisons-not set-prisons 598
revenue-revenue-revenue 594
pages-paymentcenter-revenue 592
personnel-not set-personnel 589
health-not set-health 582
paymentcenter-paymentcenter-paymentcenter 581
revenue-revenue-revenue 579
personnel-not set-personnel 571
health-health-health 560
311-not set-311 558
li-not set-li 557
pages-topics-topics 554
revenue-revenue-revenue 549
revenue-revenue-revenue 546
revenue-revenue-revenue 545
revenue-revenue-revenue 541
water-not set-water 540
wills-not set-wills 538
dhs-not set-dhs 532
phillylmsprod-phillylmsprod-phillylmsprod 531
phillylmsprod-phillylmsprod-phillylmsprod 531
paymentcenter-paymentcenter-paymentcenter 526
revenue-revenue-revenue 509
revenue-revenue-revenue 507
pages-revenue-paymentcenter 505
revenue-revenue-opa 504
prisons-not set-prisons 503
revenue-revenue-revenue 502
li-revenue-revenue 499
brt-brt-brt 495
pages-revenue-revenue 495
311-311-311 490
pages-ivrtoweb-ivrtoweb 490
water-revenue-revenue 490
revenue-revenue-revenue 489
personnel-personnel-personnel 488
pages-topics-pages 486
li-not set-li 482
ethicsboard-ethicsboard-ethicsboard 474
parksandrecreation-parksandrecreation-parksandrecreation 474
youthprograms-not set-youthprograms 474
health-health-health 472
revenue-revenue-revenue 466
health-health-health 465
residents-residents-residents 463
parksandrecreation-not set-parksandrecreation 461
pages-paymentcenter-paymentcenter 460
ivrtoweb-ivrtoweb-ivrtoweb 457
revenue-revenue-revenue 453
revenue-revenue-revenue 446
revenue-revenue-revenue 442
water-revenue-revenue 438
revenue-revenue-revenue 434
revenue-revenue-revenue 434
revenue-revenue-revenue 433
dhs-dhs-dhs 431
li-li-li 430
health-health-health 426
revenue-revenue-revenue 426
health-health-health 422
li-li-li 421
li-li-li 420
pages-revenue-revenue 419
waterrev-waterrev-waterrev 415
youthprograms-youthprograms-youthprograms 412
water-water-water 410
pages-revenue-revenue 409
personnel-personnel-personnel 406
prisons-prisons-prisons 404
revenue-revenue-revenue 399
youthprograms-youthprograms-youthprograms 398
revenue-not set-revenue 397
personnel-not set-personnel 394
revenue-revenue-revenue 393
health-health-health 392
revenue-revenue-revenue 392
parksandrecreation-parksandrecreation-parksandrecreation 391
revenue-revenue-revenue 391
li-not set-li 390
personnel-personnel-personnel 388
opa-not set-opa 385
health-health-health 384
revenue-paymentcenter-paymentcenter 384
crs_onlinev2-crs_onlinev2-crs_onlinev2 383
revenue-revenue-revenue 381
ivrtoweb-ivrtoweb-ivrtoweb 374
li-li-phillylmsprod 373
revenue-paymentcenter-paymentcenter 372
health-health-health 371
paymentcenter-not set-paymentcenter 371
pages-pages-personnel 369
pages-revenue-revenue 368
health-health-health 366
parksandrecreation-not set-parksandrecreation 366
pages-pages-personnel 364
pages-crs_onlinev2-crs_onlinev2 362
parksandrecreation-parksandrecreation-parksandrecreation 361
residents-residents-revenue 360
pages-personnel-personnel 357
revenue-revenue-revenue 356
records-records-records 355
revenue-revenue-revenue 355
revenue-revenue-revenue 354
personnel-not set-personnel 353
revenue-revenue-revenue 352
li-li-li 349
li-not set-li 348
procurement-not set-procurement 347
records-records-records 347
prisons-prisons-prisons 345
revenue-revenue-revenue 345
li-li-li 343
311-311-311 342
pages-brt-pages 342
pages-personnel-pages 342
revenue-not set-revenue 342
brt-residents-revenue 341
revenue-not set-revenue 340
pages-agencies-pages 338
youthprograms-not set-youthprograms 338
mayor-not set-mayor 336
pages-311-pages 333
revenue-revenue-revenue 332
revenue-revenue-opa 327
health-health-health 326
li-phillylmsprod-phillylmsprod 326
personnel-personnel-personnel 326
youthprograms-youthprograms-youthprograms 322
prisons-prisons-prisons 321
phillylmsprod-phillylmsprod-phillylmsprod 320
li-li-li 319
revenue-revenue-revenue 319
prisons-prisons-prisons 318
revenue-revenue-revenue 317
revenue-paymentcenter-revenue 317
revenue-revenue-paymentcenter 316
personnel-personnel-personnel 315
revenue-revenue-revenue 314
revenue-revenue-revenue 314
parksandrecreation-not set-parksandrecreation 313
pages-brt-brt 312
pages-brt-revenue 312
personnel-personnel-personnel 311
wills-wills-wills 311
parksandrecreation-parksandrecreation-parksandrecreation 310
revenue-revenue-revenue 307
streets-streets-streets 307
health-health-health 304
prisons-prisons-prisons 301
revenue-not set-revenue 297
health-health-health 296
cablefranchises-not set-cablefranchises 294
311-311-311 292
revenue-paymentcenter-paymentcenter 292
revenue-revenue-revenue 291
revenue-revenue-revenue 291
li-li-li 289
pages-water-pages 288
pages-311-311 286
pages-water-water 286
li-li-li 284
pages-agencies-agencies 284
revenue-not set-revenue 284
health-health-health 283
records-not set-records 283
pages-phillylmsprod-phillylmsprod 281
phillylmsprod-not set-phillylmsprod 281
streets-streets-streets 281
pages-licensespermitscert-pages 279
pages-pages-default 279
water-residents-water 279
health-health-health 278
records-records-records 278
personnel-personnel-personnel 276
revenue-revenue-revenue 276
pages-topics-personnel 275
crs_onlinev2-crs_onlinev2-crs_onlinev2 274
procurement_search-procurement_search-procurement_search 274
li-li-phillylmsprod 273
paymentcenter-paymentcenter-paymentcenter 270
revenue-revenue-residents 270
revenue-revenue-revenue 270
streets-streets-streets 269
residents-revenue-residents 268
paymentcenter-not set-paymentcenter 266
prisons-prisons-prisons 265
prisons-prisons-prisons 264
revenue-revenue-revenue 264
revenue-revenue-revenue 264
revenue-revenue-revenue 264
parksandrecreation-parksandrecreation-parksandrecreation 263
prisons-prisons-prisons 263
procurement-procurement-procurement 262
revenue-revenue-revenue 262
parksandrecreation-not set-parksandrecreation 261
revenue-revenue-paymentcenter 261
health-health-health 260
revenue-not set-revenue 260
water-residents-residents 259
pages-not set-pages 258
revenue-revenue-revenue 257
revenue-revenue-revenue 257
pages-pages-opa 256
opa-opa-opa 255
revenue-revenue-revenue 255
brt-not set-brt 252
revenue-revenue-revenue 252
pages-crs_onlinev2-pages 251
health-health-health 250
revenue-revenue-revenue 250
parksandrecreation-parksandrecreation-parksandrecreation 249
records-records-records 249
revenue-revenue-revenue 248
pages-pages-paymentcenter 247
revenue-revenue-revenue 247
health-health-health 246
pages-revenue-revenue 246
revenue-revenue-revenue 246
pages-pages-pages 244
prisons-not set-prisons 244
personnel-personnel-personnel 242
revenue-revenue-revenue 242
pages-pages-paymentcenter 240
pages-topics-personnel 240
pages-topics-personnel 240
revenue-not set-revenue 239
revenue-revenue-revenue 239
health-health-health 238
revenue-revenue-revenue 238
paymentcenter-paymentcenter-paymentcenter 237
revenue-revenue-revenue 237
revenue-revenue-revenue 237
revenue-revenue-revenue 237
health-health-health 236
revenue-revenue-revenue 236
pages-not set-pages 235
prisons-prisons-prisons 235
revenue-revenue-revenue 235
water-water-water 233
pages-topics-pages 232
revenue-revenue-revenue 232
revenue-revenue-revenue 232
paymentcenter-paymentcenter-paymentcenter 231
revenue-revenue-revenue 231
health-health-health 230
revenue-revenue-revenue 230
pages-licensespermitscert-licensespermitscert 229
revenue-revenue-revenue 229
revenue-revenue-revenue 229
revenue-revenue-revenue 229
pages-zoningarchive-zoningarchive 228
waterrev-not set-waterrev 228
revenue-not set-revenue 227
revenue-revenue-revenue 226
streets-streets-streets 226
li-li-li 225
pages-pages-pages 224
revenue-revenue-revenue 222
residents-not set-residents 221
revenue-revenue-revenue 220
revenue-revenue-revenue 220
li-li-li 216
pages-crs_onlinev2-crs_onlinev2 216
pages-personnel-personnel 215
revenue-revenue-revenue 215
revenue-revenue-revenue 215
health-health-health 214
phillylmsprod-phillylmsprod-phillylmsprod 214
mayor-mayor-mayor 213
pages-brt-brt 213
procurement-procurement-procurement 213
residents-not set-residents 213
revenue-revenue-revenue 213
districtattorney-not set-districtattorney 212
revenue-revenue-revenue 212
pages-not set-pages 211
pages-mayor-mayor 211
pages-mayor-pages 211
phillylmsprod-phillylmsprod-phillylmsprod 211
pages-brt-default 210
residents-revenue-revenue 210
pages-pages-pages 209
brt-pages-revenue 208
pages-li-li 208
revenue-revenue-revenue 208
revenue-revenue-revenue 207
water-water-water 207
health-health-health 206
opa-opa-opa 206
pages-pages-paymentcenter 206
osh-not set-osh 205
pages-parksandrecreation-pages 205
parksandrecreation-parksandrecreation-parksandrecreation 205
prisons-prisons-prisons 205
procurement-procurement-procurement 205
revenue-revenue-revenue 205
revenue-pages-revenue 205
contracts-not set-contracts 204
health-health-health 204
revenue-revenue-revenue 203
health-health-health 202
pages-parksandrecreation-parksandrecreation 202
revenue-revenue-paymentcenter 202
revenue-revenue-revenue 202
revenue-revenue-revenue 200
pages-pages-phillylmsprod 199
pensions-pensions-pensions 198
revenue-revenue-revenue 198
waterrev-waterrev-waterrev 198
pages-pages-revenue 197
revenue-revenue-revenue 197
records-records-records 196
revenue-revenue-revenue 196
tap-tap-tap 196
crs_onlinev2-crs_onlinev2-crs_onlinev2 195
health-health-health 194
health-health-health 194
pages-revenue-revenue 193
pages-pages-pages 192
waterrev-paymentcenter-paymentcenter 192
parksandrecreation-parksandrecreation-parksandrecreation 191
personnel-personnel-personnel 191
revenue-not set-revenue 191
water-water-water 190
revenue-revenue-revenue 189
pages-ivrtoweb-pages 188
pages-pages-revenue 188
revenue-revenue-paymentcenter 188
li-data-li 187
pages-contracts-pages 187
pensions-not set-pensions 187
pages-not set-pages 186
pages-water-paymentcenter 186
personnel-personnel-personnel 186
revenue-revenue-revenue 186
pages-pages-revenue 185
li-data-li 184
pages-paymentcenter-water 183
water-residents-paymentcenter 182
youthprograms-youthprograms-youthprograms 182
ethicsboard-not set-ethicsboard 181
health-health-health 181
pages-revenue-revenue 181
pages-revenue-revenue 181
revenue-default-revenue 181
waterrev-paymentcenter-paymentcenter 181
li-not set-li 180
osh-not set-osh 180
pages-residents-paymentcenter 180
prisons-prisons-prisons 180
pages-ivrtoweb-ivrtoweb 179
pages-li-zoningarchive 179
personnel-personnel-personnel 179
revenue-revenue-revenue 179
revenue-revenue-revenue 179
water-residents-paymentcenter 179
health-health-health 178
pages-residents-paymentcenter 178
revenue-revenue-revenue 178
revenue-revenue-revenue 178
revenue-revenue-revenue 178
waterrev-paymentcenter-waterrev 178
brt-brt-brt 177
health-health-health 177
pages-li-phillylmsprod 177
pages-topics-personnel 177
revenue-revenue-paymentcenter 177
pages-revenue-opa 176
revenue-revenue-revenue 176
revenue-revenue-revenue 175
revenue-revenue-revenue 175
records-records-records 174
revenue-revenue-revenue 174
openbudget-not set-openbudget 173
records-not set-records 173
revenue-revenue-revenue 173
pages-water-paymentcenter 172
youthprograms-youthprograms-youthprograms 172
parksandrecreation-parksandrecreation-parksandrecreation 171
revenue-revenue-revenue 170
revenue-revenue-revenue 170
phillylmsprod-phillylmsprod-phillylmsprod 169
prisons-not set-prisons 169
revenue-revenue-revenue 169
revenue-revenue-paymentcenter 169
topics-topics-topics 169
waterrev-waterrev-waterrev 169
youthprograms-youthprograms-youthprograms 169
brt-brt-revenue 168
li-li-li 168
li-li-phillylmsprod 168
revenue-revenue-paymentcenter 168
cablefranchises-cablefranchises-cablefranchises 167
revenue-revenue-pages 167
revenue-revenue-revenue 167
waterrev-paymentcenter-paymentcenter 167
motu-motu-motu 166
pages-contracts-contracts 166
parksandrecreation-parksandrecreation-parksandrecreation 166
revenue-revenue-revenue 166
personnel-personnel-personnel 165
revenue-revenue-revenue 165
revenue-revenue-revenue 165
li-li-li 164
pages-pages-pages 164
pages-paymentcenter-paymentcenter 164
pages-revenue-default 164
pages-topics-topics 164
revenue-revenue-revenue 164
revenue-revenue-brt 164
pages-pages-revenue 163
pages-water-paymentcenter 163
records-records-records 163
water-revenue-revenue 163
commerce-not set-commerce 162
pages-ig-pages 162
paymentcenter-paymentcenter-paymentcenter 162
records-records-records 162
revenue-revenue-revenue 162
revenue-revenue-revenue 162
pages-health-health 161
parksandrecreation-parksandrecreation-parksandrecreation 161
pages-revenue-paymentcenter 160
prisons-prisons-prisons 160
records-records-records 160
revenue-revenue-revenue 160
revenue-revenue-revenue 160
revenue-revenue-revenue 160
default-opa-revenue 159
ivrtoweb-ivrtoweb-ivrtoweb 159
pages-revenue-revenue 159
pages-water-revenue 159
revenue-revenue-revenue 159
opa-not set-opa 158
revenue-not set-revenue 158
revenue-revenue-revenue 158
revenue-pages-pages 158
pages-not set-pages 157
parksandrecreation-not set-parksandrecreation 157
revenue-revenue-revenue 157
health-health-health 156
health-health-health 156
pages-not set-pages 156
revenue-revenue-paymentcenter 156
revenue-revenue-revenue 156
waterrev-not set-waterrev 156
prisons-prisons-prisons 155
prisons-prisons-prisons 154
revenue-revenue-revenue 154
revenue-revenue-revenue 154
revenue-revenue-revenue 154
addressexplorer-not set-addressexplorer 153
contracts-contracts-contracts 153
pages-revenue-paymentcenter 153
personnel-personnel-personnel 153
water-residents-paymentcenter 153
water-topics-topics 153
pages-pages-residents 152
personnel-personnel-personnel 152
li-li-li 151
li-phillylmsprod-li 151
pages-pages-li 151
pages-residents-paymentcenter 151
parksandrecreation-not set-parksandrecreation 151
personnel-personnel-personnel 151
records-records-records 151
brt-revenue-brt 150
parksandrecreation-not set-parksandrecreation 150
rfp-not set-rfp 150
pages-li-phillylmsprod 149
procurement_search-procurement_search-procurement_search 149
revenue-revenue-revenue 149
revenue-not set-revenue 149
health-health-health 148
li-data-li 148
li-li-pages 147
pages-pages-pages 147
prisons-not set-prisons 147
records-records-records 147
revenue-revenue-revenue 147
phils-not set-phils 146
districtattorney-not set-districtattorney 145
pages-pages-pages 145
paymentcenter-revenue-revenue 145
parksandrecreation-parksandrecreation-parksandrecreation 144
li-zoningarchive-zoningarchive 143
records-not set-records 143
revenue-revenue-revenue 143
revenue-revenue-revenue 143
pages-pages-revenue 142
personnel-personnel-pages 142
prisons-prisons-prisons 142
prisons-prisons-prisons 142
revenue-revenue-revenue 142
revenue-revenue-revenue 142
li-li-li 141
opa-opa-opa 141
pages-personnel-revenue 141
parksandrecreation-parksandrecreation-parksandrecreation 141
residents-residents-residents 141
revenue-revenue-revenue 141
pages-pages-pages 140
phillylmsprod-phillylmsprod-phillylmsprod 140
procurement_search-not set-procurement_search 140
records-phils-records 140
revenue-not set-revenue 140
revenue-paymentcenter-paymentcenter 140
pages-revenue-paymentcenter 139
paymentcenter-paymentcenter-paymentcenter 139
revenue-revenue-revenue 139
revenue-revenue-revenue 139
revenue-revenue-revenue 139
pages-informationcenters-pages 138
pages-revenue-revenue 138
pages-pages-pages 138
parksandrecreation-parksandrecreation-parksandrecreation 138
revenue-revenue-paymentcenter 138
parksandrecreation-parksandrecreation-parksandrecreation 137
paymentcenter-paymentcenter-revenue 137
revenue-revenue-revenue 137
revenue-revenue-revenue 137
revenue-revenue-paymentcenter 137
li-li-li 136
li-li-li 136
personnel-personnel-personnel 136
prisons-prisons-prisons 136
revenue-revenue-revenue 135
revenue-revenue-revenue 135
openbudget-openbudget-openbudget 134
personnel-personnel-personnel 134
personnel-not set-personnel 134
phillylmsprod-phillylmsprod-phillylmsprod 134
prisons-prisons-prisons 134
revenue-revenue-revenue 134
revenue-revenue-revenue 134
revenue-revenue-revenue 134
pages-pages-revenue 133
waterrev-waterrev-waterrev 133
health-not set-health 132
health-health-health 132
pages-pages-revenue 132
revenue-revenue-revenue 132
revenue-residents-revenue 132
li-li-li 131
revenue-revenue-revenue 131
pages-pages-pages 130
pages-pages-personnel 130
records-records-records 130
revenue-revenue-revenue 130
channel64-not set-channel64 129
revenue-revenue-revenue 129
revenue-revenue-revenue 127
revenue-revenue-revenue 127
revenue-revenue-revenue 127
li-not set-li 126
pages-pages-pages 126
pages-phillylmsprod-pages 126
streets-streets-streets 126
pages-personnel-personnel 125
paymentcenter-paymentcenter-paymentcenter 125
paymentcenter-paymentcenter-paymentcenter 125
health-health-health 124
revenue-revenue-revenue 124
revenue-revenue-revenue 124
revenue-revenue-revenue 124
pages-li-li 123
revenue-revenue-revenue 123
revenue-revenue-revenue 123
revenue-revenue-revenue 123
parksandrecreation-parksandrecreation-parksandrecreation 122
records-phils-phils 122
revenue-revenue-revenue 122
li-li-phillylmsprod 121
opa-not set-opa 121
li-data-li 120
li-li-phillylmsprod 120
pages-pages-pages 120
parksandrecreation-parksandrecreation-parksandrecreation 120
revenue-revenue-li 120
revenue-revenue-revenue 119
revenue-revenue-revenue 119
revenue-default-default 119
districtattorney-not set-districtattorney 118
health-health-health 118
opa-opa-opa 118
pages-revenue-revenue 118
prisons-topics-topics 118
revenue-revenue-revenue 117
revenue-revenue-revenue 117
water-water-water 117
contracts-contracts-contracts 116
health-health-health 116
health-health-health 116
health-health-health 116
personnel-personnel-personnel 116
revenue-revenue-revenue 116
revenue-revenue-revenue 116
revenue-revenue-brt 116
revenue-revenue-revenue 116
311-311-311 115
pages-pages-revenue 115
pages-wills-pages 115
311-not set-311 114
pages-revenue-revenue 114
revenue-revenue-revenue 114
revenue-revenue-revenue 114
revenue-not set-revenue 114
revenue-revenue-revenue 114
revenue-revenue-residents 114
revenue-revenue-revenue 114
pages-revenue-revenue 113
revenue-revenue-revenue 113
revenue-revenue-revenue 113
revenue-revenue-revenue 113
water-paymentcenter-revenue 113
green-not set-green 112
licensespermitscert-health-health 112
osh-osh-osh 112
pages-crs_onlinev2-li 112
pages-topics-personnel 112
prisons-prisons-prisons 112
revenue-revenue-revenue 112
revenue-revenue-revenue 112
bikeshare-bikeshare-bikeshare 111
parksandrecreation-parksandrecreation-parksandrecreation 111
prisons-topics-prisons 111
procurement_search-procurement_search-procurement_search 111
revenue-pages-revenue 111
revenue-revenue-revenue 111
revenue-revenue-revenue 111
dhs-dhs-dhs 110
health-health-health 110
prisons-not set-prisons 110
revenue-revenue-revenue 110
revenue-pages-pages 110
revenue-revenue-revenue 110
revenue-revenue-revenue 110
revenue-revenue-revenue 110
water-water-water 110
pages-mdo-mdo 109
parksandrecreation-parksandrecreation-parksandrecreation 109
revenue-revenue-revenue 109
revenue-revenue-revenue 109
revenue-paymentcenter-revenue 109
revenue-revenue-revenue 109
data-li-li 108
health-health-health 108
pages-pages-opa 108
pages-residents-opa 108
pages-not set-pages 108
prisons-prisons-prisons 108
revenue-revenue-revenue 108
revenue-revenue-revenue 108
revenue-revenue-revenue 108
default-opa-default 107
pages-personnel-pages 107
pages-pages-pages 107
prisons-not set-prisons 107
prisons-prisons-prisons 107
pages-not set-pages 106
pages-paymentcenter-pages 106
pages-prisons-prisons 106
pages-residents-default 106
pages-not set-pages 106
prisons-prisons-prisons 106
revenue-revenue-revenue 106
topics-personnel-topics 106
ethicsboard-ethicsboard-ethicsboard 105
opa-opa-opa 105
revenue-revenue-revenue 105
revenue-revenue-revenue 105
revenue-revenue-revenue 105
revenue-revenue-revenue 105
water-topics-water 105
health-health-health 104
health-health-health 104
li-pages-li 104
parksandrecreation-parksandrecreation-parksandrecreation 104
revenue-revenue-revenue 104
revenue-revenue-revenue 104
waterrev-not set-waterrev 104
pages-zoningarchive-pages 103
phillylmsprod-phillylmsprod-phillylmsprod 103
revenue-not set-revenue 103
revenue-revenue-revenue 103
revenue-revenue-revenue 103
revenue-revenue-revenue 103
revenue-revenue-revenue 103
revenue-revenue-revenue 103
districtattorney-not set-districtattorney 102
li-li-li 102
pages-mdo-pages 102
pages-personnel-personnel 102
pages-wills-wills 102
records-not set-records 102
revenue-revenue-revenue 102
revenue-revenue-revenue 102
revenue-revenue-revenue 102
agencies-not set-agencies 101
pages-li-li 101
personnel-personnel-personnel 101
phillylmsprod-phillylmsprod-phillylmsprod 101
residents-not set-residents 101
revenue-revenue-revenue 101
revenue-revenue-revenue 101
paymentcenter-paymentcenter-paymentcenter 100
revenue-revenue-revenue 100
revenue-not set-revenue 100
revenue-revenue-revenue 100
default-residents-default 99
info-info-info 99
opa-revenue-revenue 99
pages-li-li 99
prisons-prisons-prisons 99
revenue-revenue-revenue 99
cityplanning-not set-cityplanning 98
default-opa-default 98
health-health-health 98
pages-li-li 98
personnel-personnel-personnel 98
revenue-revenue-revenue 98
revenue-revenue-revenue 98
revenue-revenue-revenue 98
revenue-pages-revenue 98
revenue-revenue-revenue 98
water-water-paymentcenter 98
li-li-li 97
licensespermitscert-not set-licensespermitscert 97
pages-agencies-deptaz 97
personnel-personnel-personnel 97
revenue-revenue-revenue 97
revenue-paymentcenter-paymentcenter 97
health-health-health 96
li-data-data 96
li-li-li 96
li-li-pages 96
licensespermitscert-pages-pages 96
pages-health-pages 96
pages-revenue-revenue 96
parksandrecreation-parksandrecreation-parksandrecreation 96
pensions-pensions-pensions 96
phils-not set-phils 96
default-pages-default 95
districtattorney-not set-districtattorney 95
li-li-zoningarchive 95
li-pages-pages 95
opa-not set-opa 95
pages-li-pages 95
paymentcenter-paymentcenter-paymentcenter 95
personnel-personnel-personnel 95
prisons-prisons-prisons 95
revenue-revenue-revenue 95
revenue-revenue-revenue 95
revenue-revenue-revenue 95
cityplanning-not set-cityplanning 94
health-health-health 94
li-li-li 94
li-li-li 94
pensions-pensions-pensions 94
revenue-revenue-revenue 94
revenue-revenue-revenue 94
revenue-revenue-revenue 94
revenue-revenue-paymentcenter 94
commerce-commerce-commerce 93
dhs-dhs-dhs 93
pages-ig-ig 93
pages-revenue-revenue 93
pages-revenue-revenue 93
personnel-personnel-personnel 93
procurement-not set-procurement 93
revenue-revenue-revenue 93
health-health-health 92
pages-pages-pages 92
parksandrecreation-parksandrecreation-parksandrecreation 92
paymentcenter-paymentcenter-paymentcenter 92
prisons-prisons-prisons 92
records-not set-records 92
revenue-not set-revenue 92
revenue-revenue-revenue 92
revenue-revenue-revenue 92
revenue-revenue-revenue 92
councillookup-councillookup-councillookup 91
health-health-health 91
li-li-li 91
li-li-phillylmsprod 91
pages-paymentcenter-revenue 91
parksandrecreation-not set-parksandrecreation 91
phillylmsprod-phillylmsprod-phillylmsprod 91
records-not set-records 91
revenue-revenue-revenue 91
revenue-revenue-revenue 91
topics-personnel-personnel 91
pages-revenue-revenue 90
procurement-procurement-procurement 90
revenue-revenue-revenue 90
revenue-revenue-revenue 90
revenue-revenue-revenue 90
li-pages-pages 89
parksandrecreation-parksandrecreation-parksandrecreation 89
parksandrecreation-parksandrecreation-parksandrecreation 89
revenue-revenue-revenue 89
revenue-revenue-revenue 89
revenue-revenue-revenue 89
waterrev-revenue-revenue 89
channel64-channel64-channel64 88
li-li-li 88
pages-pages-pages 88
parksandrecreation-not set-parksandrecreation 88
phillylmsprod-phillylmsprod-phillylmsprod 88
phillylmsprod-phillylmsprod-phillylmsprod 88
phils-phils-phils 88
revenue-revenue-revenue 88
revenue-revenue-revenue 88
revenue-revenue-revenue 88
water-paymentcenter-revenue 88
agencies-revenue-revenue 87
li-phillylmsprod-phillylmsprod 87
opa-opa-default 87
pages-pages-pages 87
pages-phillylmsprod-phillylmsprod 87
parksandrecreation-not set-parksandrecreation 87
personnel-personnel-personnel 87
prisons-not set-prisons 87
revenue-revenue-revenue 87
revenue-revenue-revenue 87
brt-brt-revenue 86
brt-residents-residents 86
health-health-health 86
li-not set-li 86
li-li-phillylmsprod 86
li-li-li 86
pages-revenue-revenue 86
paymentcenter-paymentcenter-paymentcenter 86
paymentcenter-paymentcenter-paymentcenter 86
prisons-prisons-prisons 86
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment