Reputation: 61
Code is here: http://jsfiddle.net/S48QX/.
I want to draw a image based on a 3D data set, for example:
var data = [
{x:1.428, y:0.500, energy:0.458},
{x:1.428, y:1.191, energy:0.616},
{x:1.428, y:1.882, energy:0.795},
{x:1.428, y:2.573, energy:0.642},
{x:1.428, y:3.264, energy:0.536},
{x:1.428, y:3.955, energy:0.498},
{x:1.428, y:4.646, energy:0.494},
{x:1.428, y:5.337, energy:0.517},
...
}
It's like scattered plot, but I need every pixel to be set, not just a bunch of color dots on the image. So, my question is how can I interpolate scattered dots with d3.js.
The generated image here is the best I can do so far, but is it possible to make it more smooth and beautiful?
I am seeking a way to generate a HEATMAP only based on partial/scattered data. I hope there is a way in d3.js that can interpolate the missing part.
(1,5) ? ? ? (5,5)
? ? ? ? ?
? ? ? ? ?
(1,2) ? ? ? (5,2)
Upvotes: 6
Views: 3199
Reputation: 12330
Plotly.js is based on D3.js and able to create contour plots for scattered data:
https://jsfiddle.net/vwksaob3/
var data = [ {
x: [0, 1, 1, 0],
y: [0, 0, 1, 1],
z: [0, 0, 1, 1],
type: 'contour',
colorscale: 'Jet',
showscale: false,
autocontour: true
}];
var layout = {
margin: {
b: 0,
l: 0,
r: 0,
t: 0
},
height: 600,
width: 600,
title: '',
xaxis: {
ticks: '',
showticklabels: false
},
yaxis: {
ticks: '',
showticklabels: false
}
};
Plotly.newPlot('graph', data, layout, {displayModeBar: false});
Upvotes: 0
Reputation: 12330
With some effort you might be able to translate an existing algorithm to JavaScript.
http://www.dm.unibo.it/~achilles/calc/octave.html/Interpolation-on-Scattered-Data.html
The source code of Octave is available at
The file griddata.m and some referenced files can be found in the folder
octave_{version}\scripts\geometry
https://github.com/d3/d3/wiki/Voronoi-Geom
http://bl.ocks.org/mbostock/4341156
Upvotes: 0
Reputation: 221
I have one solution using svg filters. Be careful as this may not be what you want since the mathematical interpretation of this interpolation would be more 'blur'. I mostly did it as an exercise on svg filters. However 2d interpolation end up with similar results: see cubic interpolation for example (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.interp2d.html in python)
I used circles (you could try with rectangles) slightly overlapping and semi transparent and applied to gaussian blur on them, resulting in a 'heatmap' looking thing.
var filter = svg.append("defs").append('filter')
.attr('id', 'blur')
.append("feGaussianBlur")
.attr("stdDeviation", 8);
then using .style('fill-opacity', 0.5).attr("filter", "url(#blur)")
on the circles
See the fork http://jsfiddle.net/eqt1mkov/
Upvotes: 2