【问题标题】:C3.js fill area between curvesC3.js 填充曲线之间的区域
【发布时间】:2016-01-14 20:35:05
【问题描述】:

我有这样的图表

我需要在虚线之间填充 3 个区域。例如:填充 2 条红色虚线、2 条蓝色虚线和 2 条绿色虚线之间的区域。

我尝试这样做:

function fillArea(){
    var d = {};
    var x = [];
    var y1 = [];
    var y0 = [];

    for(var i = 0; i < chartJson.length; i++){
        x.push(chartJson[i].run_date);
        y0.push(chartJson[i].diviationMinus);
        y1.push(chartJson[i].diviationPlus);
    }
    d.x = x;
    d.y1 = y1;
    d.y0 = y0;


    var area = d3.svg.area()
                 .x(function(d) {return x(d.x); })
                 .y0(function(d) { return y(d.y0); })
                 .y1(function(d) { return y(d.y1); });  

}
fillArea();

但什么也没发生。这是jsfiddle https://jsfiddle.net/1xnc6y58/

【问题讨论】:

  • 如果您添加一些示例数据的小提琴会很容易提供帮助
  • @Gilsha 这里jsfiddle.net/1xnc6y58

标签: javascript d3.js svg charts c3.js


【解决方案1】:

将fillArea()函数改成如下代码:

function fillArea(){
    var yscale = chart.internal.y; 
    var xscale = chart.internal.x; 
var indexies = d3.range( chartJson.length );

var area = d3.svg.area()
                         .interpolate("linear")
             .x(function(d) {return xscale(chartJson[d].x); })
             .y0(function(d) { return yscale(chartJson[d].y0); })
             .y1(function(d) { return yscale(chartJson[d].y1); }); 

 d3.select("#chart svg g")
  .append('path')
  .datum(indexies)
  .attr('class', 'area')
  .attr('d', area);}

添加的css:

path.area { 
  stroke: lightgreen;
  fill: #e6ffe6;
  opacity: 0.9   }

工作小提琴:fill between lines c3.js

但是,如果 X 轴是时间序列,则 xscale(这里应该是日期对象而不是字符串)。这是一个时间序列示例:Timeseries C3.js fill between lines

【讨论】:

  • 您知道如何使这种方法适用于调整窗口大小吗?
  • @sebsasto 在调整窗口大小时,需要删除和填充区域。我不太确定是否有更好的解决方案。这是example
  • 如果X轴是type category,那么xscale我们要做什么呢?
  • @SubhashDiwakar 第一个小提琴示例用于序数轴。
  • @SubhashDiwakar 一个例子here