在网页中用GNUPlot生成图表
时间:2006-03-27 来源:sleep_meng
作者:RZ.Meng
引言:随着计算机技术的飞速发展,计算机在各领域中的应用越来越普及,利用计算机实现实时的数据分析和作图显得越来越重要。要对数据进行分析和管理,特别是对大量的数据进行更新,修改,添加等。在科学研究方面,每天都会产生大量的数据,怎样对这些数据进行存储和分析是一件困难的事情。那么怎样使数据的分析简单一点呢?那就是使用数据库系统。
摘要:xxxxx中子监测器每天都会产生大量的数据。使用数据库系统,对这些数据进行存储。以C语言实现对数据的实时入库,且用GNUplot实现数据的图形分析和WEB发布是本文主要内容。
关键字:MySQL GNUplot
C语言 Linux
3.1 系统功能描述
中子监测器每一秒钟就会产生一组数据,数据通过网络传输到各个地方,当接收到数据时,就要对数据进行存储,就是数据库的入库操作。数据不光要存储,还要对数据进行分析,即根据数据作出数据变化的曲线图形,而且要求能够按不同时间范围和时间间隔作图。还有web发布,这个就是把作出的图形通过WEB服务器向外发布即可。
系统一秒钟就有一组数据,每一组数据的格式如下:
______________________________________________________________
| 日期和时间
| 修正过的数据 | 没修正过的数据 | 时间间隔 | 大气压
|
-----------------------------------------------------------------
3.2 系统功能设计
3.2.1 数据库设计
系统使用MySQL数据库,MySQL数据库在科学和教育领域使用是免费的,这样我们不须要像其它数据库那样向数据库开发商支付使用允可费。而且MySQL本身是用C/C++编写,它提供完善的C语言接口,使我们入库程序的编写更加方便。根据数据的格式,只要设计一张数据表就行,数据表格式如下:
上面是数据表的E-R图,进行数据查询时,我们主要查询的是“修正过的数据”和“没修正过的数据”这两个字段,且以“日期和时间”和“时间间隔”两个字段为条件,为了使查询速度更优化,必须对表中的“日期和时间”和“时间间隔”两个字段建立索引。下面是用SQL语句写的建表语句:
--
-- Host: localhost Database: nmdb
--
------------------------------------------------------
-- Server version 4.1.7
--
-- Table structure for table `nmt`
--
DROP TABLE IF EXISTS `nmt`;
CREATE TABLE `nmt` (
`pk`
bigint(20) unsigned NOT NULL auto_increment,
`nm_t`
bigint(14) unsigned NOT NULL default '0',
`nm_on`
float(16,2) unsigned NOT NULL default '0.00',
`nm_off`
bigint(14) unsigned NOT NULL default '0',
`nm_gap`
int(10) unsigned NOT NULL default '0',
`nm_pa`
float(6,2) NOT NULL default '0.00',
PRIMARY
KEY (`pk`),
KEY
`nm_ymd_idx` (`nm_t`),
KEY
`nm_gap_idx` (`nm_gap`)
);
3.2.2 入库程序的设计与实现
数据库表建立好后,必须要对数据进行实时写入,虽然每一秒钟有一组数据产生,但并不是一秒钟对数据库进行一次写入操作。数据库的写入操作是以天为单位,每天进行一次写入操作。写入操作是一条条地写入,即一组数据一组数据的写入。写入过程为:
i. 使用用户名,用户密码,数据库名称,数据库表名称等连接数据库。
ii. 使用insert语句对数据进行写入操作。
iii.关闭数据库连接。
MySQL提供完善的C语言接口,利用它提供的接口函数可以很方便地完成对数据库的连接,写入,关闭等操作。使程序开发方便,快速,容易维护。
我们把用户名,密码,数据库名称,数据表名称等有时须要改变的变量放到头文件中,如果这些变量改变时,只要重新编译程序就可使用。把对数据库的连接,写入操作,关闭等不变的部分放到C文件中。
下面是用C语言写的数据库接口程序:
/**
* file nmdb.h
*
created 2005-05-19
* code
by Meng Renzhou
*/
/* change this for your database */
#define host_name
"localhost" /* host
to connect to (default = localhost) */
#define user_name
"root" /* user
name (default = your login name) */
#define password
"nmdbpass" /*
password (default = none) */
#define db_name
"nmdb" /*
database to use (default = none) */
#define table_name
"nmt" /*
database table to use */
/**
* file nmdb.c
*
created 2005-05-19
* code
by Meng Renzhou
*/
/**
*
modify 2005-06-05
* modify by
Meng Renzhou
*/
#include
#include
#include "nmdb.h"
MYSQL *conn = NULL;
int connectdb(void){
conn =
mysql_init (NULL);
if (conn
== NULL){
fprintf (stderr, "mysql_init() failed (probably out of
memory)\n");
exit
(0);
}
if
(mysql_real_connect (
conn,
host_name,
user_name,
password,
db_name,
0,
NULL,
0)
==
NULL)
{
fprintf (stderr, "mysql_real_connect() failed:\nError %u
(%s)\n",
mysql_errno (conn), mysql_error (conn));
exit
(0);
}
return(0);
}
int savetodb(char *query){
int rows
= 0;
if (
mysql_query(conn,query) != 0){
fprintf(stderr,"mysql_query() failed: %s\n",query);
}
rows =
mysql_affected_rows(conn);
if (rows
!=1 ){
fprintf(stderr,"Invalid affected rows by MySQL\n");
}
return(0);
}
void closedb(void){
if(conn
!= NULL) mysql_close(conn);
}
3.3 数据的作图分析及WEB发布
3.3.1 从数据库中提取数据并作图
要用数据作图,首先要把数据从数据库中导出,即是对数据库的查询。数据的查询是以“日期和时间”和“时间间隔”两个字段为条件的,即要查出不同时间范围不同时间间隔的数据。
数据的查询使用SQL语言的select语句来实现。如下:
SELECT nm_t,$4 FROM $tablename WHERE nm_gap=$1 AND
nm_t>=$2 AND nm_t其中的$1,$2,$3,$4是可变的查询条件,$4代表要查询的是修正过的或没有修正过的数据,$1为时间间隔,$2和$3为日期和时间范围。
然后根据查出的数据使用GNUplot作图,GNUplot是一个专为各种图表的制作而设计的软件,在数学等方面的使用很广泛,它的使用方法这里不作介绍,如要了解,可以到网上查询。为了方便,可以使用bash(Linux中的shell)脚本来完成数据的查询和作图,使数据的查询和作图变得轻松。下面是bash脚本:
#!/bin/bash
# file: plot
# write by Meng Renzhou
tablename=nmt
dbname=nmdb
dbuser=user
dbpass=pass
echo "SELECT nm_t,$4 FROM $tablename WHERE \
nm_gap=$1 AND nm_t>=$2 AND nm_t |
mysql $dbname --user=$dbuser --pass=$dbpass --silent \
>
/tmp/plot.dat
gnuplot
set terminal png color
set xdata time
set timefmt "%Y%m%d%H%M%S"
set format x "%Y\n%m/%d\n%H:%M"
set size 1.4,0.7
set title "Cosmic rays variations"
set nokey
set grid
plot "/tmp/plot.dat" using 1:2 with
lines
ENDOFINPUT
3.3.2 数据的WEB发布
图形的WEB发布就是把GNUplot生成的图形在WEB上发布,通过PHP语
言再结合上一节的bash脚本,很容易通过网页形式实时地显示GNUplot 生成的
图像。图2.2是用GNUplot生成的图形示例。PHP程序如下:
2.4 小结
本设计是多种技术的组合和应用,必须对Linux系统环境及其环境下的多种
编程语言有一定的了解和使用经验才可以完成。
参考资料:
MySQL™ MySQL-manual www.mysql.com
相关阅读 更多 +