Highcharts 生成曲線圖。

昨晚朋友給我說,她最近在實習,採集了一組數據,想要一個可以錄入數據,並生成一副曲線圖的工具。讓我幫她寫一個。上午抽空研究了一下Highcharts,寫了一個。

朋友的需求是,有五個錄入框,第一個是授粉天數,第2、3、4、5 個是四個植物的長度。 分別是:CK、1號、2號、3號。

最終的效果圖爲:




手動可以添加一行。 該行的五個框,錄入自己的數據。 

最後點擊生成圖片。即可生成圖片。

本來我的思路是, 就單單寫一個html頁面,然後獲取錄入的數據,點擊按鈕的時候,拼裝數據,生成圖片。即,點擊生成按鈕的時候,執行一個生成圖片的方法。 後來發現,該方法行不通。原因是,生成圖形的X軸座標的時候,插件要求的數據格式是:

categories: ['1','5','19','20','21','22','23']

我手動拼了字符串,然後用變量代替的方法,放到該數組中。 可是不行,插件把我所有的錄入數據當成了一條數據來渲染。。試了好多辦法,均不可以。我猜測,插件只有在頁面初次加載的時候渲染,纔可以正常的生成圖片。即卸載$(document).ready();的時候纔可以!看來只有通過把數據提交,然後獲取該數據,然後再行渲染了。沒有辦法,只好寫了一個web項目,然後通過從父頁面寫一個iframe,將數據錄入框放到一個form中,提交的時候,將這個form提交。在servlet中,獲取這些數據,拼裝組合好,然後傳入另外的模板,通過服務端模板渲染生成一串HTML代碼,然後用iframe接收之。問題終於得以解決。

父頁面的HTML代碼爲:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>

		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>繪製曲線</title>
		
		<script type="text/javascript" src="JS/jquery.min.js"></script>
		<script type="text/javascript" src="JS/My97DatePicker/WdatePicker.js"></script>

		<script type="text/javascript">
			
			var index = 0 ;
			function create_line(){
				$("#index").val(index);
				$("#sub_form").submit();
			}
			function del(obj){
				$(obj).parent("div").remove();
			}
			function add(){
				index = index + 1;
				$("#content").append('<div>授粉天數:<input type="text" class=date name="date" /> CK:<input type="text" class=xhs name="xhs" />1號:<input type="text" class=yc name="yc" />2號:<input type="text" class=qingjiao name="qingjiao" />3號:<input type="text" class=sanhao name="sanhao" /><input type="button" value="刪除當前行" οnclick="del(this)" /></div>');
			}
				</script>
				
				
				<style type="text/css">
					body{
						line-height: 1;
						font-size: 12px;
						background-color: #FFFFFF;
					}
					
					#oprate{
						margin-top:20px;
					}
					#frame,#main{
						width:960px;
						margin-left:auto;
						margin-right:auto;
						margin-top:10px;
					}
					#content{
						margin-top:30px;
					}
					.xhs{
						width:100px;
					}
					.yc{
					   width:100px;	
					}
					.qingjiao{
						width:100px;
					}
					.sanhao{
						width:100px;
					}
					.date{width:100px}
					.tip{
						color:red;
						margin-top:30px;
						line-height:1.8em;
					}
				</style>
			</head>
	<body>
 
			 <div id="main">
			 	 <div class="tip">使用說明:植物的長度爲手動錄入,只需要填寫長度即可,不必出現計量單位。且錄入框中只允許出現數字,不允許出現字母及其他字符,亦不可出現空值,否則曲線圖可能無法正常顯示!錄入一條完成後,如想繼續錄入,可
			 	    點擊“增加一條記錄” 按鈕。如想刪除某條記錄,可點擊該記錄右側的“刪除當前行按鈕”。全部錄入完成後,點擊生成曲線圖,即可查看效果圖!
			 	 </div>
				 <form action="drew" id="sub_form" target="targetiframe" method="post">
				 <div id="content">
					<div>授粉天數:<input type="text" class=date name="date" /> CK:<input type="text" class=xhs name="xhs" />1號:<input type="text" class=yc name="yc" />2號:<input type="text" class=qingjiao name="qingjiao" />3號:<input type="text" class=sanhao name="sanhao" /></div>
				 </div>
				 
				 <div id="oprate">
				    <input type="button" value="增加一條記錄" οnclick="add()" />
					<input type="button" value="生成曲線圖" οnclick="create_line()" />
				 </div>
				 <input type="hidden" name="index" id="index" /> 
				 </form>
			 </div>
			 
			 <div id="frame">
			 	<iframe id="targetiframe" name="targetiframe" border='1' style="width:100%;height:500px" ></iframe>
			 </div>
	</body>
</html>


頁面採用的辦法是,將form的target指向到當前頁面的一個iframe上。然後提交這個form的時候,動作會在iframe上發生,這樣頁面看起來就不會刷新了。這也是最原始的無刷新的做法。原生的文件上傳也是這個辦法。


重點是iframe指向的頁面的處理,即生成圖形的頁面。代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

	<script type="text/javascript" src="JS/jquery.min.js"></script>
    <script src="JS/highcharts.js"></script>
    <script src="JS/exporting.js"></script>
    <script src="JS/grid.js"></script>
<script type="text/javascript">
	$(document).ready(function(){
		$('#container').highcharts({  
			chart: {
				type: 'spline'
			},
			title: {
				text: '長度曲線圖'
			},
			 
			xAxis: {
				categories: [${date}]
			},
			yAxis: {
				min:0,
				title: {
					text: '長度'
				},
				labels: {
					formatter: function() {
						return this.value +'cm'
					}
				}
			},
			tooltip: {
				crosshairs: true,
				shared: true
			},
			plotOptions: {
				spline: {
					marker: {
						radius: 4,
						lineColor: '#666666',
						lineWidth: 1
					}
				}
			},
			series: [{
				name: 'CK',
				data: [${xhs}]
	
			}, {
				name: '1號',
				data: [ ${yc}]
			}, {
				name: '2號',
				data: [ ${qingjiao}]
			}, {
				name: '3號',
				data: [ ${sanhao}]
			}]});
	});
</script>
<style type="text/css">
body{
	line-height: 1;
	font-size: 12px;
	background-color: #FFFFFF;
}
</style>
</head>
<body>
<div id="container" style="min-width: 310px; height: 480px; margin: 0 auto"></div>
</body>
</html>




chart: {
type: 'spline'
},


這一行表示,圖形的展示方式,默認的話,是直線連接,spline是曲線連接,即顯得稍微圓滑一點,這也是同學的要求。

title: {
text: '長度曲線圖'
},

圖形上方顯示的問題。

xAxis: {
categories: [${date}]
},

x軸座標,使用的el表達式,獲取了後臺的數據,date爲之前頁面傳來的”授粉天數“ 這個數據,將其組合成插件識別的格式。


yAxis: {
min:0,
title: {
text: '長度'
},
labels: {
formatter: function() {
return this.value +'cm'
}
}
},


y軸座標。min:表示,y軸計數從0開始,可以調節。

formatter,格式化函數,將當前的值,即0,5,10 這些值,特殊處理,this.value 爲值, return 後,則顯示該變量。 現在我的會顯示 5cm ,10cm。。。



series: [{
name: 'CK',
data: [${xhs}]

}, {
name: '1號',
data: [ ${yc}]
}, {
name: '2號',
data: [ ${qingjiao}]
}, {
name: '3號',
data: [ ${sanhao}]
}]



series 爲數據,插件會解析該數據,並生成自己的形狀,插件要求的數據格式爲 數據  即 [1,2,3,4,5] 這種格式。 要顯示多條曲線,則在這裏面添加一組即可, 當然格式要符合要求。 其實就是 一個 數組內部包括了多個map 有幾個map就有幾條曲線。 map的name爲曲線名稱。 data爲曲線數據。 該數據亦爲數組。。。 


這個插件最簡單的就是這些了。!

文件地址:

http://download.csdn.net/detail/lxl631/7071395

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章