谷歌可视化将0轴与两个不同的y轴对齐

时间:2013-10-15 14:42:45

标签: javascript charts google-visualization data-visualization

我正在使用Google的可视化库创建combochart。我在一天中绘制了商店的流量和收入。我已将绘制选项设置为

var options = {
  seriesType: "bars",
  series:{0:{targetAxisIndex:0},1:{targetAxisIndex:1}},
  vAxes:{0:{title: "Revenue"},1:{title: "Traffic"}},
  hAxis: {title: "Time", showTextEvery: 1},
};

将收入设置在与​​流量不同的Y轴上。数据样本可能如下所示:

var data = [
  //   Time       Revenue Traffic
  ['10:00-10:30', '132.57', '33'],
  ['10:30-11:00', '249.23', '42'],
  ['11:00-11:30', '376.84', '37'],
  [... etc ..]
];

我遇到的问题是,交通价值总是正数,而如果有收益,收入可能是负数。如果发生这种情况,我的收入轴将从负值开始,如-50,而流量从0开始,水平基线不对齐。我想拥有它,即使Revenue的值小于0,它的0轴也会与Traffic 0轴对齐。

这是一个展示正在发生的事情的例子。查看Traffic 0轴与Revenue的-50轴处于同一级别。我想知道如何将流量基线提升到与收入0轴相同的水平。 enter image description here

1 个答案:

答案 0 :(得分:3)

我有一个方法,我相当肯定将始终生成具有相同0点的轴值(我没有证明它不能生成具有不同0点的轴,但我没有没见过。

首先,获取两个日期系列的范围(出于我们的目的,第1列是“收入”,第2列是“流量”):

var range1 = data.getColumnRange(1);
var range2 = data.getColumnRange(2);

对于每个系列,获取系列的最大值,如果max小于或等于0,则获取1。这些值将用作图表的上限。

var maxValue1 = (range1.max <= 0) ? 1 : range1.max;
var maxValue2 = (range2.max <= 0) ? 1 : range2.max;

然后计算与两个上界相关的标量值:

var scalar = maxValue2 / maxValue1;

现在,通过取range1.min0的较低者来计算“收入”系列的下限:

var minValue1 = Math.min(range1.min, 0);

然后将该下限乘以标量值以获得“流量”系列的下限:

var minValue2 = minValue1 * scalar;

最后,为每个轴设置vAxis minValue / maxValue选项:

vAxes: {
    0: {
        maxValue: maxValue1,
        minValue: minValue1,
        title: 'Revenue'
    },
    1: {
        maxValue: maxValue2,
        minValue: minValue2,
        title: 'Traffic'
    }
}

最终结果是每个系列的正负比例相等(maxValue1 / (maxValue1 - minValue1 == maxValue2 / (maxValue2 - minValue2minValue1 / (maxValue1 - minValue1 == minValue2 / (maxValue2 - minValue2),这意味着图表轴应该以相同的正数结束和负比例,两侧排列0。

这是一个有效的方法:http://jsfiddle.net/asgallant/hvJUC/。它应该适用于任何数据集,只要第二个数据系列没有负值。我正在开发一个适用于任何数据集的版本,但这应该足以满足您的用例。

相关问题