2013-05-09 84 views
3

中的行我试图用Google Charts API创建仪表板。Google Charts API - 仪表板:隐藏表

仪表板包含一个带有ChartRangeFilter类型和两个ChartWrapper(LineChart和Table)的ControlWrapper。此设置工作正常,但我想添加一个添加。

LineChart应显示整个数据集,表只是其中的一部分。 例如,我有10行,在表中只显示前8个。

这是我目前ControlWrapper:

control = new google.visualization.ControlWrapper({ 
'controlType': 'ChartRangeFilter', 
'containerId': 'control', 
'options': { 
    'filterColumnIndex': 0, 
    'ui': { 
    'chartType': 'LineChart', 
    'chartOptions': { 
     'chartArea': {'width': '95%'}, 
     'hAxis': {'baselineColor': 'none'} 
    }, 
    'chartView': { 
     'columns': [0,1] 
    }, 
    'minRangeSize': 86400000 
    } 
} 
}); 

而这个表:

chart = new google.visualization.ChartWrapper({ 
'chartType': 'Table', 
'containerId': 'table', 
'options': { 
     width: 470, 
     height: 340, 
     sortColumn: 0, 
     sortAscending: false 
}, 
'view': { 
    'columns': [0, 1] 
    //,'rows': [0,1,2,3,4,5,6] 
} 
}); 

当我取消注释行“// '行':0,1,2,3 ,4,5,6]”在表定义中我得到一个错误,当我移动ControlWrapper的滑块:

Invalid row index 6. Should be in the range [0-5] 

有没有办法得到这个工作?

原因是(在本例中)最后两行中只有第3列中的数据,该数据只显示在LineChart中,但不在表格中。

在此先感谢!

//编辑:

下面是一个例子页: http://circlecount.com/test.chart.range.php

下面是代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/MarkUp/SCHEMA/xhtml-rdfa-2.xsd" lang="de" xml:lang="de" dir="ltr" xmlns:og="http://ogp.me/ns#" > 
<head> 
    <script src="http://www.google.com/jsapi?key=" type="text/javascript"></script> 
    <script type="text/javascript">google.load("jquery", "1.7.1");</script> 
</head> 
<body> 
<script type="text/javascript"> 

// Load the Visualization API and the piechart package. 
google.load('visualization', '1.0', {'packages':['corechart', 'table', 'controls']}); 

// Set a callback to run when the Google Visualization API is loaded. 
google.setOnLoadCallback(fctDrawChart); 

var control, chart; 

function fctDrawChart() { 
    //follower 
    var data = new google.visualization.DataTable(); 
    var myTempDate = new Date(); 
    data.addColumn('date', 'Day'); 
    data.addColumn('number', 'Followers'); 


data.addRows(10); 
data.setCell(0, 0, new Date('11/07/2011')); 
data.setCell(0, 1, 11); 
data.setCell(1, 0, new Date('11/08/2011')); 
data.setCell(1, 1, 222); 
data.setCell(2, 0, new Date('11/09/2011')); 
data.setCell(2, 1, 1242); 
data.setCell(3, 0, new Date('11/10/2011')); 
data.setCell(3, 1, 1420); 
data.setCell(4, 0, new Date('11/11/2011')); 
data.setCell(4, 1, 1609); 
data.setCell(5, 0, new Date('11/12/2011')); 
data.setCell(5, 1, 1676); 
data.setCell(6, 0, new Date('11/13/2011')); 
data.setCell(6, 1, 1734); 
data.setCell(7, 0, new Date('11/14/2011')); 
data.setCell(7, 1, 1773); 
data.setCell(8, 0, new Date('11/15/2011')); 
data.setCell(8, 1, 1857); 
data.setCell(9, 0, new Date('11/16/2011')); 
data.setCell(9, 1, 1874); 


var dataView = new google.visualization.DataView(data); 
dataView.setColumns([0, 1]); 



    var dashboard = new google.visualization.Dashboard(document.getElementById('dashboard')); 

    control = new google.visualization.ControlWrapper({ 
    'controlType': 'ChartRangeFilter', 
    'containerId': 'control', 
    'options': { 
     'filterColumnIndex': 0, 
     'ui': { 
     'chartType': 'LineChart', 
     'chartOptions': { 
      'chartArea': {'width': '95%'}, 
      'hAxis': {'baselineColor': 'none'} 
     }, 
     'chartView': { 
      'columns': [0,1] 
     }, 
     'minRangeSize': 86400000 
     } 
    } 
    }); 

    google.visualization.events.addListener(control, 'statechange', function() { 
     $("#periodSelector").val("custom"); 
    }); 



    chart = new google.visualization.ChartWrapper({ 
    'chartType': 'Table', 
    'containerId': 'table', 
    'options': { 
      width: 470, 
      height: 340, 
      sortColumn: 0, 
      sortAscending: false 
    }, 
    'view': { 
     'columns': [0, 1] 
     ,'rows': [0,1,2,3,4,5,6] 
    } 
    }); 

    chart2 = new google.visualization.ChartWrapper({ 
    'chartType': 'LineChart', 
    'containerId': 'chart', 
    'options': { 
      width: 470, 
      height: 340, 
      sortColumn: 0, 
      sortAscending: false 
    }, 
    'view': { 
     'columns': [0, 1] 
    } 
    }); 

    dashboard.bind(control, chart); 
    dashboard.bind(control, chart2); 
    dashboard.draw(data); 

    } 


