实习公司项目需要从数据源读取一张表,然后通过指定一个字符串的形式就能生成表格,于是我苦逼的吭哧吭哧鼓捣了挺久,弄了个初级版本demo出来。
用的是JQplot,直接贴代码:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<link rel="stylesheet" type="text/css" href="js/jqplot/jquery.jqplot.min.css"/>
<script type="text/javascript" src="js/jqplot/jquery.jqplot.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.pieRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.logAxisRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.canvasTextRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.categoryAxisRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.pointLabels.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.dateAxisRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.highlighter.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js"></script>
<script type="text/javascript" src="js/jqplot/plugins/jqplot.barRenderer.min.js"></script>
<script type="text/javascript" src="index.js"></script>
</head>
<script type="application/x-javascript">
var DataText = {};
var listData = new Array();
var pot;
jQuery(function($) {
var aa = {"total":"15","rows":[{"price":31,"name":"li","datee":"2013-05-01","eat":"ps"},{"price":9,"name":"li","datee":"2013-05-02","eat":"st"},{"price":31,"name":"li","datee":"2013-05-03","eat":"ps"},{"price":31,"name":"li","datee":"2013-05-04","eat":"ps"},{"price":9,"name":"li","datee":"2013-05-05","eat":"st"},{"price":16,"name":"wang","datee":"2013-05-01","eat":"hb"},{"price":9,"name":"wang","datee":"2013-05-02","eat":"st"},{"price":31,"name":"wang","datee":"2013-05-03","eat":"ps"},{"price":16,"name":"wang","datee":"2013-05-04","eat":"hb"},{"price":9,"name":"wang","datee":"2013-05-05","eat":"st"},{"price":9,"name":"zhang","datee":"2013-05-01","eat":"st"},{"price":9,"name":"zhang","datee":"2013-05-02","eat":"st"},{"price":9,"name":"zhang","datee":"2013-05-03","eat":"st"},{"price":16,"name":"zhang","datee":"2013-05-04","eat":"hb"},{"price":16,"name":"zhang","datee":"2013-05-05","eat":"hb"}]};
for (var i in aa.rows) {
listData.push([aa.rows[i].name, aa.rows[i].datee, aa.rows[i].eat, aa.rows[i].price]);
}
/*listData
// 0 1 2 3
//[["li", "2013-05-01", "ps", 31],
//["li", "2013-05-02", "st", 9],
//["li", "2013-05-03", "ps", 31],
//["li", "2013-05-04", "ps", 31],
//["li", "2013-05-05", "st", 9],
//["wang", "2013-05-01", "hb", 16],
//["wang", "2013-05-02", "st", 9],
//["wang", "2013-05-03", "ps", 31],
//["wang", "2013-05-04", "hb", 16],
//["wang", "2013-05-05", "st", 9],
//["zhang", "2013-05-01", "st", 9],
//["zhang", "2013-05-02", "st", 9],
//["zhang", "2013-05-03", "st", 9],
//["zhang", "2013-05-04", "hb", 16],
//["zhang", "2013-05-05", "hb", 16]]*/
listData.push(["zhang", "2013-05-04", "hb", 119.5]);
//listData.length=3;
//console.log(listData);
DataText = {
contenter : "chart1",
title : "dinner",
//type : "line",
type:"bar",
//type:"pie",
line : {
/*
* line
* 从上述listData变成返回Object data
* {
* legend:["li","wang","zhang"],
* rows:[
* (li的)[],
* (wang的)[],
* (zhang的)[]
* ]
* }
*/
groupByIndex : [0],
xAxisIndex : 1,
yAxisIndex : 3,
yAxisOpration: "max"
},
bar : {
/*
* bar
* 从上述listData变成返回Object data
* {
* legend:["li","wang","zhang"],
* rows:[
* (li的)[],
* (wang的)[],
* (zhang的)[]
* ]
* }
*/
groupByIndex : [0,2],
xAxisIndex : 1,
yAxisIndex : 3,
yAxisOpration : "max"
},
/*
* pie/bar
* 从上述listData变成返回Object data
* {
* rows:[
* (li的)[],
* (wang的)[],
* (zhang的)[]
* ]
* }
*/
pie : {
groupByIndex : [0],
yAxisIndex : 3,
yAxisOpration : "sum"
}
}
drawChart(DataText, listData);
jQuery.each(DataText, function(index, itemValue) {
if (!((index === "contenter") || (index === "title") || (index === "type"))) {
jQuery("#changeChartType").append("<option>" + index + "</option>");
}
});
});
function changeChartType() {
DataText.type = document.getElementById("changeChartType").value;
pot.destroy();
drawChart(DataText, listData);
}
</script>
<body>
<div id="chart1" style="height:300px; width:500px;"></div>
<select onchange="changeChartType()" id = "changeChartType"></select>
</body>
</html>
index.js
function getdata(DataText, listData) {
if (DataText.type === "line") {
var Text = DataText.line;
if (DataText.type === "bar") {
Text = DataText.bar;
}
if (Text === undefined) {
alert("Create Line Chart Error");
} else {
var Class = [];
var RealClass = [];
if (Text.groupByIndex === undefined) {
Class = Text.xAxisIndex;
RealClass = [];
RealClass.push(Text.xAxisIndex);
} else {
Class = Text.groupByIndex;
RealClass = Text.groupByIndex.concat();
RealClass.push(Text.xAxisIndex);
}
var ClassData = [];
var RealClassData = [];
var ClassAndRealClassRelation = [];
var data = [];
jQuery.each(listData, function(index, itemValue) {
var aClassItem = "";
jQuery.each(Class, function(i, v) {
aClassItem = aClassItem + itemValue[v] + ",";
});
aClassItem = aClassItem.substr(0, aClassItem.length - 1);
var ClassDataIndex;
//标记是哪个的,比如li的下标0,wang的下标1
if (jQuery.inArray(aClassItem, ClassData) == -1) {
ClassDataIndex = ClassData.push(aClassItem);
ClassDataIndex = ClassDataIndex - 1;
data[ClassDataIndex] = [];
} else {
ClassDataIndex = jQuery.inArray(aClassItem, ClassData);
}
if (Text.yAxisOpration != undefined) {
var RealClassDataIndex;
//---------------------按点分开始-----------------------
var aRealClassItem = "";
jQuery.each(RealClass, function(i, v) {
aRealClassItem = aRealClassItem + itemValue[v] + ",";
});
aRealClassItem = aRealClassItem.substr(0, aRealClassItem.length - 1);
if (jQuery.inArray(aRealClassItem, RealClassData) == -1) {
RealClassDataIndex = RealClassData.push(aRealClassItem);
RealClassDataIndex = RealClassDataIndex - 1;
var ClassAndRealClassRelationIndex = data[ClassDataIndex].push([itemValue[Text.xAxisIndex], itemValue[Text.yAxisIndex]]);
ClassAndRealClassRelationIndex = ClassAndRealClassRelationIndex - 1;
ClassAndRealClassRelation.push([aRealClassItem, ClassAndRealClassRelationIndex, 1, ClassDataIndex]);
} else {
var tempIndex = jQuery.inArray(aRealClassItem, RealClassData);
ClassAndRealClassRelation[tempIndex][2] = ClassAndRealClassRelation[tempIndex][2] + 1;
var targetNode = data[ClassDataIndex][ClassAndRealClassRelation[tempIndex][1]];
if (Text.yAxisOpration === "max") {
if (targetNode[1] < itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if (Text.yAxisOpration === "min") {
if (targetNode[1] > itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if ((Text.yAxisOpration === "sum") || (Text.yAxisOpration === "avg")) {
targetNode[1] = targetNode[1] + itemValue[Text.yAxisIndex];
} else {
alert("Error!!!");
}
}
} else {
data[ClassDataIndex].push([itemValue[Text.xAxisIndex], itemValue[Text.yAxisIndex]]);
}
});
if ((Text.yAxisOpration != undefined) && (Text.yAxisOpration === "avg")) {
jQuery.each(ClassAndRealClassRelation, function(key, val) {
var targetNode = data[val[3]][val[1]];
targetNode[1] = targetNode[1] / val[2];
});
}
if (Text.groupByIndex === undefined) {
ClassData = ["default"];
}
var ob = {
legend : ClassData,
rows : data
}
return ob;
}
}
if (DataText.type === "bar") {
var Text = DataText.bar;
if (Text === undefined) {
alert("Create Bar Chart Error");
} else {
var Class = [];
var RealClass = [];
if (Text.groupByIndex === undefined) {
Class = Text.xAxisIndex;
RealClass = [];
RealClass.push(Text.xAxisIndex);
} else {
Class = Text.groupByIndex;
RealClass = Text.groupByIndex.concat();
RealClass.push(Text.xAxisIndex);
}
var ClassData = [];
var RealClassData = [];
var ClassAndRealClassRelation = [];
var data = [];
jQuery.each(listData, function(index, itemValue) {
var aClassItem = "";
jQuery.each(Class, function(i, v) {
aClassItem = aClassItem + itemValue[v] + ",";
});
aClassItem = aClassItem.substr(0, aClassItem.length - 1);
var ClassDataIndex;
//标记是哪个的,比如li的下标0,wang的下标1
if (jQuery.inArray(aClassItem, ClassData) == -1) {
ClassDataIndex = ClassData.push(aClassItem);
ClassDataIndex = ClassDataIndex - 1;
data[ClassDataIndex] = [];
} else {
ClassDataIndex = jQuery.inArray(aClassItem, ClassData);
}
if (Text.yAxisOpration != undefined) {
var RealClassDataIndex;
//---------------------按点分开始-----------------------
var aRealClassItem = "";
jQuery.each(RealClass, function(i, v) {
aRealClassItem = aRealClassItem + itemValue[v] + ",";
});
aRealClassItem = aRealClassItem.substr(0, aRealClassItem.length - 1);
if (jQuery.inArray(aRealClassItem, RealClassData) == -1) {
RealClassDataIndex = RealClassData.push(aRealClassItem);
RealClassDataIndex = RealClassDataIndex - 1;
var ClassAndRealClassRelationIndex = data[ClassDataIndex].push([itemValue[Text.xAxisIndex], itemValue[Text.yAxisIndex]]);
ClassAndRealClassRelationIndex = ClassAndRealClassRelationIndex - 1;
ClassAndRealClassRelation.push([aRealClassItem, ClassAndRealClassRelationIndex, 1, ClassDataIndex]);
} else {
var tempIndex = jQuery.inArray(aRealClassItem, RealClassData);
ClassAndRealClassRelation[tempIndex][2] = ClassAndRealClassRelation[tempIndex][2] + 1;
var targetNode = data[ClassDataIndex][ClassAndRealClassRelation[tempIndex][1]];
if (Text.yAxisOpration === "max") {
if (targetNode[1] < itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if (Text.yAxisOpration === "min") {
if (targetNode[1] > itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if ((Text.yAxisOpration === "sum") || (Text.yAxisOpration === "avg")) {
targetNode[1] = targetNode[1] + itemValue[Text.yAxisIndex];
} else {
alert("Error!!!");
}
}
} else {
data[ClassDataIndex].push([itemValue[Text.xAxisIndex], itemValue[Text.yAxisIndex]]);
}
});
if ((Text.yAxisOpration != undefined) && (Text.yAxisOpration === "avg")) {
jQuery.each(ClassAndRealClassRelation, function(key, val) {
var targetNode = data[val[3]][val[1]];
targetNode[1] = targetNode[1] / val[2];
});
}
if (Text.groupByIndex === undefined) {
ClassData = ["default"];
}
var ob = {
legend : ClassData,
rows : data
}
return ob;
}
}
if (DataText.type === "pie") {
var Text = DataText.pie;
if ((Text === undefined) || (Text.groupByIndex === undefined)) {
alert("Create " + DataText.type + " Chart Error");
} else {
Class = Text.groupByIndex;
var ClassData = [];
var data = [];
var count = [];
jQuery.each(listData, function(index, itemValue) {
//---------------------按线分开始-----------------------
var aClassItem = "";
jQuery.each(Class, function(i, v) {
aClassItem = aClassItem + itemValue[v] + ",";
});
aClassItem = aClassItem.substr(0, aClassItem.length - 1);
var ClassDataIndex;
//标记是哪个的,比如li的下标0,wang的下标1
if (jQuery.inArray(aClassItem, ClassData) == -1) {
ClassDataIndex = ClassData.push(aClassItem);
ClassDataIndex = ClassDataIndex - 1;
data[ClassDataIndex] = [];
count[ClassDataIndex] = 1;
} else {
ClassDataIndex = jQuery.inArray(aClassItem, ClassData);
count[ClassDataIndex] = count[ClassDataIndex] + 1;
}
if (Text.yAxisOpration != undefined) {
if (data[ClassDataIndex].length === 0) {
data[ClassDataIndex] = [ClassData[ClassDataIndex], itemValue[Text.yAxisIndex]];
} else {
var targetNode = data[ClassDataIndex];
//--------------------caozuo---------------------------
if (Text.yAxisOpration === "max") {
if (targetNode[1] < itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if (Text.yAxisOpration === "min") {
if (targetNode[1] > itemValue[Text.yAxisIndex]) {
targetNode[1] = itemValue[Text.yAxisIndex];
}
} else if ((Text.yAxisOpration === "sum") || (Text.yAxisOpration === "avg")) {
targetNode[1] = targetNode[1] + itemValue[Text.yAxisIndex];
} else {
alert("Error!!!");
}
//--------------------caozuo---------------------------
}
} else {
data[ClassDataIndex].push([itemValue[Text.yAxisIndex]]);
}
});
if ((Text.yAxisOpration != undefined) && (Text.yAxisOpration === "avg")) {
jQuery.each(data, function(key, val) {
var targetNode = data[key];
targetNode[1] = targetNode[1] / count[key];
});
}
var ob = {
rows : data
}
return ob;
}
}
}
function drawChart(DataText, listData) {
var data = getdata(DataText, listData);
if (DataText.type === "line") {
drowLineChart(DataText, listData);
} else if (DataText.type === "bar") {
drowBarChart(DataText, listData);
} else if (DataText.type === "pie") {
drowPieChart(DataText, listData);
} else {
alert("what?");
}
}
function drowBarChart(DataText, listData) {
console.log("bar");
var data = getdata(DataText, listData);
pot = jQuery.jqplot(DataText.contenter, data.rows, {
title : DataText.title,
seriesDefaults : {
renderer : jQuery.jqplot.BarRenderer,
rendererOptions : {
//barMargin : 20
animation: {
show: true
}
},
pointLabels : {
show : true
}
},
axesDefaults : {
tickRenderer : jQuery.jqplot.CanvasAxisTickRenderer,
tickOptions : {
angle : -45
}
},
axes : {
xaxis : {
renderer : jQuery.jqplot.CategoryAxisRenderer
},
yaxis : {
tickOptions : {
angle : 0
}
}
},
legend : {// Date series title
show : true,
location : 'e',
placement : 'outside',
labels : data.legend
}
});
}
function drowPieChart(DataText, listData) {
console.log("pie");
var data = getdata(DataText, listData);
pot = jQuery.jqplot(DataText.contenter, [data.rows], {
title : DataText.title,
seriesDefaults : {
renderer : jQuery.jqplot.PieRenderer,
rendererOptions : {
animation: {
show: true
},
fill : false, // Turn off filling of slices
showDataLabels : true,
dataLabelNudge : +62,
dataLabelThreshold : 2,
sliceMargin : 4, // Add a margin to separate the slices.
lineWidth : 3 // stroke the slices with a little thicker line.
}
},
legend : {// Date series title
show : true,
location : 'se',
placement : 'inside',
fontSize : '12px',
rowSpacing : '1px'
},
highlighter : {
show : true,
formatString : '%s',
useAxesFormatters : false,
tooltipContentEditor : function(str, seriesIndex, pointIndex, plot) {
return '<span style="font-size:15px;">' + str + '</span>';
}
}
});
jQuery('#' + DataText.contenter).bind('jqplotDataHighlight', function(ev, seriesIndex, pointIndex, data) {
jQuery('#' + DataText.contenter + ' .jqplot-title')[0].textContent = data;
});
jQuery('#' + DataText.contenter).bind('jqplotDataUnhighlight', function(ev, seriesIndex, pointIndex, data) {
jQuery('#' + DataText.contenter +
' .jqplot-title')[0].textContent = DataText.title;
});
}
function drowLineChart(DataText, listData) {
console.log("line");
var data = getdata(DataText, listData);
pot = jQuery.jqplot(DataText.contenter, data.rows, {
title : DataText.title,
legend : {// Date series title
renderer : jQuery.jqplot.EnhancedLegendRenderer,
showSwatches : true,
showLabels : true,
show : true,
location : 'e',
placement : 'outside',
fontSize : '12px',
rowSpacing : '1px',
labels : data.legend//['aaa', 'bbb', 'ccc']
},
seriesDefaults : {
rendererOptions : {
//barMargin : 20
animation: {
show: true
}
},
pointLabels : {
show : true
}
},
axesDefaults : {
tickRenderer : jQuery.jqplot.CanvasAxisTickRenderer,
//This render support more tick Options like 'angle'
autoscale : true
},
axes : {
xaxis : {
renderer : $.jqplot.DateAxisRenderer
},
yaxis : {
min : 0
}
},
highlighter : {
show : true,
tooltipContentEditor : function(str, seriesIndex, pointIndex, plot) {
return '<span style="font-size:15px;">' + data.legend[seriesIndex] + ',' + str + '</span>';
}
}
});
}
然后就可以通过指定DataText中间的变量来定义要出的图啦。
资源打包http://download.csdn.net/detail/tenixin/7142401