Skip to content

Instantly share code, notes, and snippets.

@colliand
Last active August 29, 2015 14:11
Show Gist options
  • Save colliand/00f47517b28b11de7116 to your computer and use it in GitHub Desktop.
Save colliand/00f47517b28b11de7116 to your computer and use it in GitHub Desktop.

Grading Team Performance Insights

This page provides visualizations on grading team performance using Crowdmark at the University of Toronto during Fall 2014.

Legend

  • The area of each bubble is proportional to the number of pages uploaded.
  • The velocity is based on the Fall 2014 Crowdmark timing data algorithm (see below).
  • Exams with multiple versions in the same class are shown here separately.
  • Other information including the days before returning the exam are shown in a hover tip.

This page is built by imitating this resource by Mike Bostock: http://bl.ocks.org/mbostock/3887118

How does the timing work?

When a grader adds a score, Crowdmark records a time called the "created at" time. When a facilitator changes that score, Crowdmark records a time called the "updated at" time. The algorithm for calculating time spent grading completely ignores "updated at" and is exclusively based on "created at" times. Suppose that a grader or facilitator creates a sequence of "created at" times t_1, t_2, t_3, .... , t_4. If |t_{n+1} - t_n| < THRESHOLD, we assume that the grader was continuously grading during the time interval [t_n, t_{n+1}]. If the time separation is bigger than THRESHOLD, we assume that the grader has stopped grading. We then calculate the length of the time intervals interpreted as continuous marking and that is the total time spent grading. The current THRESHOLD is 10 minutes. Should we change the threshold time?

Caveats: If a grader spends 11 minutes reviewing a page and then enters a score and then spends 11 minutes reviewing the next page and enters a score, the total time appearing in the algorithm will be 0 minutes spent grading. Activities like matching and reviewing scores do not presently contribute to time-spent-grading.

