【问题标题】:Multi-series in dimplejsdimplejs 中的多系列
【发布时间】:2013-09-04 17:18:23
【问题描述】:

我正在修改 dimplejs 中的多系列图表,但对多轴逻辑有点卡住了。

有以下数据:

var data = [
  {"Month":"01/2013", "Revenue":2000, "Profit":2000, "Units":4},
  {"Month":"02/2013", "Revenue":3201, "Profit":2000, "Units":3},
  {"Month":"03/2013", "Revenue":1940, "Profit":14000, "Units":5},
  {"Month":"04/2013", "Revenue":2500, "Profit":3200, "Units":1},
  {"Month":"05/2013", "Revenue":800, "Profit":1200, "Units":4}
]

我试图获得一张图表,按月在同一 y 轴上显示我的收入和利润,在第二个 y 轴上显示我的单位。

使用下面的代码,我可以设法显示 3 系列。但利润系列与收入系列并不真正在同一轴上,整个事情看起来更像是一个黑客而不是一个适当的解决方案。

var chart = new dimple.chart(svg, data);

chart.setBounds(60,20,680,330);

var x = chart.addCategoryAxis("x", "Month");
var y1 = chart.addMeasureAxis("y", "Revenue");
chart.addSeries("null", dimple.plot.line, [x,y1]);
var y2 = chart.addMeasureAxis("y", "Units");
chart.addSeries("null", dimple.plot.bar, [x,y2]);
var y3 = chart.addMeasureAxis("y", "Profit");
chart.addSeries("null", dimple.plot.line, [x,y3]);

我想我的逻辑可能是关于如何正确玩系列的错误。任何帮助都会很棒。

非常感谢, 泽维尔

完整代码:

var svg = dimple.newSvg("body", 800, 400);

var data = [
    {"Month":"01/2013", "Revenue":2000, "Profit":2000, "Units":4},
    {"Month":"02/2013", "Revenue":3201, "Profit":2000, "Units":3},
    {"Month":"03/2013", "Revenue":1940, "Profit":14000, "Units":5},
    {"Month":"04/2013", "Revenue":2500, "Profit":3200, "Units":1},
    {"Month":"05/2013", "Revenue":800, "Profit":1200, "Units":4}
]

var chart = new dimple.chart(svg, data);

chart.setBounds(60,20,680,330);

var x = chart.addCategoryAxis("x", "Month");
var y1 = chart.addMeasureAxis("y", "Revenue");
chart.addSeries("null", dimple.plot.line, [x,y1]);
var y2 = chart.addMeasureAxis("y", "Units");
chart.addSeries("null", dimple.plot.bar, [x,y2]);
var y3 = chart.addMeasureAxis("y", "Profit");
chart.addSeries("null", dimple.plot.line, [x,y3]);

x.dateParseFormat = "%m/%Y";
x.addOrderRule("Date");

chart.draw();

【问题讨论】:

    标签: javascript d3.js dimple.js


    【解决方案1】:

    编辑:

    从第 2 版开始不再需要此功能。您现在可以使用 composite axes

    原文:

    我在这里看到了问题,问题不在于多个轴,而在于尝试针对 Dimple 尚未真正支持的单个轴绘制多个度量。恐怕我现在能做的最好的事情就是有点数据黑客:

    <div id="chartContainer">
      <script src="http://d3js.org/d3.v3.min.js"></script>
      <script src="/dist/dimple.v1.min.js"></script>
      <script type="text/javascript">
          var svg = dimple.newSvg("#chartContainer", 800, 400);
    
          // Data hack required to get revenue and profit on the same axis, units are
          // arbitrarily allocated to revenue but the values will be summed by date
          var data = [
              {"Month":"01/2013", "Metric":"Revenue", "Revenue/Profit":2000, "Units":4},
              {"Month":"02/2013", "Metric":"Revenue", "Revenue/Profit":3201, "Units":3},
              {"Month":"03/2013", "Metric":"Revenue", "Revenue/Profit":1940, "Units":5},
              {"Month":"04/2013", "Metric":"Revenue", "Revenue/Profit":2500, "Units":1},
              {"Month":"05/2013", "Metric":"Revenue", "Revenue/Profit":800, "Units":4},
              {"Month":"01/2013", "Metric":"Profit", "Revenue/Profit":2000, "Units":0},
              {"Month":"02/2013", "Metric":"Profit", "Revenue/Profit":2000, "Units":0},
              {"Month":"03/2013", "Metric":"Profit", "Revenue/Profit":14000, "Units":0},
              {"Month":"04/2013", "Metric":"Profit", "Revenue/Profit":3200, "Units":0},
              {"Month":"05/2013", "Metric":"Profit", "Revenue/Profit":1200, "Units":0}
          ];
    
          var chart = new dimple.chart(svg, data);
          chart.setBounds(60,20,680,330);
    
          // Add your x axis - nothing unusual here
          var x = chart.addCategoryAxis("x", "Month");
          // First y axis is the combination axis for revenue and profit
          var y1 = chart.addMeasureAxis("y", "Revenue/Profit");
          // Second is the units only
          var y2 = chart.addMeasureAxis("y", "Units");
    
          // Plot the bars first - the order of series determines their dom position
          // from back to front, this means bars are at the back.  It's important
          // to note that the string here "Unit Sales" is NOT in the data.  Any string
          // not in the data is just used to apply a label which can be used for colouring
          // as it is here and will also appear in tool tips
          var bars = chart.addSeries("Unit Sales", dimple.plot.bar, [x,y2]);
          // Use a simple line by metric for the other measures
          var lines = chart.addSeries("Metric", dimple.plot.line, [x,y1]);
    
          // Do a bit of styling to make it look nicer
          lines.lineMarkers = true;
          bars.barGap = 0.5;
          // Colour the bars manually so they don't overwhelm the lines
          chart.assignColor("Unit Sales", "black", "black", 0.15);
    
          x.dateParseFormat = "%m/%Y";
          x.addOrderRule("Date");
    
    
          // Here's how you add a legend for just one series.  Excluding the last parameter
          // will include every series or an array of series can be passed to select more than
          // one
          chart.addLegend(60, 5, 680, 10, "right", lines);
    
          chart.draw();
    
          // Once Draw is called, this just changes the number format in the tooltips which for these particular
          // numbers is a little too heavily rounded.  I assume your real data isn't like this
          // so you probably won't want this line, but it's a useful tip anyway!
          y1.tickFormat = ",d";
    
      </script>
    </div>
    

    目前这有点限制,但我刚刚有了一个非常好的实现的想法,我可以这样做来为这样的复合轴添加适当的支持。希望在不久的将来,这将成为可能。

    祝你好运

    约翰

    【讨论】:

    猜你喜欢
    • 2015-02-27
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多