格式化数据以填充谷歌图表
本文关键字:谷歌 填充 格式化数据 | 更新日期: 2023-09-27 18:04:27
我试图使用谷歌API显示折线图。同样,我尝试格式化来自ASP.net Webmethod的数据,如
[WebMethod]
public static List<object> GetChartData()
{
List<object> chartData = new List<object>();
chartData.Add(new object[]
{
"DateTime", "Bugs"
});
chartData.Add(new object[]
{
"2011", "12",
"2014","45",
"2015","40",
"2016","98"
});
return chartData;
}
下面是我的客户端代码。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(drawChart);
function drawChart() {
var options = {
title: 'Bug Tracker'
};
$.ajax({
type: "POST",
url: "WebForm1.aspx/GetChartData",
data: '{}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
var data = google.visualization.arrayToDataTable(r.d);
var chart = new google.visualization.LineChart($("#chart")[0]);
chart.draw(data, options);
},
failure: function (r) {
alert(r.d);
},
error: function (r) {
alert(r.d);
}
});
}
</script>
在运行上面的代码,我得到一个错误,如0x800a139e - JavaScript runtime error: Row 0 has 8 columns, but must have 2
什么是错的,如何解决这个问题?
第一列之后的任何一列都应该是数字
除非被赋予特定的角色,例如tooltip
试试这个…
chartData.Add(new object[] {"DateTime", "Bugs"});
chartData.Add(new object[] {"2011", 12});
chartData.Add(new object[] {"2014", 45});
chartData.Add(new object[] {"2015", 40});
chartData.Add(new object[] {"2016", 98});
或在客户端,调整注释中的代码…
var charData = r.d;
var data = new google.visualization.DataTable();
data.addColumn('string', 'Year');
data.addColumn('number', 'Bugs');
for (var i = 0; i < charData.length; i++) {
data.addRow([charData[i].DateTime, pareseInt(charData[i].Bugs)]);
}
编辑
,数据如下…[["DateTime","Bugs"],["2011",12],["2014",45],["2015",40],["2016",98]]
则只需要arrayToDataTable
创建DataTable
请参阅下面的工作代码片段…
google.charts.load('current', {
callback: function () {
var r = {};
r.d = [["DateTime","Bugs"],["2011",12],["2014",45],["2015",40],["2016",98]];
var data = google.visualization.arrayToDataTable(r.d);
var options = {
title: "Bug Tracker",
pointSize: 5
};
var lineChart = new google.visualization.LineChart(document.getElementById('chart'));
lineChart.draw(data, options);
},
packages:['corechart']
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart"></div>
回答你的问题:
"在运行上述代码时,我得到一个错误,如0x800a139e - JavaScript运行时错误:第0行有8列,但必须有2"什么是错的,如何解决?
您正在添加整个表,并且它正在读取行数作为列数。它期望两列8行数据。如果要从类中访问数据,请将其分解为如下内容:
在不查看所有代码的情况下,这是您需要的算法类型的示例:
为对象的data创建一个类:
public class MyData{
public string Year {get; set;}
public int Bugs {get; set;}
var bugs = new List<MyData>BugList():
// add data.
使用ajax将该数据获取到一个方法,该方法将获取数据列表并将其序列化为Json格式。
return JsonConvert.SerializeObject(bugs);
然后可以从javascript中访问数据。为了模块化,将代码的图表部分从c#数据中分离出来是很重要的。因此,图表的详细信息将添加到创建图表的位置。
var data = new google.visualization.DataTable();
data.addColumn('string', 'Year');
data.addColumn('number', 'Bugs');
for (var i in chardata) {
data.addRow([chardata.Year[i], ints[chardata.Bugs[i]]]);
}
例如:
var str = new string[3] {"2011", "2012", "2013"};
var data = new google.visualization.DataTable();
data.addColumn('string', 'Year');
data.addColumn('number', 'Bugs');
for (var i in str) {
data.addRow([str[i], ints[i]]);
}
在这样简单的东西上测试它,然后通过ajax访问数据。