<!DOCTYPE html>
<meta charset="utf-8">
<style>
<head>
<title>Fall 2014 University of Toronto Grading Data</title>
</head>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.dot {
stroke: #000;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var xScale = d3.time.scale()
// .domain([new Date(dataset[0][0].time),d3.time.day.offset(new Date(dataset[0][dataset[0].length-1].time),8)])
// .rangeRound([0, w-padding.left-padding.right]);
// var x = d3.scale.linear()
// .range([0, width]);
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var color = d3.scale.category20();
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
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 + ")");
// d3.tsv("wdata_full.tsv", function(error, data) {
// data.forEach(function(d) {
// d.UploadedPages = +d.UploadedPages;
// d.SentDate = +d.SentDate;
// });
d3.tsv("uoftdata_full.tsv", function(error, data) {
data.forEach(function(d) {
d.SentDate = parseDate(d.SentDate);
d.UploadedPages = +d.UploadedPages;
});
x.domain(d3.extent(data, function(d) { return d.SentDate; })).nice();
y.domain(d3.extent(data, function(d) { return d.UploadedPages; })).nice();
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sent Date (Day of Year)");
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Page Images Uploaded")
svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 5)
.attr("cx", function(d) { return x(d.SentDate); })
.attr("cy", function(d) { return y(d.UploadedPages); })
.style("fill", function(d) { return color(d.Course); });
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
});
</script>
<h1> Grading Performance Visualizations </h1>
<h2>
<a href="index.html">Grading Velocity vs. Day of Year</a><br>
<a href="return.html">Return Inteval vs. Day of Year</a><br>
<a href="uploaded.html">Uploaded Pages vs. Day of Year</a><br>
</h2>
We can make this file beautiful and searchable if this error is corrected: No tabs found in this TSV file in line 0.
SentDate EvaluatedPages
2014-09-28 116
2014-10-09 232
2014-10-11 7694
2014-10-14 1749
2014-10-16 7263
2014-10-21 705
2014-10-25 803
2014-10-28 7221
2014-10-31 5621
2014-11-03 2067
2014-11-06 2864
2014-11-12 816
2014-11-14 2526
2014-11-16 360
2014-11-17 7663
2014-11-19 575
2014-11-21 7118
2014-11-24 460
2014-11-30 6526
2014-12-07 451
{
"name": "flare",
"children": [
{
"name": "analytics",
"children": [
{
"name": "cluster",
"children": [
{"name": "AgglomerativeCluster", "size": 3938},
{"name": "CommunityStructure", "size": 3812},
{"name": "HierarchicalCluster", "size": 6714},
{"name": "MergeEdge", "size": 743}
]
},
{
"name": "graph",
"children": [
{"name": "BetweennessCentrality", "size": 3534},
{"name": "LinkDistance", "size": 5731},
{"name": "MaxFlowMinCut", "size": 7840},
{"name": "ShortestPaths", "size": 5914},
{"name": "SpanningTree", "size": 3416}
]
},
{
"name": "optimization",
"children": [
{"name": "AspectRatioBanker", "size": 7074}
]
}
]
},
{
"name": "animate",
"children": [
{"name": "Easing", "size": 17010},
{"name": "FunctionSequence", "size": 5842},
{
"name": "interpolate",
"children": [
{"name": "ArrayInterpolator", "size": 1983},
{"name": "ColorInterpolator", "size": 2047},
{"name": "DateInterpolator", "size": 1375},
{"name": "Interpolator", "size": 8746},
{"name": "MatrixInterpolator", "size": 2202},
{"name": "NumberInterpolator", "size": 1382},
{"name": "ObjectInterpolator", "size": 1629},
{"name": "PointInterpolator", "size": 1675},
{"name": "RectangleInterpolator", "size": 2042}
]
},
{"name": "ISchedulable", "size": 1041},
{"name": "Parallel", "size": 5176},
{"name": "Pause", "size": 449},
{"name": "Scheduler", "size": 5593},
{"name": "Sequence", "size": 5534},
{"name": "Transition", "size": 9201},
{"name": "Transitioner", "size": 19975},
{"name": "TransitionEvent", "size": 1116},
{"name": "Tween", "size": 6006}
]
},
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "Converters", "size": 721},
{"name": "DelimitedTextConverter", "size": 4294},
{"name": "GraphMLConverter", "size": 9800},
{"name": "IDataConverter", "size": 1314},
{"name": "JSONConverter", "size": 2220}
]
},
{"name": "DataField", "size": 1759},
{"name": "DataSchema", "size": 2165},
{"name": "DataSet", "size": 586},
{"name": "DataSource", "size": 3331},
{"name": "DataTable", "size": 772},
{"name": "DataUtil", "size": 3322}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "size": 8833},
{"name": "LineSprite", "size": 1732},
{"name": "RectSprite", "size": 3623},
{"name": "TextSprite", "size": 10066}
]
},
{
"name": "flex",
"children": [
{"name": "FlareVis", "size": 4116}
]
},
{
"name": "physics",
"children": [
{"name": "DragForce", "size": 1082},
{"name": "GravityForce", "size": 1336},
{"name": "IForce", "size": 319},
{"name": "NBodyForce", "size": 10498},
{"name": "Particle", "size": 2822},
{"name": "Simulation", "size": 9983},
{"name": "Spring", "size": 2213},
{"name": "SpringForce", "size": 1681}
]
},
{
"name": "query",
"children": [
{"name": "AggregateExpression", "size": 1616},
{"name": "And", "size": 1027},
{"name": "Arithmetic", "size": 3891},
{"name": "Average", "size": 891},
{"name": "BinaryExpression", "size": 2893},
{"name": "Comparison", "size": 5103},
{"name": "CompositeExpression", "size": 3677},
{"name": "Count", "size": 781},
{"name": "DateUtil", "size": 4141},
{"name": "Distinct", "size": 933},
{"name": "Expression", "size": 5130},
{"name": "ExpressionIterator", "size": 3617},
{"name": "Fn", "size": 3240},
{"name": "If", "size": 2732},
{"name": "IsA", "size": 2039},
{"name": "Literal", "size": 1214},
{"name": "Match", "size": 3748},
{"name": "Maximum", "size": 843},
{
"name": "methods",
"children": [
{"name": "add", "size": 593},
{"name": "and", "size": 330},
{"name": "average", "size": 287},
{"name": "count", "size": 277},
{"name": "distinct", "size": 292},
{"name": "div", "size": 595},
{"name": "eq", "size": 594},
{"name": "fn", "size": 460},
{"name": "gt", "size": 603},
{"name": "gte", "size": 625},
{"name": "iff", "size": 748},
{"name": "isa", "size": 461},
{"name": "lt", "size": 597},
{"name": "lte", "size": 619},
{"name": "max", "size": 283},
{"name": "min", "size": 283},
{"name": "mod", "size": 591},
{"name": "mul", "size": 603},
{"name": "neq", "size": 599},
{"name": "not", "size": 386},
{"name": "or", "size": 323},
{"name": "orderby", "size": 307},
{"name": "range", "size": 772},
{"name": "select", "size": 296},
{"name": "stddev", "size": 363},
{"name": "sub", "size": 600},
{"name": "sum", "size": 280},
{"name": "update", "size": 307},
{"name": "variance", "size": 335},
{"name": "where", "size": 299},
{"name": "xor", "size": 354},
{"name": "_", "size": 264}
]
},
{"name": "Minimum", "size": 843},
{"name": "Not", "size": 1554},
{"name": "Or", "size": 970},
{"name": "Query", "size": 13896},
{"name": "Range", "size": 1594},
{"name": "StringUtil", "size": 4130},
{"name": "Sum", "size": 791},
{"name": "Variable", "size": 1124},
{"name": "Variance", "size": 1876},
{"name": "Xor", "size": 1101}
]
},
{
"name": "scale",
"children": [
{"name": "IScaleMap", "size": 2105},
{"name": "LinearScale", "size": 1316},
{"name": "LogScale", "size": 3151},
{"name": "OrdinalScale", "size": 3770},
{"name": "QuantileScale", "size": 2435},
{"name": "QuantitativeScale", "size": 4839},
{"name": "RootScale", "size": 1756},
{"name": "Scale", "size": 4268},
{"name": "ScaleType", "size": 1821},
{"name": "TimeScale", "size": 5833}
]
},
{
"name": "util",
"children": [
{"name": "Arrays", "size": 8258},
{"name": "Colors", "size": 10001},
{"name": "Dates", "size": 8217},
{"name": "Displays", "size": 12555},
{"name": "Filter", "size": 2324},
{"name": "Geometry", "size": 10993},
{
"name": "heap",
"children": [
{"name": "FibonacciHeap", "size": 9354},
{"name": "HeapNode", "size": 1233}
]
},
{"name": "IEvaluable", "size": 335},
{"name": "IPredicate", "size": 383},
{"name": "IValueProxy", "size": 874},
{
"name": "math",
"children": [
{"name": "DenseMatrix", "size": 3165},
{"name": "IMatrix", "size": 2815},
{"name": "SparseMatrix", "size": 3366}
]
},
{"name": "Maths", "size": 17705},
{"name": "Orientation", "size": 1486},
{
"name": "palette",
"children": [
{"name": "ColorPalette", "size": 6367},
{"name": "Palette", "size": 1229},
{"name": "ShapePalette", "size": 2059},
{"name": "SizePalette", "size": 2291}
]
},
{"name": "Property", "size": 5559},
{"name": "Shapes", "size": 19118},
{"name": "Sort", "size": 6887},
{"name": "Stats", "size": 6557},
{"name": "Strings", "size": 22026}
]
},
{
"name": "vis",
"children": [
{
"name": "axis",
"children": [
{"name": "Axes", "size": 1302},
{"name": "Axis", "size": 24593},
{"name": "AxisGridLine", "size": 652},
{"name": "AxisLabel", "size": 636},
{"name": "CartesianAxes", "size": 6703}
]
},
{
"name": "controls",
"children": [
{"name": "AnchorControl", "size": 2138},
{"name": "ClickControl", "size": 3824},
{"name": "Control", "size": 1353},
{"name": "ControlList", "size": 4665},
{"name": "DragControl", "size": 2649},
{"name": "ExpandControl", "size": 2832},
{"name": "HoverControl", "size": 4896},
{"name": "IControl", "size": 763},
{"name": "PanZoomControl", "size": 5222},
{"name": "SelectionControl", "size": 7862},
{"name": "TooltipControl", "size": 8435}
]
},
{
"name": "data",
"children": [
{"name": "Data", "size": 20544},
{"name": "DataList", "size": 19788},
{"name": "DataSprite", "size": 10349},
{"name": "EdgeSprite", "size": 3301},
{"name": "NodeSprite", "size": 19382},
{
"name": "render",
"children": [
{"name": "ArrowType", "size": 698},
{"name": "EdgeRenderer", "size": 5569},
{"name": "IRenderer", "size": 353},
{"name": "ShapeRenderer", "size": 2247}
]
},
{"name": "ScaleBinding", "size": 11275},
{"name": "Tree", "size": 7147},
{"name": "TreeBuilder", "size": 9930}
]
},
{
"name": "events",
"children": [
{"name": "DataEvent", "size": 2313},
{"name": "SelectionEvent", "size": 1880},
{"name": "TooltipEvent", "size": 1701},
{"name": "VisualizationEvent", "size": 1117}
]
},
{
"name": "legend",
"children": [
{"name": "Legend", "size": 20859},
{"name": "LegendItem", "size": 4614},
{"name": "LegendRange", "size": 10530}
]
},
{
"name": "operator",
"children": [
{
"name": "distortion",
"children": [
{"name": "BifocalDistortion", "size": 4461},
{"name": "Distortion", "size": 6314},
{"name": "FisheyeDistortion", "size": 3444}
]
},
{
"name": "encoder",
"children": [
{"name": "ColorEncoder", "size": 3179},
{"name": "Encoder", "size": 4060},
{"name": "PropertyEncoder", "size": 4138},
{"name": "ShapeEncoder", "size": 1690},
{"name": "SizeEncoder", "size": 1830}
]
},
{
"name": "filter",
"children": [
{"name": "FisheyeTreeFilter", "size": 5219},
{"name": "GraphDistanceFilter", "size": 3165},
{"name": "VisibilityFilter", "size": 3509}
]
},
{"name": "IOperator", "size": 1286},
{
"name": "label",
"children": [
{"name": "Labeler", "size": 9956},
{"name": "RadialLabeler", "size": 3899},
{"name": "StackedAreaLabeler", "size": 3202}
]
},
{
"name": "layout",
"children": [
{"name": "AxisLayout", "size": 6725},
{"name": "BundledEdgeRouter", "size": 3727},
{"name": "CircleLayout", "size": 9317},
{"name": "CirclePackingLayout", "size": 12003},
{"name": "DendrogramLayout", "size": 4853},
{"name": "ForceDirectedLayout", "size": 8411},
{"name": "IcicleTreeLayout", "size": 4864},
{"name": "IndentedTreeLayout", "size": 3174},
{"name": "Layout", "size": 7881},
{"name": "NodeLinkTreeLayout", "size": 12870},
{"name": "PieLayout", "size": 2728},
{"name": "RadialTreeLayout", "size": 12348},
{"name": "RandomLayout", "size": 870},
{"name": "StackedAreaLayout", "size": 9121},
{"name": "TreeMapLayout", "size": 9191}
]
},
{"name": "Operator", "size": 2490},
{"name": "OperatorList", "size": 5248},
{"name": "OperatorSequence", "size": 4190},
{"name": "OperatorSwitch", "size": 2581},
{"name": "SortOperator", "size": 2023}
]
},
{"name": "Visualization", "size": 16540}
]
}
]
}
<!DOCTYPE html>
<meta charset="utf-8">
<style>
<head>
<title>Fall 2014 University of Toronto Grading Data</title>
</head>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.dot {
stroke: #000;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var xScale = d3.time.scale()
// .domain([new Date(dataset[0][0].time),d3.time.day.offset(new Date(dataset[0][dataset[0].length-1].time),8)])
// .rangeRound([0, w-padding.left-padding.right]);
// var x = d3.scale.linear()
// .range([0, width]);
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var radius = d3.scale.linear()
.range([0, 0.5 * height])
var color = d3.scale.category20();
// var tip = d3.tip()
// .attr('class', 'd3-tip')
// .offset([-10, 10])
// .html(function(d) {
// return "<strong>Uploaded:</strong> <span style='color:red'>" + d.UploadedPages + "</span>";
// })
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
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 + ")");
// d3.tsv("wdata_full.tsv", function(error, data) {
// data.forEach(function(d) {
// d.Velocity = +d.Velocity;
// d.SentDate = +d.SentDate;
// });
d3.tsv("uoftdata_full.tsv", function(error, data) {
data.forEach(function(d) {
d.SentDate = +parseDate(d.SentDate);
d.Velocity = +d.Velocity;
d.UploadedPages = +d.UploadedPages
});
x.domain(d3.extent(data, function(d) { return d.SentDate; })).nice();
y.domain(d3.extent(data, function(d) { return d.Velocity; })).nice();
radius.domain(d3.extent(data, function(d) { return d.UploadedPages; })).nice();
// Define x axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sent Date (Day of Year)");
// Define y axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Velocity (pages/minute");
//Define dots of data on the grid
svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", function(d) {return Math.sqrt(radius(d.UploadedPages)); })
// .attr("r", 3.5)
.attr("cx", function(d) { return x(d.SentDate); })
.attr("cy", function(d) { return y(d.Velocity); })
.style("fill", function(d) { return color(d.Course); })
.append("svg:title")
.text(function(d){ return " " + d.Course + "\n " + d.Slug + "\n " + d.UploadedPages + " " + "pages" + "\n " +d.ReturnInterval + " " + "days"});
// .text(function(d) { return "Slug:" + d.Slug ;})
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
});
</script>
<h1> Grading Performance Visualizations </h1>
<h2>
<a href="index.html">Grading Velocity vs. Day of Year</a><br>
<a href="return.html">Return Inteval vs. Day of Year</a><br>
<a href="uploaded.html">Uploaded Pages vs. Day of Year</a><br>
</h2>
d3.nest()
.key(function(d) { return d.Course; })
.map(data);
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
return previousValue + currentValue;
});
//
d3.nest()
.key(function(d) { return d.Course; })
.rollup(function(leaves) { return {"Number of Assessments": leaves.length, "total_evaluated": d3.sum(leaves, function(d) {return parseFloat(d.EvaluatedPages);})} })
.map(data);
//
d3.nest()
.key(function(d) { return d.Course; })
.rollup(function(values) { return d3.sum(values, function(d) {return +d.EvaluatedPages; }) })
.map(data);
//
d3.nest()
.key(function(d) { return d.SentDate; })
.rollup(function(values) { return d3.sum(values, function(d) {return +d.EvaluatedPages; }) })
.map(data);
<!DOCTYPE html>
<meta charset="utf-8">
<style>
<head>
<title>Fall 2014 University of Toronto Grading Data</title>
</head>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.dot {
stroke: #000;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var xScale = d3.time.scale()
// .domain([new Date(dataset[0][0].time),d3.time.day.offset(new Date(dataset[0][dataset[0].length-1].time),8)])
// .rangeRound([0, w-padding.left-padding.right]);
// var x = d3.scale.linear()
// .range([0, width]);
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var radius = d3.scale.linear()
.range([0, 0.5 * height])
var color = d3.scale.category20();
// var tip = d3.tip()
// .attr('class', 'd3-tip')
// .offset([-10, 10])
// .html(function(d) {
// return "<strong>Uploaded:</strong> <span style='color:red'>" + d.UploadedPages + "</span>";
// })
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
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 + ")");
// d3.tsv("wdata_full.tsv", function(error, data) {
// data.forEach(function(d) {
// d.Velocity = +d.Velocity;
// d.SentDate = +d.SentDate;
// });
d3.tsv("uoftdata_full.tsv", function(error, data) {
data.forEach(function(d) {
d.SentDate = parseDate(d.SentDate);
d.ReturnInterval = +d.ReturnInterval;
d.UploadedPages = + d.UploadedPages
});
x.domain(d3.extent(data, function(d) { return d.SentDate; })).nice();
y.domain(d3.extent(data, function(d) { return d.ReturnInterval; })).nice();
radius.domain(d3.extent(data, function(d) { return d.UploadedPages; })).nice();
// Define x axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sent Date (Day of Year)");
// Define y axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Return (days)")
// //Define dots of data on the grid
// svg.selectAll(".dot")
// .data(data)
// .enter().append("circle")
// .attr("class", "dot")
// .attr("r", function(d) {return Math.sqrt(radius(d.UploadedPages)); })
// // .attr("r", 3.5)
// .attr("cx", function(d) { return x(d.SentDate); })
// .attr("cy", function(d) { return y(d.ReturnInterval); })
// .style("fill", function(d) { return color(d.Course); })
// .append("svg:title")
// .text(function(d){ return " " + d.Course + "\n " + d.Slug + "\n " + d.UploadedPages + " " + "pages" + "\n " +d.ReturnInterval + " " + "days"});
// // .text(function(d) { return "Slug:" + d.Slug ;})
//Define dots of data on the grid
svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", function(d) {return Math.sqrt(radius(d.UploadedPages)); })
// .attr("r", 3.5)
.attr("cx", function(d) { return x(d.SentDate); })
.attr("cy", function(d) { return y(d.ReturnInterval); })
.style("fill", function(d) { return color(d.Course); })
.append("svg:title")
.text(function(d){ return " " + d.Course + "\n " + d.Slug + "\n " + d.UploadedPages + " " + "pages" + "\n " +d.ReturnInterval + " " + "days"});
// .text(function(d) { return "Slug:" + d.Slug ;})
// svg.selectAll(".dot")
// .data(data)
// .enter().append("circle")
// .attr("class", "dot")
// .attr("r", 5)
// .attr("cx", function(d) { return x(d.SentDate); })
// .attr("cy", function(d) { return y(d.ReturnInterval); })
// .style("fill", function(d) { return color(d.Course); });
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
});
</script>
<h1> Grading Performance Visualizations </h1>
<h2>
<a href="index.html">Grading Velocity vs. Day of Year</a><br>
<a href="return.html">Return Inteval vs. Day of Year</a><br>
<a href="uploaded.html">Uploaded Pages vs. Day of Year</a><br>
</h2>
Course UploadedPages Slug Hours Assessments UnevaluatedPagesPerBooklet EvaluatedPages Velocity UploadedDate SentDate ReturnInterval
MIE262 116 mie262-tutorial-assignment-2 2.03 116 0 116 0.952380952 2014-09-23 2014-09-28 5
MIE365 752 mie365-2014-test1 5.59 47 1 705 2.1019678 2014-10-01 2014-10-21 20
MAT188 9618 mat188test1 66.51 962 2 7694 1.928030873 2014-10-06 2014-10-11 5
MIE262 232 mie262-tutorial-assignment-4 1.81 116 0 232 2.136279926 2014-10-07 2014-10-09 2
MAT292 2544 mat292-test-1-45f64 14.56 159 5 1749 2.00206044 2014-10-09 2014-10-14 5
MAT186 9079 mat186test1 62.62 908 2 7263 1.93308847 2014-10-09 2014-10-16 7
MIE262 1148 mie262-fall-2014-term-test-1 16.04 115 3 803 0.834372402 2014-10-21 2014-10-25 4
MIE262 222 mie262-tutorial-assignment-6 1.28 111 0 222 2.890625 2014-10-21 2014-10-31 10
MAT137 9420 mat137-test-1-october-2014 59.93 942 3 6594 1.833806107 2014-10-23 2014-10-28 5
MIE250 720 mie250-fall-2014-midterm-aeb09 11.65 120 2 480 0.686695279 2014-10-24 2014-10-28 4
ECO206 1708 eco-206-midterm-1-section-101 10.09 122 4 1220 2.015196564 2014-10-24 2014-11-06 13
ECO206 2192 eco-206-midterm-1-section-501 14.26 137 4 1644 1.921458626 2014-10-24 2014-11-06 13
MAT137 210 mat137-test1-october2014-mu 2.45 21 3 147 1 2014-10-25 2014-10-28 3
MIE262 222 mie262-tutorial-assignment-7 0.88 111 0 222 4.204545455 2014-10-28 2014-11-30 33
AST101 8099 midterm-56b55 53.44 1350 2 5399 1.68381986 2014-10-30 2014-10-31 1
MIE365 450 mie365-2014-test2 4.16 45 2 360 1.442307692 2014-10-30 2014-11-16 17
MIE566 552 mie566-midterm-2014 11.82 46 2 460 0.648618161 2014-10-30 2014-11-24 25
ECO200 2226 eco-200-t1 9.92 159 1 2067 3.472782258 2014-10-31 2014-11-03 3
ECO200 1088 eco200-2014-15-test-1 20.7 136 2 816 0.657004831 2014-11-03 2014-11-12 9
MIE262 212 mie262-tutorial-assignment-8 0.85 106 0 212 4.156862745 2014-11-04 2014-11-30 26
MAT292 3158 mat292-test-2 8.53 158 4 2526 4.935521688 2014-11-07 2014-11-14 7
MAT188 9579 mat188test2 74.31 958 2 7663 1.718700938 2014-11-08 2014-11-17 9
ECO204 7854 midterm-one-71913 141.96 561 4 5610 0.658636236 2014-11-08 2014-11-28 20
MIE262 920 mie262-term-test-2 8.7 115 3 575 1.101532567 2014-11-14 2014-11-19 5
MAT186 8898 mat186test2 55.98 890 2 7118 2.119209241 2014-11-14 2014-11-21 7
MAT137 8776 mat137-test2-november-2014 84.86 878 3 6142 1.206300573 2014-11-27 2014-11-30 3
MIE365 492 mie365-2014-test3-5a610 6.49 41 1 451 1.15819209 2014-11-27 2014-12-07 10
MAT137 216 mat137-test2-mu-november-2014 4.47 18 3 162 0.604026846 2014-11-29 2014-11-30 1
MAT292 2848 mat292-finale-2014 21.52 162 4 2200 1.703841388 2014-12-05 2014-12-15 10
MIE250 648 mie250-fall-2014-final-exam-b3bcc 6.4 108 1 540 1.40625 2014-12-09 2014-12-13 4
MAT188 9478 mat188exam 77.85 948 2 7582 1.623207022 2014-12-09 2014-12-13 4
<!DOCTYPE html>
<meta charset="utf-8">
<style>
<head>
<title>Fall 2014 University of Toronto Grading Data</title>
</head>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.dot {
stroke: #000;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var xScale = d3.time.scale()
// .domain([new Date(dataset[0][0].time),d3.time.day.offset(new Date(dataset[0][dataset[0].length-1].time),8)])
// .rangeRound([0, w-padding.left-padding.right]);
// var x = d3.scale.linear()
// .range([0, width]);
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var color = d3.scale.category20();
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
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 + ")");
// d3.tsv("wdata_full.tsv", function(error, data) {
// data.forEach(function(d) {
// d.UploadedPages = +d.UploadedPages;
// d.SentDate = +d.SentDate;
// });
d3.tsv("uoftdata_full.tsv", function(error, data) {
data.forEach(function(d) {
d.SentDate = parseDate(d.SentDate);
d.UploadedPages = +d.UploadedPages;
});
x.domain(d3.extent(data, function(d) { return d.SentDate; })).nice();
y.domain(d3.extent(data, function(d) { return d.UploadedPages; })).nice();
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sent Date (Day of Year)");
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Page Images Uploaded")
svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.SentDate); })
.attr("cy", function(d) { return y(d.UploadedPages); })
.style("fill", function(d) { return color(d.Course); });
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
});
</script>
<h1> Grading Performance Visualizations </h1>
<h2>
<a href="index.html">Grading Velocity vs. Day of Year</a><br>
<a href="return.html">Return Inteval vs. Day of Year</a><br>
<a href="uploaded.html">Uploaded Pages vs. Day of Year</a><br>
</h2>
<!DOCTYPE html>
<meta charset="utf-8">
<style>
<head>
<title>Fall 2014 University of Toronto Grading Data</title>
</head>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.dot {
stroke: #000;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
// var xScale = d3.time.scale()
// .domain([new Date(dataset[0][0].time),d3.time.day.offset(new Date(dataset[0][dataset[0].length-1].time),8)])
// .rangeRound([0, w-padding.left-padding.right]);
// var x = d3.scale.linear()
// .range([0, width]);
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var color = d3.scale.category20();
var UploadsTime = d3.nest()
.key(function(d) { return d.UploadedDate; }).sortKeys(d3.descending)
.rollup(function(larry) { return d3.sum(larry, function(d) {return +d.UploadedPages ; }) })
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
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 + ")");
// d3.tsv("wdata_full.tsv", function(error, data) {
// data.forEach(function(d) {
// d.UploadedPages = +d.UploadedPages;
// d.SentDate = +d.SentDate;
// });
d3.tsv("uoftdata_full.tsv", function(error, data) {
data.forEach(function(d) {
d.SentDate = parseDate(d.SentDate);
d.UploadedPages = +d.UploadedPages;
});
x.domain(d3.extent(data, function(d) { return d.SentDate; })).nice();
y.domain(d3.extent(data, function(d) { return d.UploadedPages; })).nice();
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sent Date (Day of Year)");
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Page Images Uploaded")
svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.SentDate); })
.attr("cy", function(d) { return y(d.UploadedPages); })
.style("fill", function(d) { return color(d.Course); });
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });
});
</script>
<h1> Grading Performance Visualizations </h1>
<h2>
<a href="index.html">Grading Velocity vs. Day of Year</a><br>
<a href="return.html">Return Inteval vs. Day of Year</a><br>
<a href="uploaded.html">Uploaded Pages vs. Day of Year</a><br>
</h2>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment