This variation of a bivariate area chart uses clipping to alternate colors. When New York is warmer than San Francisco, the difference between the two is filled in green. When San Francisco is warmer, the difference is filled in red. A similar technique was used by William Playfair all the way back in 1786.
-
-
Save mbostock/3894205 to your computer and use it in GitHub Desktop.
Difference Chart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
license: gpl-3.0 | |
redirect: https://beta.observablehq.com/@mbostock/d3-difference-chart |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
date | New York | San Francisco | |
---|---|---|---|
20111001 | 63.4 | 62.7 | |
20111002 | 58.0 | 59.9 | |
20111003 | 53.3 | 59.1 | |
20111004 | 55.7 | 58.8 | |
20111005 | 64.2 | 58.7 | |
20111006 | 58.8 | 57.0 | |
20111007 | 57.9 | 56.7 | |
20111008 | 61.8 | 56.8 | |
20111009 | 69.3 | 56.7 | |
20111010 | 71.2 | 60.1 | |
20111011 | 68.7 | 61.1 | |
20111012 | 61.8 | 61.5 | |
20111013 | 63.0 | 64.3 | |
20111014 | 66.9 | 67.1 | |
20111015 | 61.7 | 64.6 | |
20111016 | 61.8 | 61.6 | |
20111017 | 62.8 | 61.1 | |
20111018 | 60.8 | 59.2 | |
20111019 | 62.1 | 58.9 | |
20111020 | 65.1 | 57.2 | |
20111021 | 55.6 | 56.4 | |
20111022 | 54.4 | 60.7 | |
20111023 | 54.4 | 65.1 | |
20111024 | 54.8 | 60.9 | |
20111025 | 57.9 | 56.1 | |
20111026 | 54.6 | 54.6 | |
20111027 | 54.4 | 56.1 | |
20111028 | 42.5 | 58.1 | |
20111029 | 40.9 | 57.5 | |
20111030 | 38.6 | 57.7 | |
20111031 | 44.2 | 55.1 | |
20111101 | 49.6 | 57.9 | |
20111102 | 47.2 | 64.6 | |
20111103 | 50.1 | 56.2 | |
20111104 | 50.1 | 50.5 | |
20111105 | 43.5 | 51.3 | |
20111106 | 43.8 | 52.6 | |
20111107 | 48.9 | 51.4 | |
20111108 | 55.5 | 50.6 | |
20111109 | 53.7 | 54.6 | |
20111110 | 57.7 | 55.6 | |
20111111 | 48.5 | 53.9 | |
20111112 | 46.8 | 54.0 | |
20111113 | 51.1 | 53.8 | |
20111114 | 56.8 | 53.5 | |
20111115 | 59.7 | 53.4 | |
20111116 | 56.5 | 52.2 | |
20111117 | 49.6 | 52.7 | |
20111118 | 41.5 | 53.1 | |
20111119 | 44.3 | 49.0 | |
20111120 | 54.0 | 50.4 | |
20111121 | 54.1 | 51.1 | |
20111122 | 49.4 | 52.3 | |
20111123 | 50.0 | 54.6 | |
20111124 | 44.0 | 55.1 | |
20111125 | 50.3 | 51.5 | |
20111126 | 52.1 | 53.6 | |
20111127 | 49.6 | 52.3 | |
20111128 | 57.2 | 51.0 | |
20111129 | 59.1 | 49.5 | |
20111130 | 50.6 | 49.8 | |
20111201 | 44.3 | 60.4 | |
20111202 | 43.9 | 62.2 | |
20111203 | 42.1 | 58.3 | |
20111204 | 43.9 | 52.7 | |
20111205 | 50.2 | 51.5 | |
20111206 | 54.2 | 49.9 | |
20111207 | 54.6 | 48.6 | |
20111208 | 43.4 | 46.4 | |
20111209 | 42.2 | 49.8 | |
20111210 | 45.0 | 52.1 | |
20111211 | 33.8 | 48.8 | |
20111212 | 36.8 | 47.4 | |
20111213 | 38.6 | 47.2 | |
20111214 | 41.9 | 46.1 | |
20111215 | 49.6 | 48.8 | |
20111216 | 50.2 | 47.9 | |
20111217 | 40.6 | 49.8 | |
20111218 | 29.1 | 49.1 | |
20111219 | 33.7 | 48.3 | |
20111220 | 45.8 | 49.3 | |
20111221 | 47.4 | 48.4 | |
20111222 | 54.4 | 53.3 | |
20111223 | 47.8 | 47.5 | |
20111224 | 34.9 | 47.9 | |
20111225 | 35.9 | 48.9 | |
20111226 | 43.6 | 45.9 | |
20111227 | 42.9 | 47.2 | |
20111228 | 46.2 | 48.9 | |
20111229 | 30.8 | 50.9 | |
20111230 | 40.8 | 52.9 | |
20111231 | 49.8 | 50.1 | |
20120101 | 46.3 | 53.9 | |
20120102 | 43.2 | 53.1 | |
20120103 | 30.3 | 49.7 | |
20120104 | 19.2 | 52.7 | |
20120105 | 32.1 | 52.6 | |
20120106 | 41.2 | 49.0 | |
20120107 | 47.0 | 51.0 | |
20120108 | 46.0 | 56.8 | |
20120109 | 34.7 | 52.3 | |
20120110 | 39.4 | 51.6 | |
20120111 | 40.4 | 49.8 | |
20120112 | 45.4 | 51.9 | |
20120113 | 40.7 | 53.7 | |
20120114 | 30.4 | 52.9 | |
20120115 | 23.9 | 49.7 | |
20120116 | 22.6 | 45.3 | |
20120117 | 39.8 | 43.6 | |
20120118 | 43.2 | 45.0 | |
20120119 | 26.3 | 47.3 | |
20120120 | 32.8 | 51.4 | |
20120121 | 27.4 | 53.7 | |
20120122 | 25.0 | 48.3 | |
20120123 | 39.4 | 52.9 | |
20120124 | 48.7 | 49.1 | |
20120125 | 43.0 | 52.1 | |
20120126 | 37.1 | 53.6 | |
20120127 | 48.2 | 50.4 | |
20120128 | 43.7 | 50.3 | |
20120129 | 40.1 | 53.8 | |
20120130 | 38.0 | 51.9 | |
20120131 | 43.5 | 50.0 | |
20120201 | 50.4 | 50.0 | |
20120202 | 45.8 | 51.3 | |
20120203 | 37.5 | 51.5 | |
20120204 | 40.8 | 52.0 | |
20120205 | 36.5 | 53.8 | |
20120206 | 39.1 | 54.6 | |
20120207 | 43.2 | 54.3 | |
20120208 | 36.5 | 51.9 | |
20120209 | 36.5 | 53.8 | |
20120210 | 38.3 | 53.9 | |
20120211 | 36.9 | 52.3 | |
20120212 | 29.7 | 50.1 | |
20120213 | 33.1 | 49.5 | |
20120214 | 39.6 | 48.6 | |
20120215 | 42.3 | 49.9 | |
20120216 | 39.7 | 52.4 | |
20120217 | 46.0 | 49.9 | |
20120218 | 41.2 | 51.6 | |
20120219 | 39.8 | 47.8 | |
20120220 | 38.1 | 48.7 | |
20120221 | 37.1 | 49.7 | |
20120222 | 45.5 | 53.4 | |
20120223 | 50.6 | 54.1 | |
20120224 | 42.7 | 55.9 | |
20120225 | 42.6 | 51.7 | |
20120226 | 36.9 | 47.7 | |
20120227 | 40.9 | 45.4 | |
20120228 | 45.9 | 47.0 | |
20120229 | 40.7 | 49.8 | |
20120301 | 41.3 | 48.9 | |
20120302 | 36.8 | 48.1 | |
20120303 | 47.6 | 50.7 | |
20120304 | 44.2 | 55.0 | |
20120305 | 38.5 | 48.8 | |
20120306 | 32.9 | 48.4 | |
20120307 | 43.3 | 49.9 | |
20120308 | 51.2 | 49.2 | |
20120309 | 47.8 | 51.7 | |
20120310 | 37.2 | 49.3 | |
20120311 | 42.9 | 50.0 | |
20120312 | 48.8 | 48.6 | |
20120313 | 52.6 | 53.9 | |
20120314 | 60.5 | 55.2 | |
20120315 | 47.2 | 55.9 | |
20120316 | 44.7 | 54.6 | |
20120317 | 48.2 | 48.2 | |
20120318 | 48.2 | 47.1 | |
20120319 | 53.1 | 45.8 | |
20120320 | 57.8 | 49.7 | |
20120321 | 57.5 | 51.4 | |
20120322 | 57.3 | 51.4 | |
20120323 | 61.7 | 48.4 | |
20120324 | 55.8 | 49.0 | |
20120325 | 48.4 | 46.4 | |
20120326 | 49.8 | 49.7 | |
20120327 | 39.6 | 54.1 | |
20120328 | 49.7 | 54.6 | |
20120329 | 56.8 | 52.3 | |
20120330 | 46.5 | 54.5 | |
20120331 | 42.2 | 56.2 | |
20120401 | 45.3 | 51.1 | |
20120402 | 48.1 | 50.5 | |
20120403 | 51.2 | 52.2 | |
20120404 | 61.0 | 50.6 | |
20120405 | 50.7 | 47.9 | |
20120406 | 48.0 | 47.4 | |
20120407 | 51.1 | 49.4 | |
20120408 | 55.7 | 50.0 | |
20120409 | 58.3 | 51.3 | |
20120410 | 55.0 | 53.8 | |
20120411 | 49.0 | 52.9 | |
20120412 | 51.7 | 53.9 | |
20120413 | 53.1 | 50.2 | |
20120414 | 55.2 | 50.9 | |
20120415 | 62.3 | 51.5 | |
20120416 | 62.9 | 51.9 | |
20120417 | 69.3 | 53.2 | |
20120418 | 59.0 | 53.0 | |
20120419 | 54.1 | 55.1 | |
20120420 | 56.5 | 55.8 | |
20120421 | 58.2 | 58.0 | |
20120422 | 52.4 | 52.8 | |
20120423 | 51.6 | 55.1 | |
20120424 | 49.3 | 57.9 | |
20120425 | 52.5 | 57.5 | |
20120426 | 50.5 | 55.3 | |
20120427 | 51.9 | 53.5 | |
20120428 | 47.4 | 54.7 | |
20120429 | 54.1 | 54.0 | |
20120430 | 51.9 | 53.4 | |
20120501 | 57.4 | 52.7 | |
20120502 | 53.7 | 50.7 | |
20120503 | 53.1 | 52.6 | |
20120504 | 57.2 | 53.4 | |
20120505 | 57.0 | 53.1 | |
20120506 | 56.6 | 56.5 | |
20120507 | 54.6 | 55.3 | |
20120508 | 57.9 | 52.0 | |
20120509 | 59.2 | 52.4 | |
20120510 | 61.1 | 53.4 | |
20120511 | 59.7 | 53.1 | |
20120512 | 64.1 | 49.9 | |
20120513 | 65.3 | 52.0 | |
20120514 | 64.2 | 56.0 | |
20120515 | 62.0 | 53.0 | |
20120516 | 63.8 | 51.0 | |
20120517 | 64.5 | 51.4 | |
20120518 | 61.0 | 52.2 | |
20120519 | 62.6 | 52.4 | |
20120520 | 66.2 | 54.5 | |
20120521 | 62.7 | 52.8 | |
20120522 | 63.7 | 53.9 | |
20120523 | 66.4 | 56.5 | |
20120524 | 64.5 | 54.7 | |
20120525 | 65.4 | 52.5 | |
20120526 | 69.4 | 52.1 | |
20120527 | 71.9 | 52.2 | |
20120528 | 74.4 | 52.9 | |
20120529 | 75.9 | 52.1 | |
20120530 | 72.9 | 52.1 | |
20120531 | 72.5 | 53.3 | |
20120601 | 67.2 | 54.8 | |
20120602 | 68.3 | 54.0 | |
20120603 | 67.7 | 52.3 | |
20120604 | 61.9 | 55.3 | |
20120605 | 58.3 | 53.5 | |
20120606 | 61.7 | 54.1 | |
20120607 | 66.7 | 53.9 | |
20120608 | 68.7 | 54.4 | |
20120609 | 72.2 | 55.0 | |
20120610 | 72.6 | 60.0 | |
20120611 | 69.2 | 57.2 | |
20120612 | 66.9 | 55.1 | |
20120613 | 66.7 | 53.3 | |
20120614 | 67.7 | 53.4 | |
20120615 | 68.5 | 54.6 | |
20120616 | 67.5 | 57.0 | |
20120617 | 64.2 | 55.6 | |
20120618 | 61.7 | 52.5 | |
20120619 | 66.4 | 53.9 | |
20120620 | 77.9 | 55.3 | |
20120621 | 88.3 | 53.3 | |
20120622 | 82.2 | 54.1 | |
20120623 | 77.0 | 55.2 | |
20120624 | 75.4 | 55.8 | |
20120625 | 70.9 | 56.8 | |
20120626 | 65.9 | 57.5 | |
20120627 | 73.5 | 57.7 | |
20120628 | 77.4 | 56.6 | |
20120629 | 79.6 | 56.4 | |
20120630 | 84.2 | 58.4 | |
20120701 | 81.8 | 58.8 | |
20120702 | 82.5 | 56.4 | |
20120703 | 80.2 | 56.5 | |
20120704 | 77.8 | 55.8 | |
20120705 | 86.1 | 54.8 | |
20120706 | 79.9 | 54.9 | |
20120707 | 83.5 | 54.7 | |
20120708 | 81.5 | 52.8 | |
20120709 | 77.8 | 53.7 | |
20120710 | 76.1 | 53.1 | |
20120711 | 76.3 | 52.7 | |
20120712 | 75.8 | 52.0 | |
20120713 | 77.2 | 53.4 | |
20120714 | 79.3 | 54.0 | |
20120715 | 78.9 | 54.0 | |
20120716 | 79.6 | 54.5 | |
20120717 | 83.3 | 56.7 | |
20120718 | 84.3 | 57.5 | |
20120719 | 75.1 | 57.1 | |
20120720 | 68.4 | 58.1 | |
20120721 | 68.4 | 57.6 | |
20120722 | 72.2 | 56.0 | |
20120723 | 75.6 | 56.6 | |
20120724 | 82.6 | 57.8 | |
20120725 | 78.4 | 57.5 | |
20120726 | 77.0 | 56.4 | |
20120727 | 79.4 | 55.3 | |
20120728 | 77.4 | 55.0 | |
20120729 | 72.5 | 55.6 | |
20120730 | 72.9 | 55.6 | |
20120731 | 73.6 | 55.9 | |
20120801 | 75.0 | 55.4 | |
20120802 | 77.7 | 54.4 | |
20120803 | 79.7 | 53.7 | |
20120804 | 79.6 | 54.1 | |
20120805 | 81.5 | 57.8 | |
20120806 | 80.0 | 58.2 | |
20120807 | 75.7 | 58.0 | |
20120808 | 77.8 | 57.0 | |
20120809 | 78.6 | 55.0 | |
20120810 | 77.8 | 54.8 | |
20120811 | 78.5 | 53.0 | |
20120812 | 78.8 | 52.5 | |
20120813 | 78.6 | 53.3 | |
20120814 | 76.8 | 53.9 | |
20120815 | 76.7 | 56.2 | |
20120816 | 75.9 | 57.1 | |
20120817 | 77.6 | 55.3 | |
20120818 | 72.6 | 56.2 | |
20120819 | 70.4 | 54.3 | |
20120820 | 71.8 | 53.1 | |
20120821 | 73.6 | 53.4 | |
20120822 | 74.7 | 54.5 | |
20120823 | 74.6 | 55.7 | |
20120824 | 76.0 | 54.8 | |
20120825 | 76.2 | 53.8 | |
20120826 | 73.4 | 56.5 | |
20120827 | 74.6 | 58.3 | |
20120828 | 79.4 | 58.7 | |
20120829 | 74.7 | 57.5 | |
20120830 | 73.5 | 55.9 | |
20120831 | 77.9 | 55.4 | |
20120901 | 80.7 | 55.7 | |
20120902 | 75.1 | 53.1 | |
20120903 | 73.5 | 53.5 | |
20120904 | 73.5 | 52.5 | |
20120905 | 77.7 | 54.5 | |
20120906 | 74.2 | 56.3 | |
20120907 | 76.0 | 56.4 | |
20120908 | 77.1 | 56.5 | |
20120909 | 69.7 | 56.4 | |
20120910 | 67.8 | 55.4 | |
20120911 | 64.0 | 56.2 | |
20120912 | 68.1 | 55.7 | |
20120913 | 69.3 | 54.3 | |
20120914 | 70.0 | 55.2 | |
20120915 | 69.3 | 54.3 | |
20120916 | 66.3 | 52.9 | |
20120917 | 67.0 | 54.8 | |
20120918 | 72.8 | 54.8 | |
20120919 | 67.2 | 56.8 | |
20120920 | 62.1 | 55.4 | |
20120921 | 64.0 | 55.8 | |
20120922 | 65.5 | 55.9 | |
20120923 | 65.7 | 52.8 | |
20120924 | 60.4 | 54.5 | |
20120925 | 63.2 | 53.3 | |
20120926 | 68.5 | 53.6 | |
20120927 | 69.2 | 52.1 | |
20120928 | 68.7 | 52.6 | |
20120929 | 62.5 | 53.9 | |
20120930 | 62.3 | 55.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
body { | |
font: 10px sans-serif | |
} | |
.axis path, | |
.axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.x.axis path { | |
display: none; | |
} | |
.area.above { | |
fill: rgb(252,141,89); | |
} | |
.area.below { | |
fill: rgb(145,207,96); | |
} | |
.line { | |
fill: none; | |
stroke: #000; | |
stroke-width: 1.5px; | |
} | |
</style> | |
<body> | |
<script src="//d3js.org/d3.v3.min.js"></script> | |
<script> | |
var margin = {top: 20, right: 20, bottom: 30, left: 50}, | |
width = 960 - margin.left - margin.right, | |
height = 500 - margin.top - margin.bottom; | |
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 xAxis = d3.svg.axis() | |
.scale(x) | |
.orient("bottom"); | |
var yAxis = d3.svg.axis() | |
.scale(y) | |
.orient("left"); | |
var line = d3.svg.area() | |
.interpolate("basis") | |
.x(function(d) { return x(d.date); }) | |
.y(function(d) { return y(d["New York"]); }); | |
var area = d3.svg.area() | |
.interpolate("basis") | |
.x(function(d) { return x(d.date); }) | |
.y1(function(d) { return y(d["New York"]); }); | |
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("data.tsv", function(error, data) { | |
if (error) throw error; | |
data.forEach(function(d) { | |
d.date = parseDate(d.date); | |
d["New York"]= +d["New York"]; | |
d["San Francisco"] = +d["San Francisco"]; | |
}); | |
x.domain(d3.extent(data, function(d) { return d.date; })); | |
y.domain([ | |
d3.min(data, function(d) { return Math.min(d["New York"], d["San Francisco"]); }), | |
d3.max(data, function(d) { return Math.max(d["New York"], d["San Francisco"]); }) | |
]); | |
svg.datum(data); | |
svg.append("clipPath") | |
.attr("id", "clip-below") | |
.append("path") | |
.attr("d", area.y0(height)); | |
svg.append("clipPath") | |
.attr("id", "clip-above") | |
.append("path") | |
.attr("d", area.y0(0)); | |
svg.append("path") | |
.attr("class", "area above") | |
.attr("clip-path", "url(#clip-above)") | |
.attr("d", area.y0(function(d) { return y(d["San Francisco"]); })); | |
svg.append("path") | |
.attr("class", "area below") | |
.attr("clip-path", "url(#clip-below)") | |
.attr("d", area); | |
svg.append("path") | |
.attr("class", "line") | |
.attr("d", line); | |
svg.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
svg.append("g") | |
.attr("class", "y axis") | |
.call(yAxis) | |
.append("text") | |
.attr("transform", "rotate(-90)") | |
.attr("y", 6) | |
.attr("dy", ".71em") | |
.style("text-anchor", "end") | |
.text("Temperature (ºF)"); | |
}); | |
</script> |
The colors in this example are definitely not good for the color challenged. I actually had no idea what the point was until I carefully read the text. put more color value in or choose different colors if you care about the 1-in-200 males with this condition.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi Mike,
Is there a particular reason you've using clip paths for this solution?
I spiked a solution using a line and two bivariate areas, but am a n00b and don't know any better:
https://gist.github.com/mrtns/4753475
http://bl.ocks.org/4753475
Thanks, Martin