var person_data = {9999: {'mentioned': 0, 'recipient': 193, 'creator': 167}, 1690: {'mentioned': 150, 'recipient': 1, 'creator': 0}, 1691: {'mentioned': 0, 'recipient': 2, 'creator': 0}, 1692: {'mentioned': 5, 'recipient': 0, 'creator': 0}, 1693: {'mentioned': 0, 'recipient': 0, 'creator': 0}, 1694: {'mentioned': 0, 'recipient': 0, 'creator': 0}, 1695: {'mentioned': 0, 'recipient': 0, 'creator': 0}, 1696: {'mentioned': 5, 'recipient': 0, 'creator': 0}, 1697: {'mentioned': 0, 'recipient': 0, 'creator': 0}, 1698: {'mentioned': 0, 'recipient': 0, 'creator': 0}, 1699: {'mentioned': 3, 'recipient': 1, 'creator': 0}, 1700: {'mentioned': 0, 'recipient': 3, 'creator': 2}, 1701: {'mentioned': 0, 'recipient': 4, 'creator': 0}, 1702: {'mentioned': 0, 'recipient': 12, 'creator': 1}, 1703: {'mentioned': 0, 'recipient': 25, 'creator': 3}, 1704: {'mentioned': 0, 'recipient': 37, 'creator': 21}, 1705: {'mentioned': 0, 'recipient': 300, 'creator': 20}, 1706: {'mentioned': 0, 'recipient': 80, 'creator': 33}, 1707: {'mentioned': 0, 'recipient': 81, 'creator': 43}, 1708: {'mentioned': 0, 'recipient': 116, 'creator': 58}, 1709: {'mentioned': 0, 'recipient': 113, 'creator': 54}, 1710: {'mentioned': 0, 'recipient': 91, 'creator': 35}, 1711: {'mentioned': 0, 'recipient': 146, 'creator': 58}, 1712: {'mentioned': 0, 'recipient': 110, 'creator': 79}, 1713: {'mentioned': 0, 'recipient': 110, 'creator': 20}, 1714: {'mentioned': 0, 'recipient': 113, 'creator': 4}, 1715: {'mentioned': 0, 'recipient': 187, 'creator': 27}, 1716: {'mentioned': 0, 'recipient': 196, 'creator': 76}, 1717: {'mentioned': 0, 'recipient': 122, 'creator': 96}, 1718: {'mentioned': 0, 'recipient': 152, 'creator': 65}, 1719: {'mentioned': 0, 'recipient': 151, 'creator': 77}, 1720: {'mentioned': 0, 'recipient': 189, 'creator': 42}, 1721: {'mentioned': 0, 'recipient': 122, 'creator': 16}, 1722: {'mentioned': 0, 'recipient': 152, 'creator': 30}, 1723: {'mentioned': 0, 'recipient': 115, 'creator': 24}, 1724: {'mentioned': 10, 'recipient': 102, 'creator': 49}, 1725: {'mentioned': 0, 'recipient': 115, 'creator': 40}, 1726: {'mentioned': 0, 'recipient': 88, 'creator': 33}, 1727: {'mentioned': 0, 'recipient': 134, 'creator': 61}, 1728: {'mentioned': 0, 'recipient': 75, 'creator': 56}, 1729: {'mentioned': 0, 'recipient': 153, 'creator': 58}, 1730: {'mentioned': 0, 'recipient': 114, 'creator': 29}, 1731: {'mentioned': 0, 'recipient': 126, 'creator': 32}, 1732: {'mentioned': 0, 'recipient': 109, 'creator': 39}, 1733: {'mentioned': 0, 'recipient': 97, 'creator': 32}, 1734: {'mentioned': 0, 'recipient': 92, 'creator': 29}, 1735: {'mentioned': 0, 'recipient': 37, 'creator': 13}}; var unknownYear = "9999", unknownYearText = "?", showUnknown = false; var all_charts = ['creator','recipient','mentioned'], all_chart_titles = ['Letters written','Addressee of letters','Mentioned in']; var have = { creator : false , recipient: false, mentioned: false, unknown : false }; // Switch old data format to new data format. // TODO: do this in Pylons template var person_data_keys = Object.keys(person_data); var person_data_without_unknown = [], year; for( var i=0;i 40 ) ticks_every = 1; else if( widthBar > 20 ) ticks_every = 3; else if( widthBar > 10 ) ticks_every = 5; for( var j=0;j= y_ticks * 3) { y_ticks *= 3; } return y_ticks; } function getChart( number ) { if( number < charts.length ) { return charts[number]; } return ""; } if( showUnknown ) { person_data = person_data_with_unknown; } else { person_data = person_data_without_unknown; } var max_value = getMax( person_data, showUnknown ); // Make an empty copy var person_data_dummy = []; for( var i=0; i 10 ); //if( stretchLowerYScale ) // yScale.domain( [0,10,max_value] ).range( [chart_height,chart_height - chart_height/4,0] ); // enhance values between 1 and 10 so we can see them easier. //else yScale.domain( [0,max_value] ).rangeRound( [chart_height,0] ); // // Create Xscale // var xScaleDomain = getXScaleDomain( showUnknown ); var xScale = d3.scale.ordinal() .domain( xScaleDomain ) .rangeRoundBands([0, chart_width], 0.2 ) ; var y_ticks = getYAxisTickNumber( max_value, bars_are ); var yTickMarks = yScale.ticks(y_ticks); //if( stretchLowerYScale ) { // yTickMarks.push(10); //} svgChart.append( "svg:g" ).classed("guidelines", 1 ).selectAll( "line.guideline." + chart ) .data( yTickMarks, function(d,j) { return (d==0) ? 0 : j + "-" + chart; } ) .enter().append("line") .classed( "guideline", 1 ) .classed( chart, 1 ) .attr("x1", chart_x ) .attr("x2", chart_x + chart_width ) .attr("y1", function(d) { return chart_y + yScale(d); }) .attr("y2", function(d) { return chart_y + yScale(d); }) ; // // Axes // var xAxisTicks = getXAxisTicks( xScale.domain(), chart_width ); var xAxis = d3.svg.axis() .scale(xScale) .orient("bottom") .tickValues( xAxisTicks ) ; var yAxis = d3.svg.axis() .scale( yScale ) .orient( "left" ) .tickFormat( d3.format("f") ) .ticks( y_ticks ) .tickSize( 4,2,0 ); ; if( bars_are != 'seperate' ) { yAxis.tickSubdivide( 4 ); } else { yAxis.tickSubdivide( 0 ) } axes[chart] = { x: xAxis, y: yAxis }; svgChart.append( "svg:g" ) .classed( "xaxis", 1 ).classed( "axis", 1 ).classed("label", 1 ).classed( chart, 1 ) .attr( "transform", "translate(" + chart_x + "," + (chart_y + chart_height) + ")" ) .call( xAxis ) ; svgChart.append( "svg:g" ) .classed( "yaxis",1 ).classed( "axis", 1 ).classed( "label", 1 ).classed( chart, 1 ) .attr( "transform", "translate(" + chart_x + "," + chart_y + ")" ) .call( yAxis ) ; } } function updateCharts( duration, delay ) { person_data = ( showUnknown ) ? person_data_with_unknown : person_data_without_unknown; person_data_length = person_data.length; max_value = getMax( person_data, showUnknown, chart ); var chart_height = svg_height_base - label_space_top - label_space_bottom; var chart_x = label_space_left; if( bars_are == "stacked" || bars_are == "split" ) { chart_height = svg_height - label_space_top - label_space_bottom; } // // Update Y scale // //stretchLowerYScale = ( (max_value / 4) > 10 ); //if( stretchLowerYScale ) // yScale.domain( [0,10,max_value] ).range( [chart_height,chart_height - chart_height/4,0] ); // enhance values between 1 and 10 so we can see them easier. //else yScale.domain( [0,max_value] ).range( [chart_height,0] ); // // Update Xscale // var xScaleDomain = getXScaleDomain( showUnknown ); xScale.domain( xScaleDomain ); // // Axes // // Work out what years to display given space. var xAxisTicks = getXAxisTicks( xScale.domain(), chart_width ); var y_ticks = getYAxisTickNumber( max_value, bars_are ) // Update axes. for( j = 0; j < charts.length; j++ ) { var chart = charts[j]; var xAxis = axes[chart].x; var yAxis = axes[chart].y; xAxis.scale(xScale) .tickValues( xAxisTicks ) ; yAxis.scale(yScale) .ticks(y_ticks) ; if( bars_are != 'seperate' ) { yAxis.tickSubdivide(4); } else { yAxis.tickSubdivide(0) } svgChart.select( ".xaxis." + chart ) .transition().duration( duration ) .call(xAxis) ; svgChart.select( ".yaxis." + chart ) .transition().duration( duration ) .call(yAxis) ; } // Vertical lines var yTickMarks = yScale.ticks(y_ticks); //if( stretchLowerYScale ) { // yTickMarks.push(10); //} var guidelines = svgChart.select( "g.guidelines" ).selectAll( "line.guideline." + getChart( 0 ) ) .data( yTickMarks , function(d,i) { return (d==0) ? 0 : i + "-" + getChart( 0 ); } ); guidelines.enter().append( "line" ) .classed("guideline", 1 ) .classed( getChart( 0 ), 1 ) .attr("x1", chart_x) .attr("x2", chart_x + chart_width ) .attr("y1", chart_y ) .attr("y2", chart_y ) ; guidelines.exit().remove(); guidelines .transition().duration( duration ) .attr( "y1", function(d) { return label_space_top + yScale(d); } ) .attr( "y2", function(d) { return label_space_top + yScale(d); } ) ; function fade( item, fade_in ) { if( fade_in ) { svgChart.selectAll( item ).transition().duration( duration/2 ).delay( 3*duration/2).style( 'opacity','1' ); } else { svgChart.selectAll( item ).transition().duration( 3*duration/2 ).style( 'opacity', '0' ); } } if( bars_are == "stacked" || bars_are == "split" ) { for ( i = 0; i < charts.length-1; i++ ) { // first ones fade( ".xaxis." + charts[i], false ); } for ( i = 1; i < charts.length; i++ ) { // last ones fade( ".yaxis." + charts[i] , false ); fade( ".guideline." + charts[i], false ); fade( ".chart-title." + charts[i], false ); } var title = ""; if( charts.length == 3 ) title = chart_titles[0] + ", " + chart_titles[1] + " and " + chart_titles[2]; else if ( charts.length == 2 ) title = chart_titles[0] + " and " + chart_titles[1]; else if ( charts.length == 1 ) title = chart_titles[0]; svgChart.select( ".chart-title." + getChart( 0 ) ) .text( title ) } if( bars_are == "seperate" ) { for ( i = 0; i < charts.length-1; i++ ) { fade( ".xaxis." + charts[i], true ); } for ( i = 1; i < charts.length; i++ ) { fade( ".yaxis." + charts[i] , true ); fade( ".guideline." + charts[i], true ); fade( ".chart-title." + charts[i], true ); } if( charts.length > 0 ) { svgChart.select( ".chart-title." + getChart( 0 ) ) .text( chart_titles[0] ) } } for( var i=0; i 0 ) { var buttons = ""; if( have.unknown ) { buttons += '
'; buttons += ''; buttons += ''; buttons += '
'; } if( charts.length > 1 ) { buttons += '
'; buttons += ''; buttons += ''; buttons += ''; buttons += '
'; } if( buttons != "" ) { d3.select('#chart_buttons').html(buttons); } updateCharts( 500, function (d,i) { return i * (1200/person_data_length); } ) ; }