d3:来自不规则/散乱数据的轮廓或曲面图

时间:2017-06-20 20:56:50

标签: javascript d3.js svg data-visualization

我可以使用一组三元组[X,Y,Z]并使用Python和matplotlib立即生成(平滑)轮廓图,并使用单次调用tricontour()。人们也可以轻松地生成轮廓。使用plot.ly,但我觉得它慢得令人无法接受。 (另外,我对MATLAB solution不感兴趣,这与Python类似)

我正在寻找使用d3.js的类似功能。我愿意接受一个"表面情节"而不是轮廓,或热图"没有轮廓线。

我可以看到如何生成colored Delaunay triangulation和/或colored Voronoi Tesselation,但how to generate a contour plot in d3 from irregular data points的问题似乎仍然是一个开放的问题(即使问题是过早的)关闭!)。

到目前为止,我所见过的只是方法"手工",使用Radial basis functions (gaussian blur)或使用Barycentric interpolation进行网格插值。

我甚至愿意和'生活在一起。对Delaunay三角剖分的Gouraud阴影或Coon渐变,但显然"advanced shading methods" like Gourand or Coon gradients are not in "regular" SVG but are proposed for SVG2 ...不确定d3& (常规)SVG。好像doing this SVG gradient-shading by hand似乎是一个重大的痛苦。

是否有更好的"以这种方式实现这一目标,即不需要那么多“定制”的东西。代码?(也许是通过一些多维的Bezier例程我还没找到?)

我会用我的起点发布一个小提琴:一个彩色的Voronoi tesselation:https://jsfiddle.net/k2v2jy7s/1/。你可以帮我从#34; blocky"到"顺利" (甚至可能显示等高线)?

<svg width="960" height="500"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
    var svg = d3.select("svg"),
        width = +svg.attr("width"),
        height = +svg.attr("height");

    var npoints = 1000;
    var sites = d3.range(npoints)
        .map(function(d) { return [Math.random() * width, Math.random() * height]; });


    // values  at data points / colors being mapped = "zvals"
    var kx = 3.14159/(width*0.5);
    var ky = 3.14159/(height*0.5);
    var zvals = d3.range(npoints)
    for (i = 0; i < npoints; i++) { 
        zvals[i] = (1.0 + Math.cos(kx*sites[i][0]) * Math.cos(ky*sites[i][1]))/2.0;
        zvals[i] *= zvals[i];
    }

    var g = svg.append("g")
        .attr("transform", "translate(" + 0+ "," + 0 + ")");

    var voronoi = d3.voronoi()
        .extent([[-1, -1], [width + 1, height + 1]]);

    var polygon = svg.append("g")
        .attr("class", "polygons")
        .selectAll("path")
        .data(voronoi.polygons(sites))
        .enter().append("path")
        .style('fill', function(d,i){ return d3.hsl( zvals[i]*310,        1, .5); })
        .call(redrawPolygon);

    function redrawPolygon(polygon) {
      polygon
          .attr("d", function(d) { return d ? "M" + d.join("L") + "Z" : null; });
    }
</script>

更新:在"Gradient Heatmaps"上也发现了这个blocks.org帖子,正如我所提到的那样,我愿意和他一起生活,但是#&# 39;大量的自定义代码。真的更喜欢紧凑的股票&#39;解决方案,la tricontour()。

0 个答案:

没有答案