2013-10-01 114 views
1

我正在使用谷歌图表库,但无法绘制趋势线可能是因为我使用string作为hAxis和number作为vAxis,直到现在我发现它是不可能绘制趋势线直到两轴是数字,但我已经看到例如日期作为hAxis使用,但我认为这是因为这是可比的。
所以我可以用xAxis作为字符串绘制trendLine吗?谷歌图表中的趋势线


我的代码:

<script type="text/javascript"> 
    google.load('visualization', '1.1', {'packages': ['corechart'], 'callback': drawChart}); 

    function drawChart() { 
    var data = new google.visualization.DataTable(); 
     <g:each status="counter" var="row" in="${transactionsColumns}"> 
     data.addColumn("${row[0]}","${row[1]}"); 
     </g:each> 
     var tempData=new Array(); 
     <g:each status="counter" var="row" in="${transactionsData}"> 
     var lowerArray=new Array(); 
     <g:each status="eIndex" var="element" in="${row}"> 

     <g:if test="${eIndex==0}"> 
     var column="${row[eIndex]}" 
     lowerArray[${eIndex}]=column; 
     </g:if> 
     <g:else> 
     var column=${row[eIndex]} 
     lowerArray[${eIndex}]=column; 
     </g:else> 

     </g:each> 
     tempData[${counter}]=lowerArray; 
     </g:each> 
    data.addRows(tempData); 


    var options = {'title':"${transactionsColumns[1][1]}", 
      'width':'auto', 
      'height':'auto', 

      trendlines: { 
       0: { 
       visibleInLegend: true, 
       color: 'purple', 
       lineWidth: 10, 
       opacity: 0.2, 
       } 
      } 
      }; 

    var chart = new google.visualization.LineChart(document.getElementById("lineChart${divId}")); 
    chart.draw(data, options); 
    } 
    </script> 


编辑: JMAC帮助后,我能够做到这一点:
Graph with string x-axis but actual a number

现在我得到了我想要的徘徊在图点,但不在X轴本身,它仍然显示编号
我的代码:这是一个单元格

lowerArray[${eIndex}]= {v:${counter+1},f:column}; //LHS dont care about it. v:loop_var(1,2,3..),f:"MyString" 
+0

你不能画一个特伦带有字符串轴的线。为了生成趋势线,域轴(通常为x轴)和数据轴(通常为y轴)必须都是连续数据类型(“数字”,“日期”,“日期时间”或“时间”)。 。 – asgallant

回答

1

您可以使用kludge来解决此问题。

Google支持单独计算和显示数值。您可以给数据赋予任意数值,并将其显示为一个字符串,从而允许您创建趋势线。

举例来说,如果你有以下数据集:

data.addColumn('string','Stations'); 
data.addColumn('number','Bentos Sold'); 
data.addRows([ 
    ['Tokyo',1], 
    ['Shinagawa',2], 
    ['Yokohama',3], 
    ['Nagoya',4], 
    ['Osaka',5] 
]); 

如下,您可以改变这种使用{v: , f:}格式:

data.addColumn('number','Stations'); 
data.addColumn('number','Bentos Sold'); 
data.addRows([ 
    [{v:1, 'Tokyo'},1], 
    [{v:2, 'Shinagawa'},2], 
    [{v:3, 'Yokohama'},3], 
    [{v:4, 'Nagoya'},4], 
    [{v:5, 'Osaka'},5] 
]); 

你轴上的值仍然是“东京”,“品川'等,但他们会计算为数字1,2等

+0

嘿,当我悬停在我的图中的点,它显示了正确的X轴值,所以谢谢,但在实际的X轴上显示随机数,我可以阅读更多关于F:V:calc:options'? –

+0

@Sachin这不是计算选项,你只需要设置正确的网格线数量。你可以用javacscript函数自动完成这个操作(比如计算行数),或者你可以手动执行(确保网格线的数量与数据量相匹配。确保你从'min-1'开始你的轴最小值,最大值为'max + 1',然后有一些网格线等于类别标签的数量 – jmac

+0

请看最新的问题 –

1
function drawMultipleTrendlineChart() { 
    var chartType='columnChart'; 
    var collection = []; 
    var chart = { 
    "collection":[{ 
    "0": ["date", "Data"], 
    "1": ["number", "Valor 1"], 
    "2": ["number", "Valor 2"], 
    "3": ["number", "Valor 3"], 
    "4": ["number", "Valor 4"],  
}, 
    { 
    "0": ['2013-3-2', 200, 1000], 
    "1": ['2013-4-2', 500, 650], 
    "2": ['2013-5-2', 700, 550], 
    "3": ['2013-6-2', 300, 95], 
    "4": ['2013-8-2', 200, 75], 
    "5": ['2013-9-2', 900, 1275], 
    "6": ['2013-10-2', 900, 1275], 
}] 
}; 


    var data = new google.visualization.DataTable(); 
      var valores = []; 
      for(var h=0; h <= chart.collection[0][0].length; h++){ 
       data.addColumn(chart.collection[0][h][0], 
       chart.collection[0][h][1]); 
      } 
      var total = chart.collection[1][0].length; 
      var params = []; 

      for(var i=0; i<= total; i++){ 

        var dataString = chart.collection[1][i][0]; 
        var dataVenda = dataString.split('-'); 
        var ano = eval(dataVenda[0]); 
        var mes = eval(dataVenda[1]); 
        var dia = eval(dataVenda[2]); 
        valores[i] = [new Date(ano, mes, dia), 
            chart.collection[1][i][1], 
            chart.collection[1][i][2]]; 

params[i] = '"'+i+'":{"showR2": false, "labelInLegend": \'valores\', "type": "exponencial", "visibleInLegend": true}'; 

      } 
var parseData = eval('var dataParse = {'+params.join(',')+'}'); 
      data.addRows(valores); 
      var formatter = new google.visualization.NumberFormat({ 
       fractionDigits: 2, 
       prefix: 'R$:' 
      }); 
      formatter.format(data, 1); 
      var dateFormatter = new google.visualization.NumberFormat({ 
       pattern: 'MMM yyyy' 
      }); 
      dateFormatter.format(data, 0); 
      var chartHeight = 400; 
      var chartWidth = 600; 
      var chartOptions = { 
       tooltip: { 
        isHtml: true 
       }, 
       title: chart.title, 
       isStacked: true, 
       width: chartWidth, 
       height: chartHeight, 
       //colors: ['#0000D8', '#00dddd'], 
       hAxis: { 
        title: 'Vendas por distribuidor', 
        slantedText: false, 
        slantedTextAngle: 45, 
        textStyle: { 
         fontSize: 10 
        }, 
        format: 'dd-MM-yyyy' 
       }, 
       chartArea: { 
        left: 50, 
        top: 20, 
        width: (chartWidth - 10), 
        height: (chartHeight - 90) 
       } 
      }; 
      chartOptions.trendlines = dataParse; 
      chart = new google.visualization.LineChart(document.getElementById('multipleTrendChart')); 
      chart.draw(data, chartOptions); 
     } 

google.load('visualization', '1', { 
    packages: ['corechart'], 
    callback: drawMultipleTrendlineChart 
});