Extjs 4 chart自定义坐标轴刻度

Sencha出品的ExtJs是一个非常优秀的前端框架,尤其是具有里程碑意义的4.0的发布。4.0采用MVC架构和全新的class系统,并且提供了非常丰富的组件。但是,尽管ExtJS如此强大,仍有不尽人意的地方。比如,chart里坐标轴的刻度通常是均匀分布的,ExtJS的实现也是通过坐标轴的最大值和最小值以及其他参数配置均匀的计算刻度。但是,在工作过程中碰到需要自定义刻度的情况,如下图所示

水平轴的刻度是5,10,20这样的不均匀值,但是ExtJS不支持这样的功能(至少我翻遍了文档也没找到)。最初想到的办法是隐藏不需要的label,可这样写:


 1 {
2 type: ‘Numeric‘,
3 position: ‘bottom‘,
4 fields: [‘x‘],
5 title: xAxisTitle,
6 minimum: xRange.xMinimum,
7 maximum: xRange.xMaximum,
8 majorTickSteps: 5,
9 minorTickSteps: 10,
10 label: {
11 renderer: function(val) {
12 //lables: [5, 10, 20]
13 if (labels.indexOf(val) < 0) {
14 return ‘‘;
15 }
16 return val;
17 }
18 },
19 grid: true
20 }

但是这样写有两个问题,一是需要显示的label值不一定会出现在renderer中,二是即便label没显示,垂直的网格线(通过配置代码中红色部分的属性可以调节网格线密度)还是会出现,这可能并不是我们想要的。通过查阅源码发现,在坐标轴内部实现中,是通过坐标轴范围和刻度个数来计算的,并且网格线跟坐标刻度是一致的。在源码文件ext\src\chart\axis\Axis.js
480行:

1 // Build the array of steps out of the fixed-value ‘step‘.
2 steps = new Array;
3 for (val = +me.from; val < +me.to; val += step) {
4 steps.push(val);
5 }
6 steps.push(+me.to);

之后渲染label和网格线都用到steps这个数组。所以,可以在这个地方做点手脚,把steps变量强行改成我们需要的数组,让ExtJS按照我们的意图去做。显然,不能直接去修改Ext的源码文件。这里有两种办法,一是用Ext.override方法去重写Ext.chart.axis.Axis的drawAxis方法,二是在Axis的配置参数里提供该方法的自定义实现。前者会影响到之后的所有用到坐标轴的chart,后者只会影响当前的chart.
代码改动如下:


 1 Ext.syncRequire(‘Ext.chart.axis.Axis‘);
2 Ext.override(Ext.chart.axis.Axis, {
3 /**
4 * Renders the axis into the screen and updates its position.
5 */
6 drawAxis: function(init) {
7 var me = this,
8 i,
9 x = me.x,
10 y = me.y,
11 dashSize = me.dashSize,
12 length = me.length,
13 position = me.position,
14 verticalAxis = (position == ‘left‘ || position == ‘right‘),
15 inflections = [],
16 calcLabels = (me.isNumericAxis),
17 stepCalcs = me.applyData(),
18 step = stepCalcs.step,
19 steps = stepCalcs.steps,
20 stepsArray = Ext.isArray(steps),
21 from = stepCalcs.from,
22 to = stepCalcs.to,
23 // If we have a single item, to - from will be 0.
24 axisRange = (to - from) || 1,
25 trueLength,
26 currentX,
27 currentY,
28 path,
29 subDashesX = me.minorTickSteps || 0,
30 subDashesY = me.minorTickSteps || 0,
31 dashesX = Math.max(subDashesX + 1, 0),
32 dashesY = Math.max(subDashesY + 1, 0),
33 dashDirection = (position == ‘left‘ || position == ‘top‘ ? -1 : 1),
34 dashLength = dashSize * dashDirection,
35 series = me.chart.series.items,
36 firstSeries = series[0],
37 gutters = firstSeries ? firstSeries.nullGutters : me.nullGutters,
38 padding,
39 subDashes,
40 subDashValue,
41 delta = 0,
42 stepCount = 0,
43 tick, axes, ln, val, begin, end;
44
45 me.from = from;
46 me.to = to;
47
48 // If there is nothing to show, then leave.
49 if (me.hidden || (from > to)) {
50 return;
51 }
52
53 // If no steps are specified (for instance if the store is empty), then leave.
54 if ((stepsArray && (steps.length == 0)) || (!stepsArray && isNaN(step))) {
55 return;
56 }
57
58 if (stepsArray) {
59 // Clean the array of steps:
60 // First remove the steps that are out of bounds.
61 steps = Ext.Array.filter(steps, function(elem, index, array) {
62 return (+elem > +me.from && +elem < +me.to);
63 }, this);
64
65 // Then add bounds on each side.
66 steps = Ext.Array.union([me.from], steps, [me.to]);
67 } else {
68 // Build the array of steps out of the fixed-value ‘step‘.
69 steps = new Array;
70 if (me.fixedSteps) {
71 steps = me.fixedSteps;
72 } else {
73 for (val = +me.from; val < +me.to; val += step) {
74 steps.push(val);
75 }
76 steps.push(+me.to);
77 }
78
79 }
80 ...//此处省略其他原有代码
81 }
82 });

