6

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)
2
  • Not sure what you're looking for. For each row/column, you could use a linear gradient and set the stops appropriately, but I don't think that this would work in 2D. Commented Jun 19, 2014 at 18:50
  • Yes, exactly, it seems that linear gradient wouldn't work in 2D. Commented Jun 20, 2014 at 15:30

3 Answers 3

2

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/

enter image description here

Sign up to request clarification or add additional context in comments.

Comments

0

With some effort you might be able to translate an existing algorithm to JavaScript.

  • Octave is open source and provides a method for scattered data interpolation:

http://www.dm.unibo.it/~achilles/calc/octave.html/Interpolation-on-Scattered-Data.html

The source code of Octave is available at

ftp://ftp.gnu.org/gnu/octave/

The file griddata.m and some referenced files can be found in the folder

octave_{version}\scripts\geometry

  • D3.js seems to provide some voronoi and delaunay functionality that might be helpful:

https://github.com/d3/d3/wiki/Voronoi-Geom

http://bl.ocks.org/mbostock/4341156

  • Python also provides a griddata method:

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html#scipy.interpolate.griddata

Comments

0

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});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.