Google Line Charts v轴在添加超过2个时重叠

时间:2014-02-05 09:59:30

标签: javascript google-visualization linechart

在Google折线图中添加2个以上的v轴会使右边的那些重叠。 在https://code.google.com/apis/ajax/playground/?type=visualization#line_chart

中使用示例代码功能进行重新调用

示例代码:

function drawVisualization() {
  // Create and populate the data table.
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'x');
  data.addColumn('number', 'Cats');
  data.addColumn('number', 'Blanket 1');
  data.addColumn('number', 'Blanket 2');
  data.addRow(["A", 1, 1, 0.5]);
  data.addRow(["B", 2, 0.5, 1]);
  data.addRow(["C", 4, 1, 0.5]);
  data.addRow(["D", 8, 0.5, 1]);
  data.addRow(["E", 7, 1, 0.5]);
  data.addRow(["F", 7, 0.5, 1]);
  data.addRow(["G", 8, 1, 0.5]);
  data.addRow(["H", 4, 0.5, 1]);
  data.addRow(["I", 2, 1, 0.5]);
  data.addRow(["J", 3.5, 0.5, 1]);
  data.addRow(["K", 3, 1, 0.5]);
  data.addRow(["L", 3.5, 0.5, 1]);
  data.addRow(["M", 1, 1, 0.5]);
  data.addRow(["N", 1, 0.5, 1]);


  // Create and draw the visualization.
  new google.visualization.LineChart(document.getElementById('visualization')).
      draw(data, {curveType: "function",width: 500, height: 400,
    vAxes: {0: {logScale: false},
            1: {logScale: false, maxValue: 10},
            2:{logScale:false}},
    series:{
       0:{targetAxisIndex:0},
       1:{targetAxisIndex:1},
       2:{targetAxisIndex:2}}}
          );
}

有解决方法吗?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说:一种可能性是对一个轴使用textPosition: 'out'而对另一个轴使用textPosition: 'in'。在这种情况下,您会得到不重叠的数字。

有一个risky选项:手动更改DOM元素。轴标签在DOM中具有以下标记和属性(x和y值不同):

<text text-anchor="start" x="452" y="327.7" font-family="Arial" font-size="12" stroke="none" stroke-width="0" fill="#444444">0,40</text>

x轴下方的轴标签具有属性text-anchor“middle”,图表左侧的标签值为“end”,右侧的标签和图例标记的值为“start”。重叠的那些具有相同的x值,y是不同的。因此,其中一半必须向右移动(x值已更改):

...
var labels = document.querySelectorAll('text[text-anchor=start]');

// find limits of same x
var xMin = -1, xMax = -1;
for (var i = 1; i < labels.length; i++) {
    if (labels[i - 1].attributes[1].value == labels[i].attributes[1].value) {
        if (xMin == -1 ) xMin = i - 1;
        xMax = i;
    }
}

if (xMax != -1) {
    // change just half of them
    for (var i = xMin + (xMax - xMin + 1)/2; i <= xMax; i++) {
        var value = parseInt(labels[i].attributes[1].value);
        labels[i].attributes[1].value = value + 35;
    }
}
...

这只是为了运动,我不会使用它,因为它会在第一次谷歌决定将文本锚更改为其他东西或标签序列中的某些内容或某人决定将2个轴放在左侧时失败...

请参阅example at jsbin