var dayStore = Ext.create('Ext.data.JsonStore', {
    fields: [{ name: 'name', type: 'date', dateFormat: 'Y-m-d H:i:s' }, 'data'],    //Field Array, name用date类型
proxy: {
type: 'ajax',
url : 'HistoryChart'
}
}); var dayHistogram = Ext.create('Ext.panel.Panel', {
layout: 'fit',
listeners: {
'afterrender': function(comp) { //添加一个LoadMask,当dayStore加载数据的时候在Panel上显示LoadMask
new Ext.LoadMask(comp.getEl(), { store: dayStore });
}
},
items: {
xtype: 'chart', //xtype chart
id: 'dayChart',
animate: true, //动画效果
store: dayStore, //对应的store
axes: [{ //坐标轴定义
type: 'Numeric', //数据类型坐标轴
position: 'left', //左边,纵坐标
fields: 'data', //绑定对应dayStore中的Field
title: 'Power(W)', //坐标轴名称
minimum: 0, //坐标轴最小值
grid: true //是否在图表上显示横向网格
}, {
type: 'Time', //Time类型坐标轴,时间轴
position: 'bottom', //作为横坐标显示
fields: 'name', //为该坐标轴绑定dayStore中的 "name" Field
step: [Ext.Date.MINUTE, 30], //时间轴,坐标点,步进距离 dateFormat: 'H:i', //坐标轴刻度格式化
groupBy: 'year,month,day,hour,minute,second', //忘记了,应该是精确度吧,API中已经没有相关说明,或者可以不要了
aggregateOp: 'sum', //忘记了。。或者一直没弄懂过, 原谅我。。。API中已经没有相关说明,或者可以不要了 fromDate: historyDayFromDate, //JavaScript Date对象,起始日期
toDate: historyDaytoDate, //JavaScript Date对象,截止日期 grid: true //是否显示纵向网格
}],
series: [{
type: 'line',
axis: ['left', 'bottom'], //4.0早起的版本貌似只写"left"就好,4.0.7貌似一定要写两个,不然会出错,官方例子也改了
smooth: true, //字面理解,平滑曲线或者转折明显的曲线
fill: true, //曲线内部是否填充颜色
tips: { //鼠标移动到曲线图的点上时显示的提示信息,如图中11:52:30
trackMouse: true, //实时追踪鼠标
width: 80, //提示面板宽度
height: 40, //提示面板高度
renderer: function(storeItem, item) { //格式化呈现数据的方法
var timeText = Ext.Date.format(storeItem.get('name'), 'H:i:s');
this.setTitle(storeItem.get('data') + ' W<br />' + timeText);
}
},
highlight: { //鼠标移动到点上的时候的显示样式
size: 4, //忘了
radius: 4 //点半径
},
style: { //曲线样式,参数比较多参考API
'stroke-width': 2 //定义曲线粗细
},
markerConfig: { //详细参数请参考API
radius: 1 //曲线图上点的样式
},
xField: 'name',
yField: 'data'
}]
}
}); var historyDayTimeAxis = false; //存储时间轴对象
var historyDayFromDate = new Date(); //时间轴起始时间
var historyDaytoDate = new Date(); //时间轴截止时间 var dayChartShow = true; //控制是否显示曲线图上数据的变量 function loadDayData() { //重新加载曲线图数据
var yearMonthText = selectedYearStoreItem.get('name');
if(yearMonthText != null && yearMonthText.length == 6) {
yearMonthText = yearMonthText.substring(0, 5) + '0' + yearMonthText.substr(5); //从其他图表获取年月信息的格式化字串
}
var dayText = selectedMonthStoreItem.get('name');
if(dayText < 10) {
dayText = '0' + dayText; //从其他图表数据获取格式化过的日期数据
}
var dateText = yearMonthText + '.' + dayText; //整合出当天的年月日信息
var datehistoryFrom = Ext.Date.parse(dateText, "Y.m.d"); //格式化成Javascript的Date对象
var datehistoryTo = Ext.Date.parse(dateText, "Y.m.d"); //格式化成Javascript的Date对象
datehistoryTo.setHours(23, 30, 0, 0); //将当天截止时间的对象设置为晚上11点半
if(historyDayTimeAxis) { //检测时间轴是否已经初始化
historyDayTimeAxis.fromDate = datehistoryFrom; //重置时间轴的起始时间
historyDayTimeAxis.toDate = datehistoryTo; //重置时间轴的结束时间
}
dayStore.load({ //重新加载dayStore中的数据,新加载的数据会自动替换掉原来的图形
//但是4.0.7版本疑似有一个BUG,如果新加载的数据为空的话,之前的曲线图不会消失,下面的代码有解决方案
params: { //取数据HTTP里的参数
param: 'day',
nodeId: getCurrentNodeId(),
date: dateText
},
callback: function(records) { //成功获取到数据后的回调函数,处理数据为空时之前的曲线图不会消失的BUG
if(records.length > 0) { //如果数据集不为空
if(!dayChartShow) {
Ext.getCmp('dayChart').series.get(0).showAll(); //显示曲线
dayChartShow = true;
}
} else if(dayChartShow) { //如果数据集为空,并且之前已经有曲线在显示
Ext.getCmp('dayChart').series.get(0).hideAll(); //隐藏之前的曲线图,曲线救国策略
dayChartShow = false;
}
}
});
}
//最后需要在上面的组件加载完毕后,运行初始化时间轴对象的语句
historyDayTimeAxis = Ext.getCmp('dayChart').axes.get(1);

