Luca Bonavita added file figures/figure_1/index.js  over 9 years ago

Commit id: 9ffdc0b70887a2194b99b2f6dafe40024b05ece9

deletions | additions      

         

var data;  var OII_OIII;  var log_OIIIHb;  var log_NIIHa;  var log_NIIOI;  var log_SIIHa;  var log_OIHa;  var log_OIIIOII;  var NII = d3.range(-3.0, 0.40, 0.05); // max 0.35  var SII = d3.range(-3.0, 0.25, 0.05); // max 0.20  var OI = d3.range(-3.0, -0.75, 0.05); // max -0.70  var KAUFF = d3.range(-1.25, 0.05, 0.05); // max 0  var OI2 = d3.range(-2.50000, 2.50000 / 10, 2.50000 / 10); // max 0.00000  var Ha = d3.range(-1.05847, 1.05847 / 10, 1.05847 / 10); // max 0.00000  // graph 1 curves  // --------------------  function log_OIII_Hb_NII_fn(n, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return 1.19 + eps + 0.61 / (n - eps - 0.47);  };  function log_OIII_Hb_NII(array, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return _.map(array, function(n) {  return log_OIII_Hb_NII_fn(n, eps);  });  };  function kauffmann_fn(n, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    var result = 1.3 + eps + 0.61 /(n - eps - 0.05);  return n > eps + 0.05 ? -2 : result;  };  function kauffmann(array, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return _.map(array, function(n) {  return kauffmann_fn(n, eps);  });  };  // graph 2 curves  // --------------------  function log_OIII_Hb_SII_fn(n, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return 1.30 + eps + 0.72 / (n - eps - 0.32);  };  function log_OIII_Hb_SII(array, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return _.map(array, function(n) {  return log_OIII_Hb_SII_fn(n, eps);  });  };  // graph 3 curves  // --------------------  function log_OIII_Hb_OI_fn(n, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return 1.33 + eps + 0.73 / (n - eps + 0.59);  };  function log_OIII_Hb_OI(array, eps) {  eps = _.isUndefined(eps) ? 0 : eps;    return _.map(array, function(n) {  return log_OIII_Hb_OI_fn(n, eps);  });  };  // graph 4 curves  // --------------------  function log_OIII_OII_OI_fn(n) {  return -1.701 * n - 2.163;  };  function log_OIII_OII_OI(array) {  return _.map(array, function(n) {  return log_OIII_OII_OI_fn(n);  });  };  function log_OI_Ha_fn(n) {  return 1.0 * n + 0.7;  };  function log_OI_Ha(array) {  return _.map(array, function(n) {  return log_OI_Ha_fn(n);  });  };  window.onload = function() {  var svg_width = window.innerWidth;  var svg_height = window.innerHeight;    var combo_padding = 40;  var plot_padding = 20;  var plot_width = (svg_width - 2 * combo_padding) / 4;  var plot_height = svg_height - 2 * combo_padding;    var svg =  d3.select('#viz')  .append('svg')  .attr('width', svg_width)  .attr('height', svg_height)  ;      d3.json('https://dl.dropboxusercontent.com/u/14774950/data.json', function(err, json) {  if (err) {  console.log('d3.json error: ', err);  return;  }    set_data(json);  plot1();  plot2();  plot3();  plot4();    });      function set_data(json) {  data = d3.transpose(json);    OII_OIII = data[0];  log_OIIIHb = data[1];  log_NIIHa = data[2];  log_NIIOI = data[3];  log_SIIHa = data[4];  log_OIHa = data[5];  log_OIIIOII = data[6];    var Predicted_NII_Ha = d3.range(-3.0, 0.35);    // Predicted_log_OIII_Hb_NII = log_OIII_Hb_NII(Predicted_NII_Ha)  var Predicted_log_OIII_Hb_NII = _.map(Predicted_NII_Ha, function(n) {  return log_OIII_Hb_NII_fn(n);  });  }    var p1;    function plot1() {      // ===============  // plot 1  // ===============    var plot_x = combo_padding;  var plot_y = combo_padding;  var padding_left = 20;  var padding_right = 20;  var padding_bottom = 15;  var width = plot_width - padding_left - padding_right;  var height = plot_height - padding_bottom;    p1 = svg.append('g')  .attr('id', 'plot1')  .attr('width', plot_width)  .attr('height', plot_height)  .attr('transform', 'translate(' + plot_x + ',' + plot_y + ')')  .append('g')  .attr('width', width)  .attr('height', height)  .attr('transform', 'translate(' + padding_left + ',' + 0 + ')')  ;    // scales    var x =  d3.scale.linear()  .domain([-2.0, 1.0])  .range([0, width]);    var y =  d3.scale.linear()  .domain([-1.5, 2.5])  .range([height, 0]);      // generators    var line =  d3.svg.line()  .interpolate('basis')  .x(function(d) { return x(d.x); })  .y(function(d) { return y(d.y); });      // axis    var xAxis =  d3.svg.axis()  .scale(x)  .innerTickSize(-6)  .outerTickSize(-height)  .tickValues(d3.range(-2.0, 1.0, 0.5).concat([1.0]))  ;    p1.append('g')  .attr('class', 'x axis noticksvalue')  .call(xAxis.orient('top'));    p1.append('g')  .attr('class', 'x axis')  .attr('transform', 'translate(0,' + height + ')')  .call(xAxis.orient('bottom'))  .selectAll('.tick text')  .attr('dy', '1em');    p1.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (width/2) + ',' + (height + 2 * padding_bottom) + ')')  .text('log([NII]/Hα)');    var yAxis =  d3.svg.axis()  .scale(y)  .innerTickSize(-6)  .outerTickSize(-width)  .tickValues(d3.range(-1.5, 2.5, 0.5).concat([2.5]))  ;    p1.append('g')  .attr('class', 'y axis')  .call(yAxis.orient('left'))  .selectAll('.tick text')  .attr('dx', '-0.25em');    p1.append('g')  .attr('class', 'y axis noticksvalue')  .attr('transform', 'translate(' + width + ',0)')  .call(yAxis.orient('right'));    p1.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (-2 * padding_left) + ',' + (height/2) + ') rotate(-90)')  .text('log([NII]/Hβ)');      // graphics    // plot borders clipping    p1.append('clipPath')  .attr('id', 'plot1clip')  .append('rect')  .attr('width', width)  .attr('height', height);    var g1 = p1.append('g').attr('clip-path', 'url(#plot1clip)');      // fill area, below, later will use insert    // eps0 area, clipped  var area =  d3.svg.area()  .interpolate('basis')  .x(function(d) { return x(d.x); })  .y1(function(d) { return y(d.y); })  ;    g1.append('clipPath')  .attr('id', 'clip-kauffman')  .append('path')  .classed({area: true, clippath: true})  .datum( _.map(KAUFF, function(x) { return {x: x, y: kauffmann_fn(x)} }) )  .attr('d', area.y0(y(kauffmann_fn(_.last(KAUFF)))));  // .attr('d', area.y0(0));    g1.append('path')  .classed({area: true})  // .attr('clip-path', 'url(#clip-kauffman)')  .datum( _.map(NII, function(x) { return {x: x, y: log_OIII_Hb_NII_fn(x, 0)} }) )  .attr('d', area.y0(y(log_OIII_Hb_NII_fn(_.last(NII)))));      // curves    // A path, eps = 0, solid black  g1  .append('path')  .classed({curve: true})  .datum( _.map(NII, function(x) { return {x: x, y: log_OIII_Hb_NII_fn(x, 0)} }) )  .attr('d', line)  ;    // B path, eps = 0.1, dashed black  g1  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(NII, function(x) { return {x: x, y: log_OIII_Hb_NII_fn(x, 0.1)} }) )  .attr('d', line);    // C path, eps = -0.1, dashed black  g1  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(NII, function(x) { return {x: x, y: log_OIII_Hb_NII_fn(x, -0.1)} }) )  .attr('d', line);    // kauffman curve  g1  .append('path')  .classed({curve: true, kauff: true})  .datum( _.map(KAUFF, function(x) { return {x: x, y: kauffmann_fn(x)} }) )  .attr('d', line);      // dots    var data_log_NIIHa = _.map(log_NIIHa, function(n, i) {  return {  x: n,  y: log_OIIIHb[i],  is_above_predicted: log_OIIIHb[i] > log_OIII_Hb_NII_fn(n, 0)  };  });    // var focused_1  g1.selectAll('circle')  .data(data_log_NIIHa)  .enter()  .append('circle')  .attr('r', 2)  .attr('cx', function(d) { return x(d.x) })  .attr('cy', function(d) { return y(d.y) })  .classed({  dot: true,  above: function(d) { return d.is_above_predicted }  })  .on('mouseover', function(d, i) {  // console.log('' + (d.is_above_predicted ? 'above' : 'below') + ' (' + d.x + ',' + d.y + ')');  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .filter(function(_d, _i) { return _i === i; })  .attr('r', 4)  .classed('focused', true)  ;  });  })  .on('mouseout', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .attr('r', 2)  .classed('focused', false)  ;  });  })  ;    }        // ===============  // plot 2  // ===============  var p2;    function plot2() {    var plot_x = combo_padding + plot_width;  var plot_y = combo_padding;  var padding_left = 0;  var padding_right = 40;  var padding_bottom = 15;  var width = plot_width - padding_left - padding_right;  var height = plot_height - padding_bottom;    p2 = svg.append('g')  .attr('id', 'plot2')  .attr('width', plot_width)  .attr('height', plot_height)  .attr('transform', 'translate(' + plot_x + ',' + plot_y + ')')  .append('g')  .attr('width', width)  .attr('height', height)  .attr('transform', 'translate(' + padding_left + ',' + 0 + ')')  ;    // scales    var x =  d3.scale.linear()  .domain([-2.0, 1.0])  .range([0, width]);    var y =  d3.scale.linear()  .domain([-1.5, 2.5])  .range([height, 0]);      // generators    var line =  d3.svg.line()  .interpolate('basis')  .x(function(d) { return x(d.x); })  .y(function(d) { return y(d.y); });      // axis    var xAxis =  d3.svg.axis()  .scale(x)  .innerTickSize(-6)  .outerTickSize(-height)  .tickValues(d3.range(-2.0, 1.0, 0.5).concat([1.0]))  ;    p2.append('g')  .attr('class', 'x axis noticksvalue')  .call(xAxis.orient('top'));    p2.append('g')  .attr('class', 'x axis')  .attr('transform', 'translate(0,' + height + ')')  .call(xAxis.orient('bottom'))  .selectAll('.tick text')  .attr('dy', '1em')  ;    p2.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (width/2) + ',' + (height + 2 * padding_bottom) + ')')  .text('log([SII]/Hα)');    var yAxis =  d3.svg.axis()  .scale(y)  .innerTickSize(-6)  .outerTickSize(-width)  .tickValues(d3.range(-1.5, 2.5, 0.5).concat([2.5]))  ;    p2.append('g')  .attr('class', 'y axis noticksvalue')  .call(yAxis.orient('left'));    p2.append('g')  .attr('class', 'y axis noticksvalue')  .attr('transform', 'translate(' + width + ',0)')  .call(yAxis.orient('right'));      // graphics    // plot borders clipping    p2.append('clipPath')  .attr('id', 'plot2clip')  .append('rect')  .attr('width', width)  .attr('height', height);    var g2 = p2.append('g').attr('clip-path', 'url(#plot2clip)');      // curves    // A path, eps = 0, solid black  g2  .append('path')  .classed({curve: true})  .datum( _.map(SII, function(x) { return {x: x, y: log_OIII_Hb_SII_fn(x, 0)} }) )  .attr('d', line);    // B path, eps = 0.1, dashed black  g2  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(SII, function(x) { return {x: x, y: log_OIII_Hb_SII_fn(x, 0.1)} }) )  .attr('d', line);    // C path, eps = -0.1, dashed black  g2  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(SII, function(x) { return {x: x, y: log_OIII_Hb_SII_fn(x, -0.1)} }) )  .attr('d', line);    // dots    var data_log_SIIHa = _.map(log_SIIHa, function(n, i) {  return {  x: n,  y: log_OIIIHb[i],  is_above_predicted: log_OIIIHb[i] > log_OIII_Hb_NII_fn(n, 0)  };  });    g2.selectAll('circle')  .data(data_log_SIIHa)  .enter()  .append('circle')  .attr('r', 2)  .attr('cx', function(d) { return x(d.x) })  .attr('cy', function(d) { return y(d.y) })  .classed({  dot: true,  above: function(d) { return d.is_above_predicted }  })  .on('mouseover', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .filter(function(_d, _i) { return _i === i; })  .attr('r', 4)  .classed('focused', true)  ;  });  })  .on('mouseout', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .attr('r', 2)  .classed('focused', false)  ;  });  })  ;  }    // ===============  // plot 3  // ===============    var p3;    function plot3() {    var plot_x = combo_padding + 2 * plot_width;  var plot_y = combo_padding;  var padding_left = -20;  var padding_right = 60;  var padding_bottom = 15;  var width = plot_width - padding_left - padding_right;  var height = plot_height - padding_bottom;    p3 = svg.append('g')  .attr('id', 'plot3')  .attr('width', plot_width)  .attr('height', plot_height)  .attr('transform', 'translate(' + plot_x + ',' + plot_y + ')')  .append('g')  .attr('width', width)  .attr('height', height)  .attr('transform', 'translate(' + padding_left + ',' + 0 + ')')  ;      // scales    var x =  d3.scale.linear()  .domain([-2.0, 1.0])  .range([0, width]);    var y =  d3.scale.linear()  .domain([-1.5, 2.5])  .range([height, 0]);      // generators    var line =  d3.svg.line()  .interpolate('basis')  .x(function(d) { return x(d.x); })  .y(function(d) { return y(d.y); });      // axis    var xAxis =  d3.svg.axis()  .scale(x)  .innerTickSize(-6)  .outerTickSize(-height)  .tickValues(d3.range(-2.0, 1.0, 0.5).concat([1.0]))  ;    p3.append('g')  .attr('class', 'x axis noticksvalue')  .call(xAxis.orient('top'));    p3.append('g')  .attr('class', 'x axis')  .attr('transform', 'translate(0,' + height + ')')  .call(xAxis.orient('bottom'))  .selectAll('.tick text')  .attr('dy', '1em')  ;    p3.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (width/2) + ',' + (height + 2 * padding_bottom) + ')')  .text('log([OI]/Hα)');    var yAxis =  d3.svg.axis()  .scale(y)  .innerTickSize(-6)  .outerTickSize(-width)  .tickValues(d3.range(-1.5, 2.5, 0.5).concat([2.5]))  ;    p3.append('g')  .attr('class', 'y axis noticksvalue')  .call(yAxis.orient('left'));    p3.append('g')  .attr('class', 'y axis noticksvalue')  .attr('transform', 'translate(' + width + ',0)')  .call(yAxis.orient('right'));      // graphics    // plot borders clipping    p3.append('clipPath')  .attr('id', 'plot3clip')  .append('rect')  .attr('width', width)  .attr('height', height);    var g3 = p3.append('g').attr('clip-path', 'url(#plot3clip)');    // curves    // A path, eps = 0, solid black  g3  .append('path')  .classed({curve: true})  .datum( _.map(OI, function(x) { return {x: x, y: log_OIII_Hb_OI_fn(x, 0)} }) )  .attr('d', line);    // B path, eps = 0.1, dashed black  g3  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(OI, function(x) { return {x: x, y: log_OIII_Hb_OI_fn(x, 0.1)} }) )  .attr('d', line);    // C path, eps = -0.1, dashed black  g3  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(OI, function(x) { return {x: x, y: log_OIII_Hb_OI_fn(x, -0.1)} }) )  .attr('d', line);      // dots    var data_log_OIHa = _.map(log_OIHa, function(n, i) {  return {  x: n,  y: log_OIIIHb[i],  is_above_predicted: log_OIIIHb[i] > log_OIII_Hb_NII_fn(n, 0)  };  });    g3.selectAll('circle')  .data(data_log_OIHa)  .enter()  .append('circle')  .attr('r', 2)  .attr('cx', function(d) { return x(d.x) })  .attr('cy', function(d) { return y(d.y) })  .classed({  dot: true,  above: function(d) { return d.is_above_predicted }  })  .on('mouseover', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .filter(function(_d, _i) { return _i === i; })  .attr('r', 4)  .classed('focused', true)  ;  });  })  .on('mouseout', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .attr('r', 2)  .classed('focused', false)  ;  });  })  ;  }      // ===============  // plot 4  // ===============    var p4;    function plot4() {    var plot_x = combo_padding + 3 * plot_width;  var plot_y = combo_padding;  var padding_left = 20;  var padding_right = 20;  var padding_bottom = 15;  var width = plot_width - padding_left - padding_right;  var height = plot_height - padding_bottom;    p4 = svg.append('g')  .attr('id', 'plot4')  .attr('width', plot_width)  .attr('height', plot_height)  .attr('transform', 'translate(' + plot_x + ',' + plot_y + ')')  .append('g')  .attr('width', width)  .attr('height', height)  .attr('transform', 'translate(' + padding_left + ',' + 0 + ')')  ;      // scales    var x =  d3.scale.linear()  .domain([-2.5, 0.0])  .range([0, width]);    var y =  d3.scale.linear()  .domain([-1.5, 1.2]) // !!! Michael's was [-1.5, 1.0], but dots were off above  .range([height, 0]);      // generators    var line =  d3.svg.line()  .interpolate('basis')  .x(function(d) { return x(d.x); })  .y(function(d) { return y(d.y); });      // axis    var xAxis =  d3.svg.axis()  .scale(x)  .innerTickSize(-6)  .outerTickSize(-height)  .tickValues(d3.range(-2.5, 0.0, 0.5).concat([0.0]))  ;    p4.append('g')  .attr('class', 'x axis noticksvalue')  .call(xAxis.orient('top'));    p4.append('g')  .attr('class', 'x axis')  .attr('transform', 'translate(0,' + height + ')')  .call(xAxis.orient('bottom'))  .selectAll('.tick text')  .attr('dy', '1em')  ;    p4.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (width/2) + ',' + (height + 2 * padding_bottom) + ')')  .text('log([OI]/Hα)');    var yAxis =  d3.svg.axis()  .scale(y)  .orient('left')  .innerTickSize(-6)  .outerTickSize(-width)  .tickValues(d3.range(-1.5, 1.2, 0.5).concat([1.2]))  ;    p4.append('g')  .attr('class', 'y axis')  .call(yAxis.orient('left'))  .selectAll('.tick text')  .attr('dx', '-0.25em');    p4.append('g')  .attr('class', 'y axis noticksvalue')  .attr('transform', 'translate(' + width + ',0)')  .call(yAxis.orient('right'));    p4.append('text')  .attr('text-anchor', 'middle')  .attr('dominant-baseline', 'central')  .attr('transform', 'translate(' + (-2 * padding_left) + ',' + (height/2) + ') rotate(-90)')  .text('log([OIII]/[OII])');    // graphics    // plot borders clipping    p4.append('clipPath')  .attr('id', 'plot4clip')  .append('rect')  .attr('width', width)  .attr('height', height);    var g4 = p4.append('g').attr('clip-path', 'url(#plot4clip)');      // curves    // A path, eps = 0, solid black  g4  .append('path')  .classed({curve: true})  .datum( _.map(OI2, function(x) { return {x: x, y: log_OIII_OII_OI_fn(x)} }) )  .attr('d', line);    // B path, eps = 0.1, dashed black  g4  .append('path')  .classed({curve: true, eps: true})  .datum( _.map(Ha, function(x) { return {x: x, y: log_OI_Ha_fn(x)} }) )  .attr('d', line);    // horizontal line  g4  .append('line')  .classed({axline: true})  .attr('x1', 0)  .attr('y1', y(0))  .attr('x2', width)  .attr('y2', y(0));      // dots    var data_log_OIHa = _.map(log_OIHa, function(n, i) {  return {  x: n,  y: log_OIIIOII[i],  is_above_predicted: log_OIIIHb[i] > log_OIII_Hb_NII_fn(n, 0)  };  });    g4.selectAll('circle')  .data(data_log_OIHa)  .enter()  .append('circle')  .attr('r', 2)  .attr('cx', function(d) { return x(d.x) })  .attr('cy', function(d) { return y(d.y) })  .classed({  dot: true,  above: function(d) { return d.is_above_predicted }  })  .on('mouseover', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .filter(function(_d, _i) { return _i === i; })  .attr('r', 4)  .classed('focused', true)  ;  });  })  .on('mouseout', function(d, i) {  _.each([p1, p2, p3, p4], function(plot) {  plot  .selectAll('circle')  .attr('r', 2)  .classed('focused', false)  ;  });  })  ;  }  }