Skip to content

Instantly share code, notes, and snippets.

@dbetebenner
Last active March 7, 2017 08:35
Show Gist options
  • Select an option

  • Save dbetebenner/f76af3a47b93b6e1b2acacc378f48df2 to your computer and use it in GitHub Desktop.

Select an option

Save dbetebenner/f76af3a47b93b6e1b2acacc378f48df2 to your computer and use it in GitHub Desktop.

Revisions

  1. dbetebenner revised this gist Mar 7, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions .block
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    license:gpl-3.0
    height:600
    height:500
    border:no
    Raw
    Raw
  2. dbetebenner revised this gist Mar 7, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -53,15 +53,15 @@

    .correlationLabel {
    text-anchor: left;
    font: 28px Avenir;
    font: 21px Avenir;
    fill: #ef9b00;
    stroke: black;
    stroke-width: 0.5px;
    }

    .titleLabel {
    text-anchor: middle;
    font: 30px Avenir;
    font: 25px Avenir;
    fill: black;
    stroke-width: 0.5px;
    }
  3. dbetebenner revised this gist Mar 7, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -105,8 +105,8 @@

    <script>
    var margin = {top: 60, right: 20, bottom: 100, left: 70},
    width = 960 - margin.left - margin.right,
    height = 600 - margin.top - margin.bottom;
    width = 800 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

    /*
    * value accessor - returns the value to encode for a given data object.
  4. dbetebenner revised this gist Mar 7, 2017. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion index.html
    Original file line number Diff line number Diff line change
    @@ -3,7 +3,6 @@
    <head>
    <title>D3 Block-a-Day: Day 22, January 22nd, 2017</title>
    </head>
    <!-- Example based on Michele Weigle's D3 Scatterplot Example http://bl.ocks.org/weiglemc/6185069 -->

    <style>
    body {
  5. dbetebenner revised this gist Mar 7, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion index.html
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    <!DOCTYPE html>
    <meta charset="utf-8">
    <head>
    <title>D3 Block-a-Day: Day 16, January 22nd, 2017</title>
    <title>D3 Block-a-Day: Day 22, January 22nd, 2017</title>
    </head>
    <!-- Example based on Michele Weigle's D3 Scatterplot Example http://bl.ocks.org/weiglemc/6185069 -->

  6. dbetebenner revised this gist Mar 7, 2017. 5 changed files with 341 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    ## D3 Block-a-Day: Day 22, January, 22th 2017

    New Year's Resolution for 2017: Make a D3 Block a day to teach myself D3. This is Number 22. This example
    reduces the size of the [January 20th baseball wins scatter plot](https://github.com/dbetebenner/D3_01202017).
    Like previously, the correlation is supplied in the data set which is JSON.
    1 change: 1 addition & 0 deletions baseball_team_wins.json
    1 addition, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
    335 changes: 335 additions & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,335 @@
    <!DOCTYPE html>
    <meta charset="utf-8">
    <head>
    <title>D3 Block-a-Day: Day 16, January 22nd, 2017</title>
    </head>
    <!-- Example based on Michele Weigle's D3 Scatterplot Example http://bl.ocks.org/weiglemc/6185069 -->

    <style>
    body {
    font: 16pt Avenir;
    }

    .axis path,
    .axis line {
    fill: none;
    stroke: #000;
    shape-rendering: crispEdges;
    }

    .dot {
    stroke: black;
    stroke-width: 2px;
    fill: #00c6c0;
    }

    .tooltip {
    background-color: #fedea3;
    padding: 7px;
    text-shadow: #f5f5f5 0 1px 0;
    font: 15px Avenir;
    border: 2px solid;
    border-color: black;
    border-radius: 5px;
    position: absolute;
    box-shadow: rgba(0, 0, 0, 0.3) 0 2px 10px;
    }

    .xaxis {
    font: 16px Avenir;
    }

    .xaxisLabel {
    text-anchor: left;
    font-family: Avenir;
    }
    .yaxis {
    font: 16px Avenir;
    }

    .yaxisLabel {
    text-anchor: middle;
    font-family: Avenir;
    }

    .correlationLabel {
    text-anchor: left;
    font: 28px Avenir;
    fill: #ef9b00;
    stroke: black;
    stroke-width: 0.5px;
    }

    .titleLabel {
    text-anchor: middle;
    font: 30px Avenir;
    fill: black;
    stroke-width: 0.5px;
    }
    .ticks {
    font: 12px Avenir;
    }

    .track,
    .track-inset,
    .track-overlay {
    stroke-linecap: round;
    }

    .track {
    stroke: #000;
    stroke-opacity: 0.3;
    stroke-width: 10px;
    }

    .track-inset {
    stroke: #ddd;
    stroke-width: 8px;
    }

    .track-overlay {
    pointer-events: stroke;
    stroke-width: 50px;
    cursor: crosshair;
    }

    .handle {
    fill: #fff;
    stroke: #000;
    stroke-opacity: 0.5;
    stroke-width: 1.25px;
    }

    </style>
    <body>
    <script src="//d3js.org/d3.v4.min.js"></script>

    <script>
    var margin = {top: 60, right: 20, bottom: 100, left: 70},
    width = 960 - margin.left - margin.right,
    height = 600 - margin.top - margin.bottom;

    /*
    * value accessor - returns the value to encode for a given data object.
    * scale - maps value to a visual display encoding, such as a pixel position.
    * map function - maps from data value to display value
    * axis - sets up axis
    */

    // setup x
    var xValue = function(d) { return d.winsPrev; }, // data -> value
    xScale = d3.scaleLinear().range([0, width]), // value -> display
    xMap = function(d) { return xScale(xValue(d));}, // data -> display
    xAxis = d3.axisBottom(xScale);

    // setup y
    var yValue = function(d) { return d.wins; }, // data -> value
    yScale = d3.scaleLinear().range([height, 0]), // value -> display
    yMap = function(d) { return yScale(yValue(d));}, // data -> display
    yAxis = d3.axisLeft(yScale);

    // for slider
    var x = d3.scaleLinear()
    .domain([2016, 1902])
    .range([0, width])
    .clamp(true);

    // add the graph canvas to the body of the webpage
    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 + ")");

    // add the tooltip area to the webpage
    var tooltip = d3.select("body").append("div")
    .attr("class", "tooltip")
    .style("opacity", 0);

    // load data
    d3.json("baseball_team_wins.json", function(error, data) {
    if (error) return console.warn(error);

    // don't want dots overlapping axis, so add in buffer to data domain
    xScale.domain([30, 120]);
    yScale.domain([30, 120]);

    var activeYear = 2016;

    // x-axis
    svg.append("g")
    .attr("class", "xaxis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);

    // x-axis label
    svg.append("text")
    .attr('class', 'xAxisLabel')
    .attr("transform",
    "translate(" + (width*0.1) + " ," +
    (height + margin.top) + ")")
    .text("Wins " + (activeYear - 1));

    // y-axis
    svg.append("g")
    .attr("class", "yaxis")
    .call(yAxis);

    // y-axis label
    svg.append("text")
    .attr('class', 'yAxisLabel')
    .attr("transform", "rotate(-90)")
    .attr("y", 10 - margin.left)
    .attr("x", - 0.75*height)
    .attr("dy", ".71em")
    .text("Wins " + activeYear);

    var years = data.filter(y => {
    return y.year === activeYear || y.year === activeYear - 1;
    });
    var teams = years[0].teams;
    var correlation = years[0].correlation;
    teams.forEach((t, i) => {
    var sameTeamPrevYear = years[1].teams.filter(t2 => {
    return t2.name === t.name;
    });
    t.winsPrev = sameTeamPrevYear[0].wins;
    });

    // add in the slider
    var slider = svg.append("g")
    .attr("class", "slider")
    .attr("transform", "translate(" + 0 + "," + (height + margin.top + 20) + ")");

    var yearActual = 2016,
    yearTarget = 2016,
    yearTimer = d3.timer(yearTween);

    slider.append("line")
    .attr("class", "track")
    .attr("x1", x.range()[0])
    .attr("x2", x.range()[1])
    .select(function() { return this.parentNode.appendChild(this.cloneNode(true)); })
    .attr("class", "track-inset")
    .select(function() { return this.parentNode.appendChild(this.cloneNode(true)); })
    .attr("class", "track-overlay")
    .call(d3.drag()
    .on("start.interrupt", function() { slider.interrupt(); })
    .on("start drag", function() { year(x.invert(d3.event.x)); }));

    slider.insert("g", ".track-overlay")
    .attr("class", "ticks")
    .attr("transform", "translate(0," + 18 + ")")
    .selectAll("text")
    .data(x.ticks(10))
    .enter().append("text")
    .attr("x", x)
    .attr("text-anchor", "middle")
    .text(function(d) { return d; });

    var handle = slider.insert("circle", ".track-overlay")
    .attr("class", "handle")
    .attr("r", 9);

    function year(h) {
    yearTarget = h;
    yearTimer.restart(yearTween);
    }

    function yearTween() {
    yearActual = yearTarget;
    handle.attr("cx", x(yearActual));
    update(yearActual);
    }

    // draw dots
    svg.selectAll(".dot")
    .data(teams)
    .enter()
    .append("circle")
    .attr("class", "dot")
    .attr("r", 10)
    .attr("cx", xMap)
    .attr("cy", yMap)
    .on("mouseover", function(d) {
    tooltip.transition()
    .duration(75)
    .style("opacity", .9);
    tooltip.html("<b>" + d.name + "</b>" + "<br/>" + (activeYear - 1) + ": " + xValue(d)
    + " Wins, " + activeYear + ": " + yValue(d) + " Wins")
    .style("left", (d3.event.pageX + 5) + "px")
    .style("top", (d3.event.pageY - 28) + "px");
    })
    .on("mouseout", function(d) {
    tooltip.transition()
    .duration(300)
    .style("opacity", 0);
    });

    svg.append("text")
    .attr('class', 'correlationLabel')
    .attr("transform",
    "translate(50, 70)")
    .text("Correlation = " + correlation);

    svg.append("text")
    .attr('class', 'titleLabel')
    .attr("transform",
    "translate(" + width/2 + ", -20)")
    .text("MLB Baseball Team Wins in Consecutive Years: " + (activeYear - 1) + " & " + activeYear );

    function update(year) {
    var activeYear = Math.round(year);
    var years = data.filter(y => {
    return y.year === activeYear || y.year === activeYear - 1;
    });
    if(!years.length) return;
    var teams = years[0].teams;
    var correlation = years[0].correlation;
    teams.forEach((t, i) => {
    var sameTeamPrevYear = years[1].teams.filter(t2 => {
    return t2.name === t.name;
    });
    t.winsPrev = sameTeamPrevYear[0].wins;
    });

    // x-axis label
    d3.select('.xAxisLabel')
    .text("Wins " + (activeYear - 1));

    // y-axis label
    d3.select('.yAxisLabel')
    .text("Wins " + activeYear);

    // correlation label
    d3.select('.correlationLabel')
    .text("Correlation = " + correlation)

    // title label
    d3.select(".titleLabel")
    .text("MLB Baseball Team Wins in Consecutive Years: " + (activeYear - 1) + " & " + activeYear );

    // Scatterplot
    svg.selectAll(".dot")
    .data(teams)
    .attr("cx", xMap)
    .attr("cy", yMap)
    .on("mouseover", function(d) {
    tooltip.transition()
    .duration(75)
    .style("opacity", .9);
    tooltip.html("<b>" + d.name + "</b>" + "<br/>" + (activeYear - 1) + ": " + xValue(d)
    + " Wins, " + activeYear + ": " + yValue(d) + " Wins")
    .style("left", (d3.event.pageX + 5) + "px")
    .style("top", (d3.event.pageY - 28) + "px");
    })
    .on("mouseout", function(d) {
    tooltip.transition()
    .duration(300)
    .style("opacity", 0);
    });
    } //END update
    });

    </script>
    </body>
    Binary file added preview.png
    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
    Binary file added thumbnail.png
    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
  7. dbetebenner renamed this gist Mar 7, 2017. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  8. dbetebenner created this gist Mar 7, 2017.
    4 changes: 4 additions & 0 deletions .bl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,4 @@
    license:gpl-3.0
    height:600
    border:no
    Raw