7

我正在修改 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();
4

1 回答 1

11

编辑:

从版本 2 开始不再需要此功能。您现在可以使用复合轴

原来的:

我在这里看到了问题,问题不在于多个轴,而在于尝试针对 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>

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

祝你好运

约翰

于 2013-09-04T22:35:48.637 回答