javascript - 谷歌图表 - 多个折线图数据表,每个图表都有隐藏线
问题描述
我试图用一个控制器构建一个仪表板来控制多个图表。一切正常,但是当我想在每个图表上显示不同的列时,事情就不行了。
这是什么错误的片段 http://jsfiddle.net/hzdyojca/
数据表是硬编码的,初始化时所有列都存在:
['Date', 'A2', 'A3', 'A4'],
[2004 , 3.5 , 5 , 4.4 ],
[2005 , 3.7 , 5 , 4.5 ],
[2006 , 3.7 , 5 , 4.6 ],
[2007 , 3.8 , 5 , 4.7 ]
如您所见,图表 A 完美地呈现了第 0 列和第 1 列。图表 B 应该预设第 0 列和第 2 列(日期和 A3),图表 C 应该同时呈现其中的一些。
let chartB = new google.visualization.ChartWrapper({
chartType: 'LineChart',
options: options,
containerId: 'chartB',
view: {columns:[0,2]} //THIS DOESNT WORK
});
let chartC = new google.visualization.ChartWrapper({
chartType: 'LineChart',
options: options,
containerId: 'chartC',
view: {columns:[0,1,2,3]} //BUT THIS DOES WORK (OR EVEN [0,1,2])
});
我不明白如何让图表 B 只显示红线。
将不胜感激更多的帮助。谢谢。
==================================================== =========================
快速跟进:所以我知道仪表板不能很好地与数据视图一起使用,所以我尝试跳过它们,但它仍然不起作用:
google.charts.load('current', {
packages: ['corechart', 'controls']
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Date', 'A2', 'A3', 'A4'],
[2004, 3.5, 5, 4.4],
[2005, 3.7, 5, 4.5],
[2006, 3.7, 5, 4.6],
[2007, 3.8, 5, 4.7]
]);
var options = {
legend: 'top',
chartArea: {
width: '85%',
height: '85%'
},
pointSize: 3,
dataOpacity: 0.8,
animation: {
duration: 1000,
easing: 'in',
startup: true
}
};
var colors = ['#b71c1c', '#1565c0', '#2e7d32'];
var chartA = new google.visualization.LineChart(document.getElementById('chartA'));
var chartB = new google.visualization.LineChart(document.getElementById('chartB'));
var chartC = new google.visualization.LineChart(document.getElementById('chartC'));
var control = new google.visualization.ControlWrapper({
controlType: 'ChartRangeFilter',
containerId: 'control',
dataTable: data,
options: {
filterColumnIndex: 0,
ui: {
chartOptions: {
colors: colors
}
}
}
});
google.visualization.events.addListener(control, 'ready', drawCharts);
google.visualization.events.addListener(control, 'statechange', drawCharts);
control.draw();
function drawCharts() {
var filterState = control.getState();
var filterRows = data.getFilteredRows([{
column: 0,
minValue: filterState.range.start,
maxValue: filterState.range.end
}]);
var viewA = new google.visualization.DataView(data);
var viewB = new google.visualization.DataView(data);
var viewC = new google.visualization.DataView(data);
viewA.setRows(filterRows);
viewB.setRows(filterRows);
viewC.setRows(filterRows);
viewA.setColumns([0, 2]);
viewB.setColumns([0, 2]);
viewC.setColumns([0, 2]);
chartA.draw(viewA,options);
chartB.draw(viewB,options);
chartC.draw(viewC,options);
}
});
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="control"></div>
<div id="chartA"></div>
<div id="chartB"></div>
<div id="chartC"></div>
知道为什么现在吗?
解决方案
它应该可以工作,但是将图表包装器和视图一起使用时会出现错误
您所能做的就是创建视图,然后在绘图之前将其转换回数据表
view.toDataTable()
这意味着您将需要独立绘制图表,而不是使用仪表板,
这可以使用控件的statechange
事件 来完成
请参阅以下工作片段...
google.charts.load('current', {
packages: ['corechart', 'controls']
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Date', 'A2', 'A3', 'A4'],
[2004, 3.5, 5, 4.4],
[2005, 3.7, 5, 4.5],
[2006, 3.7, 5, 4.6],
[2007, 3.8, 5, 4.7]
]);
var options = {
legend: 'top',
chartArea: {
width: '85%',
height: '85%'
},
pointSize: 3,
dataOpacity: 0.8,
animation: {
duration: 1000,
easing: 'in',
startup: true
}
};
var colors = ['#b71c1c', '#1565c0', '#2e7d32'];
var chartA = new google.visualization.ChartWrapper({
chartType: 'LineChart',
options: options,
containerId: 'chartA',
});
var chartB = new google.visualization.ChartWrapper({
chartType: 'LineChart',
options: options,
containerId: 'chartB',
});
var chartC = new google.visualization.ChartWrapper({
chartType: 'LineChart',
options: options,
containerId: 'chartC',
});
var control = new google.visualization.ControlWrapper({
controlType: 'ChartRangeFilter',
containerId: 'control',
dataTable: data,
options: {
filterColumnIndex: 0,
ui: {
chartOptions: {
colors: colors
}
}
}
});
google.visualization.events.addListener(control, 'ready', drawCharts);
google.visualization.events.addListener(control, 'statechange', drawCharts);
control.draw();
function drawCharts() {
var filterState = control.getState();
var filterRows = data.getFilteredRows([{
column: 0,
minValue: filterState.range.start,
maxValue: filterState.range.end
}]);
var view = new google.visualization.DataView(data);
view.setRows(filterRows);
view.setColumns([0, 1]);
chartA.setOption('colors', [colors[1]]);
chartA.setDataTable(view.toDataTable());
chartA.draw();
view.setColumns([0, 2]);
chartB.setOption('colors', [colors[2]]);
chartB.setDataTable(view.toDataTable());
chartB.draw();
view.setColumns([0, 1, 2, 3]);
chartC.setOption('colors', colors);
chartC.setDataTable(view.toDataTable());
chartC.draw();
}
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="dash">
<div id="control"></div>
<div id="chartA"></div>
<div id="chartB"></div>
<div id="chartC"></div>
</div>
注意:您需要提供自己的颜色。
默认情况下,每个系列都分配有特定的颜色,
如果图表由于视图而只有一列,则第一个为蓝色,无论它是哪一列
推荐阅读
- python - 从开始日期到结束日期按日期存储的多个 csv 文件读取到熊猫数据框中
- python - 使用 Flask 操作 HTML 元素的值
- python - 检查不同的列是否为空
- php - PHP Curl - SSL 对等点收到的证书有一些未指定的问题
- pagination - CouchDB 3 Clouseau-based Full Text Search Bookmark for Previous Page
- amazon-web-services - AWS SES 电子邮件将在 Outlook 邮件的垃圾邮件中出现
- unity3d - 我试图弄清楚如何在检查器中从一个静态变量更改为另一个
- c++ - 这个 futoshiki 游戏代码 openMP 任务中的错误是什么?
- javascript - 如何在功能组件 React 中使用本地存储
- http - http请求会自动重试tcp连接吗?