this is for holding javascript data
Luca Bonavita added file figures/figure_1/index.js
over 9 years ago
Commit id: 9ffdc0b70887a2194b99b2f6dafe40024b05ece9
deletions | additions
diff --git a/figures/figure_1/index.js b/figures/figure_1/index.js
new file mode 100644
index 0000000..a3223ec
--- /dev/null
+++ b/figures/figure_1/index.js
...
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)
;
});
})
;
}
}