`
huiqinbo
  • 浏览: 344622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

矢量Chart图表嵌入HTML5网络拓扑图的应用

 
阅读更多

本文转自:http://www.cnblogs.com/xhload3d/p/4463140.html

 

 

使用 HT for Web (以下简称 HT)开发HTML5网络拓扑图的开发者有 Chart 需求的项目的时候,感觉很痛苦,HT 集成的 Chart 组件中,并不包含有坐标,在展现方面不是很直观,但是也不是没有解决方案,接下来我们就来聊聊具体的解决方案。 

首先,第一种解决方案是,在定义 Chart 矢量的时候在 comps 中除了定义 Chart 外,再添加几个你自定义的绘制区域来绘制你想要的坐标轴,效果及 example 如下:

 

Chart 的定义代码见附录1(代码的定义太长),代码虽然长,但是代码的逻辑并不乱,各个模块间的矢量描述还是比较清晰的,具体可以参考 HT 的矢量手册,看到如此长的代码,我自己都没信心去维护它,维护这样的代码纯粹是体力活,而且复用性也不高,每一个不同的 Chart 都要类似如此地绘制,绘制一两个这样的图表感觉还好,绘制多了,真心会感觉很恶心,再这上面很浪费时间。

其次,第二种解决方案是,通过数据绑定来自定义绘制坐标轴。实现以上相同效果,其代码见 附录2。可以明显看出其代码量会比第一种解决方案好很多,而且代码可以复用。在其他的图表中,可以将横轴和纵轴的文本内容设置到 data 的 attr 属性上,并在定义 chart 时使用上如下代码就可以实现坐标文本的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ht.Default.setImage('chartName', {
    width: Number,
    height: Number,
    comps: [
        {
            // define chart
        },
        {
            type: 'xAxis',
            rect: Array
        },
        {
            type: 'yAxis',
            rect: Array
        }
    ]
});

在这里我已经通过 ht.Default.setCompType('typeName', function(g, rect, comp, data, view){}) 的方法定义了名字为 xAxis 和 yAxis 的 CompType,这两个 CompType 分别绘制了横轴和纵轴的坐标文本,代替了第一种方案制定多个 CompType 为 text 的写法,稍微优化了下代码,提高代码的可维护性。

但是,这样但使用方法总刚觉有些别扭,明明坐标轴是 Chart 的一部分,在定义 Chart 上却要硬生生地将图表和坐标部分分开,那如果用户还要在定义标题、坐标刻度、坐标说明等需求,那这个方案还是无法爽快的解决大部分通用的需求,需要定义许 多 CompType 来渲染不同的需求,而且在使用上也不是那么爽快。接下来要说明的方案三,就是来解决使用上及维护上的问题。

最后,第三种解决方案是,和第二种解决方案差不多,都是通过 ht.Default.setCompType('typeName', function(g, rect, comp, data, view){}) 的方法来定义名字为 axisChart 的 CompType,不同的是,数据并不是设置到 data 中,而是在 ht.Default.setImage() 的 comps 中直接定义其相关属性。具体的配置属性说明及其具体的代码实现可以查看附件,使用方式很简单,在引入 ht.js 核心文件的前提下,引入附件1的 axisChart.js 文件即可。

接下来来看下 axisChart 的具体使用及几个简单的例子:

例1:设计同一时刻不同小区之间的电流电压情况的柱状图柱状图:

 

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
ht.Default.setImage('c1', {
    width: 600,
    height: 400,
    comps: [
        {
            type: 'axisChart',
            rect: [0, 0, 600, 400],
            yAxis: [
                {
                    name: '单位:V',
                    max: 270,
                    min: 150,
                    splitNumber: 10,
                    axisTitle: {
                        text: '电压',
                        rotate: -90
                    },
                    axisLine: {
                        arrow: true
                    }
                },
                {
                    position: 'right',
                    name: '单位:I',
                    max: 20,
                    splitNumber: 20,
                    axisTitle: {
                        text: '电流',
                        rotate: 90
                    },
                    axisLabel: {
                        interval: 1
                    },
                    axisLine: {
                        arrow: true
                    }
                }
            ],
            xAxis: [
                {
                    type: 'category',
                    data: ['抚梅源', '藕花深处', '紫东花园', '紫金苑', '华府山水', '水云间', '瑞景新城'],
                    axisTitle: {
                        text: '小区名称'
                    }
                }
            ],
            series: [
                {
                    label: function(value){
                        return value + ' V';
                    },
                    data: {
                        values: [220, 210, 200, 209, 230, 215, 218],
                        color: '#f90'
                    }
                },
                {
                    yAxisPosition: 'right',
                    label: true,
                    data: {
                        values: [10, 4, 15, 9, 12, 18, 7],
                        color: '#af0'
                    }
                }
            ]
        }
    ]
});

例2: 不同时刻,不同小区的电压情况的折线图:

 

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
ht.Default.setImage('c2', {
    width: 600,
    height: 400,
    comps: [
        {
            type: 'axisChart',
            rect: [0, 0, 600, 400],
            yAxis: [
                {
                    name: '单位:V',
                    max: 240,
                    min: 190,
                    splitNumber: 10,
                    axisTitle: {
                        text: '电压',
                        rotate: -90
                    },
                    axisLine: {
                        arrow: true
                    }
                }
            ],
            xAxis: [
                {
                    type: 'time',
                    min: new Date(2015, 0, 1),
                    max: new Date(2015, 0, 2),
                    splitNumber: 25,
                    axisTitle: {
                        text: '时间'
                    },
                    axisLabel: {
                        interval: 2,
                        formatter: function(value, index, min, max){
                            return value.format('dd-hh');
                        }
                    },
                    axisLine: {
                        arrow: true
                    }
                }
            ],
            series: [
                {
                    type: 'line',
                    data: {
                        values: [220, 210, 200, 209, 230, 215, 218, 220, 210, 200, 209, 230, 215, 218, 209, 230, 215, 218, 220, 210, 200, 209, 230, 215, 218],
                        color: '#f90'
                    }
                },
                {
                    type: 'line',
                    data: {
                        values: [225, 209, 208, 206, 205, 221, 213, 224, 218, 224, 205, 208, 216, 220, 208, 210, 219, 219, 210, 209, 219, 207, 222, 222, 215],
                        color: '#7d0'
                    }
                },
                {
                    type: 'line',
                    linePoint: true,
                    line3d: true,
                    data: {
                        values: [211, 216, 215, 205, 206, 206, 223, 217, 217, 215, 212, 221, 219, 222, 205, 208, 205, 218, 223, 222, 207, 215, 215, 222, 223],
                        color: '#ab0'
                    }
                }
            ]
        }
    ]
});

最后,还有一点要说明,axisChart 的代码并不是那么的无懈可击,我个人觉得代码设计上还是有些欠缺,所有的代码总共有差不多 1000 行,我觉得太臃肿了,在设计上自己也感觉不是那么的友好,等想修改的时候发现已经投入太多时间了,还有好多事情等待着我我去学习、去探讨,所以也就线这样 吧,等有空了再重构一番,但是我相信在功能上还是能够满足大部分的需求,在设计上,或者是实现的方法上,还是在使用过程中发现的 bug,还望大家能够不吝赐教。

附录1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
ht.Default.setImage('chart', {
    width: 650,
    height: 380,
    comps: [
        // column chart
        {
            type: 'columnChart',
            rect: [10, 60, 630, 260],
            label: true,
            labelColor: '#20284C',
            labelFont: '8px Arial',
            series: [
                {
                    color: '#20284C',
                    values: [471, 482, 567, 525, 590, 637, 780, 679, 848]
                },
                {
                    color: '#303F74',
                    values: [275, 290, 361, 328, 346, 341, 440, 423, 505]
                },
                {
                    color: '#7E93CD',
                    values: [82, 104, 115, 118, 135, 154, 198, 197, 247]
                },
                {
                    color: '#A9B6DB',
                    values: [65, 78, 87, 87, 113, 130, 167, 159, 213]
                }
            ]
        },
        // 竖线
        {
            type: 'rect',
            rect: [15, 60, 1, 260],
            background: '#566CB0'
        },
        {
            type: 'shape',
            rect: [5.5, 30, 20, 30],
            borderWidth: 1,
            borderColor: '#566CB0',
            points: [0, 20 / 3 * 2, 20 / 2, 0, 20, 20 / 3 * 2, 20 / 2, 0, 20 / 2, 30],
            segments: [1, 2, 2, 1, 2]
        },
        // 坐标文本
        {
            type: 'text',
            rect: [0, 320 - 26 * 10 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 10)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 9 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 9)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 8 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 8)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 7 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 7)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 6 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 6)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 5 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 5)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 4 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 4)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 3 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 3)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 2 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 2)
        },
        {
            type: 'text',
            rect: [0, 320 - 26 * 1 - 8, 15, 16],
            align: 'right',
            text: Math.round(84.8 * 1)
        },
        {
            type: 'text',
            rect: [0, 320 - 8, 15, 16],
            align: 'right',
            text: 0
        },
        // Q
        {
            type: 'text',
            rect: [55, 322, 0, 16],
            align: 'center',
            text: 'Q2\'11'
        },
        {
            type: 'text',
            rect: [124, 322, 0, 16],
            align: 'center',
            text: 'Q3\'11'
        },
        {
            type: 'text',
            rect: [191, 322, 0, 16],
            align: 'center',
            text: 'Q4\'11'
        },
        {
            type: 'text',
            rect: [259, 322, 0, 16],
            align: 'center',
            text: 'Q1\'12'
        },
        {
            type: 'text',
            rect: [327, 322, 0, 16],
            align: 'center',
            text: 'Q2\'12'
        },
        {
            type: 'text',
            rect: [394, 322, 0, 16],
            align: 'center',
            text: 'Q3\'12'
        },
        {
            type: 'text',
            rect: [462, 322, 0, 16],
            align: 'center',
            text: 'Q4\'12'
        },
        {
            type: 'text',
            rect: [529, 322, 0, 16],
            align: 'center',
            text: 'Q1\'13'
        },
        {
            type: 'text',
            rect: [596, 322, 0, 16],
            align: 'center',
            text: 'Q2\'13'
        },
        // line
        {
            type: 'rect',
            rect: [15, 320, 620, 1],
            background: '#566CB0'
        },
        {
            type: 'shape',
            rect: [635, 310.5, 30, 20],
            borderWidth: 1,
            borderColor: '#566CB0',
            points: [20 / 3 * 2, 0, 30, 20 / 2, 20 / 3 * 2, 20, 30, 20 / 2, 0, 20 / 2],
            segments: [1, 2, 2, 1, 2]
        }
    ]
});

附录2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
ht.Default.setCompType('yAxis', function(g, rect, comp, data, view) {
    var labels = data.a('yLabels'),
            len = labels.length,
            x = rect.x,
            y = rect.y,
            w = rect.width,
            h = rect.height,
            dh = h / (len - 1);
    g.save();
    g.font = '12px arial, sans-serif';
    g.fillStyle = 'black';
    g.textAlign = 'right';
    for(var i = 0; i < len; i++){
        g.fillText(labels[i], x, y);
        y += dh;
    }
    g.restore();
});
 
ht.Default.setCompType('xAxis', function(g, rect, comp, data, view) {
    var labels = data.a('xLabels'),
            len = labels.length,
            x = rect.x,
            y = rect.y,
            w = rect.width,
            h = rect.height,
            dw = w / (len * 3 + 1),
            dw3 = 3 * dw;
    x += dw * 2;
    g.save();
    g.font = '12px arial, sans-serif';
    g.fillStyle = 'black';
    g.textAlign = 'center';
    for(var i = 0; i < len; i++){
        g.fillText(labels[i], x, y);
        x += dw3;
    }
    g.restore();
});
 
ht.Default.setImage('chart1', {
    width: 650,
    height: 380,
    comps: [
        // column chart
        {
            type: 'columnChart',
            rect: [10, 60, 630, 260],
            label: true,
            labelColor: '#20284C',
            labelFont: '8px Arial',
            series: [
                {
                    color: '#20284C',
                    values: [471, 482, 567, 525, 590, 637, 780, 679, 848]
                },
                {
                    color: '#303F74',
                    values: [275, 290, 361, 328, 346, 341, 440, 423, 505]
                },
                {
                    color: '#7E93CD',
                    values: [82, 104, 115, 118, 135, 154, 198, 197, 247]
                },
                {
                    color: '#A9B6DB',
                    values: [65, 78, 87, 87, 113, 130, 167, 159, 213]
                }
            ]
        },
        // 竖线
        {
            type: 'rect',
            rect: [15, 60, 1, 260],
            background: '#566CB0'
        },
        // 向上的箭头
        {
            type: 'shape',
            rect: [5.5, 30, 20, 30],
            borderWidth: 1,
            borderColor: '#566CB0',
            points: [0, 20 / 3 * 2, 20 / 2, 0, 20, 20 / 3 * 2, 20 / 2, 0, 20 / 2, 30],
            segments: [1, 2, 2, 1, 2]
        },
        // 坐标文本
        {
            type: 'yAxis',
            rect: [12, 60, 15, 260]
        },
        // Q
        {
            type: 'xAxis',
            rect: [10, 330, 630, 16]
        },
        // line
        {
            type: 'rect',
            rect: [15, 320, 620, 1],
            background: '#566CB0'
        },
        // 向右的箭头
        {
            type: 'shape',
            rect: [635, 310.5, 30, 20],
            borderWidth: 1,
            borderColor: '#566CB0',
            points: [20 / 3 * 2, 0, 30, 20 / 2, 20 / 3 * 2, 20, 30, 20 / 2, 0, 20 / 2],
            segments: [1, 2, 2, 1, 2]
        }
    ]
});
分享到:
评论

相关推荐

    html5_chart

    在HTML5中,可以通过`&lt;svg&gt;`标签直接嵌入矢量图形,并使用`&lt;path&gt;`、`&lt;circle&gt;`、`&lt;rect&gt;`等元素来绘制线条图。 **三、Chart.js库** 对于初学者,使用现有的库如Chart.js可以使创建HTML5图表变得简单。Chart.js是一...

    基于HTML5开发Android应用

    ### 基于HTML5开发Android应用的知识点详解 #### 一、HTML5与Android应用开发概述 HTML5作为下一代Web标准,为开发者提供了丰富的功能和API,使得开发者能够利用这些特性开发出接近原生应用体验的Web应用。随着...

    图表生成.rar

    这些组件易于使用,可以直接嵌入到JavaFX应用程序中,提供交互式图表功能。通过设置不同属性,可以实现各种自定义样式。 3. **ECharts for Java**: ECharts 是一个基于 JavaScript 的开源图表库,而 ECharts for ...

    html5 svg手绘卡通风格统计图表特效.zip

    在实际应用中,这个压缩包的代码可能使用了如D3.js或Chart.js等数据可视化库,结合jQuery来处理SVG元素,创建出卡通风格的统计图表。开发者可以根据自己的需求调整代码,实现个性化的效果,比如改变颜色方案、调整...

    纯asp代码生成图表

    VML(Vector Markup Language)是这个过程中的关键,它是微软提出的一种矢量图形语言,可以在HTML页面中嵌入图形。在ASP中使用VML,开发者可以编写XML格式的VML代码,然后通过服务器端脚本来动态生成和控制这些图形...

    HTML5柱形条形折线数据统计图代码.zip

    这个"HTML5柱形条形折线数据统计图代码.zip"压缩包包含了一系列用于创建动态且富有表现力的数据图表的资源,适用于各种企业应用,如办公系统、办公自动化(OA)和内容管理系统(CMS)。 首先,让我们深入了解一下...

    HTML5报表统计静态页面

    1. **Canvas元素**:HTML5中的Canvas是用于绘制图形的画布,通过JavaScript API可以动态绘制各种图表,如折线图、柱状图、饼图等。开发者可以通过调用canvas上的方法来描绘数据,实现统计图表的动态效果。 2. **SVG...

    AJAX/JavaScript八种方法快速创建图形应用

    SVG是一种基于XML的矢量图形格式,可在网页上直接嵌入,支持动态更新和交互。利用JavaScript,你可以轻松地操纵SVG元素,创建出复杂的图形和动画,适用于图表、地图等应用。 2. **Canvas** HTML5的Canvas元素提供...

    实现在线统计图表的几种方法.pdf

    3. **图像发送**:将生成的图表图像以图片格式(如PNG、JPEG)发送到HTML页面,或者使用SVG矢量图直接嵌入HTML。 服务器端生成图表的好处在于可以处理大量数据,图形质量高,且可以更好地控制用户交互。然而,...

    html曲线图技术资料

    4. **SVG (Scalable Vector Graphics)**: 另一个HTML5特性,SVG是一种矢量图像格式,可以直接在HTML文档中嵌入。SVG图形是基于XML的,因此可以使用DOM操作,非常适合创建曲线图,特别是静态或简单的图表。 5. **CSS...

    ChartSVG-开源

    2. **应用XSLT转换**:使用ChartSVG提供的XSLT脚本,将XML数据转换为SVG格式的图表。 3. **嵌入或导出SVG**:生成的SVG图表可以直接嵌入到HTML文档中,也可以保存为独立文件供其他用途。 4. **交互性**:SVG支持...

    JFreeChart Web例子

    这些图表可以被嵌入到Java Swing应用程序、Java Applet或者Web应用中。JFreeChart支持多种图表类型,包括: 1. **柱状图(Bar Chart)**:常用于展示不同类别的数量差异或比例。 2. **饼图(Pie Chart)**:用来...

    js兼容多浏览器统计图代码

    "js兼容多浏览器统计图代码"这个主题就是针对这一需求,提供了多种技术解决方案,旨在让统计图表在不同的浏览器环境中都能正常工作。下面我们将详细探讨这些技术及其应用场景。 1. **ASP+OWC**: OWC (Office Web ...

    FLASH走势图ASP语言

    然而,随着HTML5的普及,现代浏览器不再支持Flash,因此,现在更多地转向使用基于HTML5的图表库,如Chart.js、D3.js等,它们同样能提供丰富的图形和良好的跨平台支持。 总的来说,Flash走势图ASP语言是一种结合了...

    Highcharts .net(C#)导出图片支持中文svg转jpg等

    在.NET环境中,开发人员经常需要将这些图表转换为图片格式,以便于在离线环境下查看或嵌入到其他文档中。本文将深入探讨如何在C#环境下利用Highcharts .NET库实现图表的导出,并支持中文字符,以及如何将SVG格式转换...

    迭代2

    通过对比这两份文件,我们可以学习到如何在网页中嵌入和使用图表,以及在迭代过程中界面和交互的改进。 `raphael.js` 文件很可能是Raphael库的引用,这是一个用于创建矢量图形的JavaScript库,特别适合于制作各种...

    System.Data.SVGBarChart

    System.Data.SVGBarChart是一个与ASP.NET相关的库,它允许开发者在Web应用程序中利用SVG(Scalable Vector Graphics)技术创建动态的、交互式的图表,如饼图和柱状图。SVG是一种基于XML的矢量图像格式,它可以提供高...

    flash饼状图显示

    5. **API集成**:Flash饼状图通常配有API,便于开发者在应用程序中嵌入和控制图表行为。 在实际开发中,使用Flash饼状图可能涉及以下几个步骤: 1. **数据准备**:整理并格式化要展示的数据,确保数据正确且适用于...

    javascript js如何根据数据生成png图片.zip_jsp js

    5. 渲染图表:调用`chart.draw()`绘制图表。 6. 保存为PNG:jsCharts库可能不直接提供保存为PNG的功能,但可以通过截取Canvas或者模拟右键另存为的方式实现。 在处理中文字符时,如`lj_jscharts3中有乱码的话,js中...

Global site tag (gtag.js) - Google Analytics