</script> 
    <div id='dashboard' > 
    <div id='table' style='width:240px;height:400px;'></div> 
    <div id='chart' style='width:240px;height:400px;'></div> 
    <div id='control' style='width:840px;height:40px;'></div> 
    </div> 
</div> 


</body> 
</html> 

我想什么: - 在整个周期图表(10天) - 仅在前7天的表格 - 完整时期(10天)的ControlWrapper,控制图表和表格

我希望能让我的问题更清楚。如果没有,请给我一张纸条。

在此先感谢!

更新: 随着JMAC的想法我得到了它与下面的函数工作:

google.visualization.events.addListener(control, 'statechange', 
    function(event) { 
    if (control.getState()["range"]["end"] > myLastRealDate) { 
     var myRowsArr = new Array(); 
     var myTempDate = control.getState()["range"]["start"]; 
     for (var i=0;i<myLastRealRow-(myDateArr[(myTempDate.getMonth()+1)+"/"+myTempDate.getDate()+"/"+myTempDate.getFullYear()]);i++) { 
     myRowsArr.push(i); 
     } 
     chart.setView({'rows': myRowsArr}); 
    } 
    else { 
     chart.setView({'rows': null}); 
    } 
    }); 

您可以在这里找到工作的例子:http://circlecount.com/test.chart.range.php

+0

请问你能解释一下问题是什么,并在文章中包含完整的代码?它看起来像只有6行数据,但试图显示7 - 这与显示表格的部分数据与线图无关。如果你可以更好地解释这个问题,它会使帮助变得更容易。 – jmac 2013-05-13 00:27:33

+0

感谢您的反馈jmac! (因为这里没有换行可能我已经更新了我最初的帖子) 下面是一个例子页: http://circlecount.com/test.chart.range.php 我想什么: - 一个完整时间段(10天)的图表 - 仅在前7天内的表格 - 完整时间段(10天)内的ControlWrapper,控制图表和表格 我希望这能让我的问题更清楚。如果没有,请给我一张纸条。 在此先感谢! – Chris 2013-05-13 17:29:32

回答

1

这个问题可以用下面的函数来解决:

google.visualization.events.addListener(control, 'statechange', 
    function(event) { 
    if (control.getState()["range"]["end"] > myLastRealDate) { 
     var myRowsArr = new Array(); 
     var myTempDate = control.getState()["range"]["start"]; 
     for (var i=0;i<myLastRealRow-(myDateArr[(myTempDate.getMonth()+1)+"/"+myTempDate.getDate()+"/"+myTempDate.getFullYear()]);i++) { 
     myRowsArr.push(i); 
     } 
     chart.setView({'rows': myRowsArr}); 
    } 
    else { 
     chart.setView({'rows': null}); 
    } 
    } 
); 

的行的数目必须得到保存在每个日期的阵列,例如:

myDateArr['11/7/2011'] = 0; 

的行和“休息日”的日期也得到保存在变量中:

myLastRealDate = new Date('11/14/2011'); 
myLastRealRow = 7; 

这里是一个工作示例: http://circlecount.com/test.chart.range.php

0

您正在运行中的问题是您的表格设置固定行数,而选择器可以将数据表格减少到该项目数量以下。

解决此问题的一种方法是更改​​选项,特别是ui.minRangeSize大于7(您要在图表中显示的行数)。这将使您的代码为控制:

control = new google.visualization.ControlWrapper({ 
'controlType': 'ChartRangeFilter', 
'containerId': 'control', 
'options': { 
    'filterColumnIndex': 0, 
    'ui': { 
    'chartType': 'LineChart', 
    'chartOptions': { 
     'chartArea': {'width': '95%'}, 
     'hAxis': {'baselineColor': 'none'} 
    }, 
    'chartView': { 
     'columns': [0,1] 
    }, 
    'minRangeSize': 604800000 
    } 
} 
}); 

这可以防止发生错误发生停止选择器的范围发生7天以下。

如果这对于您的应用程序来说不够好,您将不得不做一些棘手的事情,如this jsfiddle by asgallant。这种方法相当混乱,但基本上它是在屏幕上绘制隐藏表格,使用更改事件(当您过滤图表时)来确定表中的数据,并根据过滤的数据创建新的数据表。

然后,您可以使用新的子数据集以任何您喜欢的方式进行过滤。

另一种选择是将表格中的行筛选器从rows: [0, 1, 2, 3, 4, 5, 6]更改为可变数量的行,具体取决于基础表中的行数。因此,您可以检查滑块的state(请参阅文档here),并根据表中的行数(最多7个)创建一个动态数组行。

所有事情都考虑到了,限制滑块的范围可能是最容易的,因为这样会导致最少的头痛。

+0

非常感谢您的帮助jmac! 我使用了你的最后一个想法:更新行过滤器。我将用更好的格式编辑最初的问题。 – Chris 2013-05-14 10:21:34

+0

如果你可以用工作代码回答你自己的问题,并将其标记为正确的答案,那么它有更好的机会帮助后代。如果你愿意的话,我将不胜感激,并且我相信后代将会! – jmac 2013-05-14 10:50:55

+0

当然jmac!我不习惯在这里最好的过程在stackoverflow(不想标记我自己的答案作为解决方案;)),但如果你说这很好,我会做到这一点。再次感谢! – Chris 2013-05-14 14:35:07