代码中红色部分if语句块里就是偷梁换柱的地方。使用的时候,在axis的配置代码里加上fixedSteps属性就行了。


 1 {
2 type: ‘Numeric‘,
3 position: ‘bottom‘,
4 fields: [‘x‘],
5 title: xAxisTitle,
6 minimum: xRange.xMinimum,
7 maximum: xRange.xMaximum,
8 fixedSteps: [5, 10,20],
9 grid: true
10 }

至此,雕虫小技大功告成。欢迎拍砖。

Extjs 4 chart自定义坐标轴刻度,布布扣,bubuko.com

时间: 2024-07-30 00:41:33

Extjs 4 chart自定义坐标轴刻度的相关文章

Android 自定义带刻度的seekbar

自定义带刻度的seekbar 1.布局 <span style="font-family:SimHei;font-size:18px;"><com.imibaby.client.views.CustomSeekbar android:id="@+id/myCustomSeekBar" android:layout_width="wrap_content" android:layout_height="wrap_cont

几何画板坐标轴刻度数字怎么变大

在使用几何画板作图时,好多板友都会问这样的一个问题:几何画板中坐标轴上的刻度旁的数字太小了,怎么改大字体?下面就一起来看看几何画板坐标轴刻度数字怎么变大的方法. 方法一 在绘图之前多修改画板默认设置 1.打开几何画板软件,选择“编辑”——“预置”,在弹出的预置对话框下选择“文本”选项,点击“改变对象属性”.  在预置对话框选择文本选项示例 2.在弹出的文本样式对话框选择“坐标轴上的数字”,在右边下拉菜单选择相应的字体和字号,然后点击“确定”按钮.  在文本样式对话框选择坐标轴上的数字示例 3.选

【ExtJS】关于自定义组件(一)

一.目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefield.目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件.目标效果: 二.一些知识的梳理: 当自定义创建一个新类时,最好根据需要继承一个功能相近的基类,这是因为Ext JS 提供的自动化生命周期管理将会被合适的布局管理器管理并且

安卓自定义弧形刻度选择器

在android开发过程中实现通过自定义View实现的弧形刻度选择器,效果如下. 演示效果 一,测量: 首先在onMeasure方法中通过测量获取当前View的宽高,中心点,半径 mWidth = getMeasuredWidth(); mHeight = getMeasuredHeight(); mCenterX = mWidth / 2; mCenterY = 0; radius = Math.min(mWidth / 2 - padding, mHeight / 2 - padding);

【ExtJS】关于自定义组件

一.命名规范 在你编码过程中对类,名字空间以及文件名使用统一的命名规则对你代码的组织,结构化以及可读性有很大的好处. 1.类命名规范: 类名最好只包含字母,在多数情况下,数字是不鼓励使用的,除非非要用不可,也不要使用下划线,-以及其它非字母字符,例如: MyCompany.useful_util.Debug_Toolbar 不鼓励这样命名 MyCompany.util.Base64 可接受的命名 类名最好包括组织,在适当的名字空间通过使用.来访问对象属性,至少,类名应该有一个顶层的包.例如: M

Datazen地图Chart自定义数据

 此篇介绍如何将数据关联到Datazen地图图表.我们会将数据库中的数据映射到地图上. 首先查看下默认地图图表绑定的数据.以下是系统自带的美国地图数据,主要有两列,一列为地名,一列为度量数据.地图会根据地名将度量数据映射到地图图表上. 也就是说只要有这两列系统就可以将数据映射到地图上,只要确保地名列跟地图数据里的列可以映射到一起. 接下来我们将在数据库里新建一个数据查询,然后将结果映射到地图上. 打开SQL Server,由于手头上没有现成的类似数据,所以用简单的SQL语句生成些数据.实际项

WPF ToolKit Chart 自定义样式

1.引用:WPFToolkit.dll, System.Windows.Controls.DataVisualization.Toolkit.dll 2. 页面代码参考如下: <UserControl x:Class="GDNXFD.Alert.IFIXControls.StationPieChart" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="

ExtJS+ASP.NET自定义曲线

第一步:创建Store数据源 var myData = []; myData.push({ 'name': '1', 'Oil_Production': '30', 'Water_Injection': '55', 'Gas_Production': '23' }); myData.push({ 'name': '2', 'Oil_Production': '20', 'Water_Injection': '25', 'Gas_Production': '63' }); myData.push(

wpf自定义带刻度的柱状图控件

效果图: 主要代码xaml: <UserControl x:Class="INSControls._01Conning.Steer.ConningSpeedBar" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="htt