2. Server端实现

详细的逻辑因为源代码部分处理比较复杂,就不写了,展示部分关键代码结构,完整结构请参考另一篇柱状图的文章。

1
2
3
obj.put(WebConstants.NAME, DateTool.formatDate(midCalendar.getTime())); //"name", "2012-09-20 13:42:30"
obj.put(WebConstants.DATA, pacAvg);
dataArray.add(obj);

最终反馈给Web端的数据如下:

[{"name":"2012-09-20 10:47:30","data":15484.6},{"name":"2012-09-20 10:52:30","data":15484.6},{"name":"2012-09-20 10:57:30","data":15484.6},{"name":"2012-09-20 11:02:30","data":15484.6},{"name":"2012-09-20 11:07:30","data":15484.6},{"name":"2012-09-20 11:12:30","data":0},{"name":"2012-09-20
11:17:30","data":0},{"name":"2012-09-20 11:22:30","data":0},{"name":"2012-09-20 11:27:30","data":0},{"name":"2012-09-20 11:32:30","data":0},{"name":"2012-09-20 11:37:30","data":9282.2},{"name":"2012-09-20 11:42:30","data":18869.8},{"name":"2012-09-20 11:47:30","data":594},{"name":"2012-09-20
11:52:30","data":17729.2},{"name":"2012-09-20 11:57:30","data":18821.3},{"name":"2012-09-20 12:02:30","data":17393.3},{"name":"2012-09-20 12:07:30","data":19075.2},{"name":"2012-09-20 12:12:30","data":17564.8},{"name":"2012-09-20 12:17:30","data":18909.7},{"name":"2012-09-20
12:22:30","data":18270.9},{"name":"2012-09-20 12:27:30","data":18413.1},{"name":"2012-09-20 12:32:30","data":19156.4},{"name":"2012-09-20 12:37:30","data":20013.4},{"name":"2012-09-20 12:42:30","data":17941.8},{"name":"2012-09-20 12:47:30","data":343.3},{"name":"2012-09-20
12:52:30","data":20080.2},{"name":"2012-09-20 12:57:30","data":0},{"name":"2012-09-20 13:02:30","data":0},{"name":"2012-09-20 13:07:30","data":0},{"name":"2012-09-20 13:12:30","data":0},{"name":"2012-09-20 13:17:30","data":0},{"name":"2012-09-20 13:22:30","data":0},{"name":"2012-09-20
13:27:30","data":0},{"name":"2012-09-20 13:32:30","data":0},{"name":"2012-09-20 13:37:30","data":0},{"name":"2012-09-20 13:42:30","data":0},{"name":"2012-09-20 13:47:30","data":0},{"name":"2012-09-20 13:52:30","data":19893.5}]

因为我们在dayStore中定义了”name” Field的类型为date,及与上面数据相同的日期格式,所以上面的日期字串会被自动解析为Javascript的Date对象,用与在时间轴中精确显示其实际位置。

因为项目需要,示例中的时间点都是固定间隔的,实际应用中你可以定位到任意一个点。

另外Extjs4的Time axis中有一个constrain参数,该参数标识如果接收到的数据时间点超过了时间轴的起始点,那么该点是否显示出来,该参数默认值为false。

extjs 4 chart 时间轴格式的处理的更多相关文章

  1. 使用Java8提供的Duration类制作字幕时间轴调整工具

    网上下载的字幕有时和片源的时间轴不一致.我们能够自己写一个工具来调整,也就是总体向前移动几秒,或者向后移动几秒.Java8中提供的Duration类使得这样的时间计算极其方便.以下就以最简单的srt字 ...

  2. [DevExpress]ChartControl之时间轴示例

    关键代码: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; name ...

  3. DevExpress之ChartControl实现时间轴实例 z

    using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; namespace ...

  4. fiddler笔记:TimeLine时间轴选项卡

    1.TimeLine选项卡介绍 TimeLine选项卡支持使用"瀑布"模型查看1~250个选中的Session.主要用于帮助性能分析和理解请求之间的关联.选项卡的主体内容是数据流视 ...

  5. JQuery+HTML5+CSS3制作时间轴插件,支持响应式布局

    一.效果图预览 (图一) (图二) 附注说明: 图一是浏览器宽度像素大于560px下的展示效果,图二是在浏览器宽度像素小于560px下的展现效果.使用的是CSS3的Media Query(媒体查询)实 ...

  6. 4-Highcharts曲线图之时间轴折线图

    鼠标按住左键 左右移动可以试试<!DOCTYPE> <html lang='en'> <head> <title>4-Highcharts曲线图之时间轴 ...

  7. Android 类似时间轴的实现

    想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android ...

  8. 超炫的时间轴jquery插件Timeline Portfolio

    Timeline Portfolio是一款按时间顺序专业显示事件的jquery时间轴插件,可以根据时间的先后嵌入各种媒体包括微博,视频和地图等.这个展现的模式非常适合设计师的作品集和个人简历的展示.T ...

  9. 使用canvas编写时间轴插件

    使用canvas编写时间轴插件 背景 项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击.拖动.放大缩小展示时间轴,获取到时间轴的某个时间.原来的时间轴是 ...

随机推荐

  1. 9.12NOIP模拟题

    NOIP 2017 全假模拟冲刺                                               hkd 题目名称 Spfa 走楼梯缩小版 滑稽 题目类型 传统 传统 传统 ...

  2. Kafka详解与总结(一)

    1. Kafka概述 1.1. 消息队列 1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推 ...

  3. 安装cloudermanager时如何正确Configuring TLS Security for Cloudera Manager

    不多说,直接上干货! 参考官网 https://www.cloudera.com/documentation/enterprise/5-2-x/topics/cm_sg_config_tls_secu ...

  4. EF 新增数据时提示it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element

    it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionM ...

  5. C#中 分层 显示数据库中多表的数据信息

    如下图,要实现将三个表中的内容加载到同一个窗体中,该怎么来实现呢? 要实现上面的查询结果,我们就要从Student表中拿到学生姓名,从Subject表中拿到科目名称,从StudentResult表中拿 ...

  6. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...

  7. P1418 选点问题

    题目描述 给出n个点,m条边,每个点能控制与其相连的所有的边,要求选出一些点,使得这些点能控制所有的边,并且点数最少.同时,任意一条边不能被两个点控制 输入输出格式 输入格式: 第一行给出两个正整数n ...

  8. Android 从服务器获取时间戳转换为年月日

    用JAVA相关类转换.代码如下: Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(NumberUtils.ge ...

  9. ndk书写位置的问题

    defaultConfig { applicationId "com.chenql.helloandroidjni" minSdkVersion 22 targetSdkVersi ...

  10. Less——less基本安装

    1.下载node.js 我们需要NodeJ运行LESS示例. 要下载NodeJ,请打开链接https://nodejs.org/en/ 2.node.js安装是否正确 在cmd中输入lessc -v, ...