nvd3:在折线图后面设置背景填充

时间:2015-04-15 19:48:24

标签: javascript svg charts nvd3.js

我有一些数据在一个地方用来制作热图,而在另一个地方用来制作折线图。我想在折线图后面添加一个渐变,以便折线图上的点出现在热图中使用的颜色前面。

如果我理解正确,那么所需要的就是在相应的svg元素上设置填充,但我没有发现任何迹象表明nvd3将帮助我找到该元素。我可以使用nvd3 API执行此操作,还是必须对图表进行反向工程以查找或插入该元素?

1 个答案:

答案 0 :(得分:2)

仍然没有迹象表明nvd3会对此有所帮助,但事实证明很容易找到合适的元素来填充。

简而言之,它是element_to_fill = d3_object_of_svg_with_chart.select("rect");

至少有两个警告:

  1. 必须在同一linearGradient代码中的<defs>代码中的<svg>代码中定义渐变。使用jQuery调用添加它不起作用,必须使用d3调用添加它。
  2. 此元素的高度可能有误,特别是如果图例有多行,但由lineChart_object.update();
  3. 修复

    代码看起来有点像这样:

    nv.addGraph( function() {
        var chart = nv.models.lineChart();
        //... set up chart as before
        var chart_d3 = d3.select("#"+container_element_id).append("svg");
        chart_d3.datum(chart_data_array);
        chart_d3.call(chart);
    
        // Now draw the gradient background:
        var grad_id = some_unique_id_string;
        var defs_d3 = chart_d3.insert( "defs", ":first-child" ); // define gradient
        var grad_d3 = defs_d3.append("linearGradient").attr("id",grad_id).attr("x1","0%").attr("y1","0%").attr("x2","0%").attr("y2","100%");
        grad_d3.append("stop").attr("offset","0%").attr("style","stop-color:rgb(255,0,0);stop-opacity:1");
        grad_d3.append("stop").attr("offset","100%").attr("style","stop-color:rgb(0,255,0);stop-opacity:1");
        var fill_d3 = chart_d3.select("rect"); // get nvd3's background rect
        fill_d3.attr("style",null); // nvd3 applies style="opacity: 0.5;"
        fill_d3.attr("fill","url(#"+grad_id+")");
        chart.update(); // nvd3 gets height wrong before update
        return chart;
    } );
    

    有关完整示例,请参阅this codepen。 (样式与预期非常不同,但背景渐变有效。另请参阅this question有关折线图样式。)