blob: 65c305bacbf02bf66d7b4730ad7562a4aa2d7f61 [file] [log] [blame]
/**
* echarts组件类: 坐标轴
*
* @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
* @author Kener (@Kener-林峰, linzhifeng@baidu.com)
*
* 直角坐标系中坐标轴数组,数组中每一项代表一条横轴(纵轴)坐标轴。
* 标准(1.0)中规定最多同时存在2条横轴和2条纵轴
* 单条横轴时可指定安放于grid的底部(默认)或顶部,2条同时存在时则默认第一条安放于底部,第二天安放于顶部
* 单条纵轴时可指定安放于grid的左侧(默认)或右侧,2条同时存在时则默认第一条安放于左侧,第二天安放于右侧。
* 坐标轴有两种类型,类目型和数值型(区别详见axis):
* 横轴通常为类目型,但条形图时则横轴为数值型,散点图时则横纵均为数值型
* 纵轴通常为数值型,但条形图时则纵轴为类目型。
*
*/
define(function (require) {
/**
* 构造函数
* @param {Object} messageCenter echart消息中心
* @param {ZRender} zr zrender实例
* @param {Object} option 图表选项
* @param {string=} option.xAxis.type 坐标轴类型,横轴默认为类目型'category'
* @param {string=} option.yAxis.type 坐标轴类型,纵轴默认为类目型'value'
* @param {Object} component 组件
* @param {string} axisType 横走or纵轴
*/
function Axis(ecConfig, messageCenter, zr, option, component, axisType) {
var Base = require('./base');
Base.call(this, ecConfig, zr);
var self = this;
self.type = ecConfig.COMPONENT_TYPE_AXIS;
var _axisList = [];
/**
* 参数修正&默认值赋值,重载基类方法
* @param {Object} opt 参数
*/
function reformOption(opt) {
// 不写或传了个空数值默认为数值轴
if (!opt
|| (opt instanceof Array && opt.length === 0)
) {
opt = [{
type : ecConfig.COMPONENT_TYPE_AXIS_VALUE
}];
}
else if (!(opt instanceof Array)){
opt = [opt];
}
// 最多两条,其他参数忽略
if (opt.length > 2) {
opt = [opt[0],opt[1]];
}
if (axisType == 'xAxis') {
// 横轴位置默认配置
if (!opt[0].position // 没配置或配置错
|| (opt[0].position != 'bottom'
&& opt[0].position != 'top')
) {
opt[0].position = 'bottom';
}
if (opt.length > 1) {
opt[1].position = opt[0].position == 'bottom'
? 'top' : 'bottom';
}
for (var i = 0, l = opt.length; i < l; i++) {
// 坐标轴类型,横轴默认为类目型'category'
opt[i].type = opt[i].type || 'category';
// 标识轴类型&索引
opt[i].xAxisIndex = i;
opt[i].yAxisIndex = -1;
}
}
else {
// 纵轴位置默认配置
if (!opt[0].position // 没配置或配置错
|| (opt[0].position != 'left'
&& opt[0].position != 'right')
) {
opt[0].position = 'left';
}
if (opt.length > 1) {
opt[1].position = opt[0].position == 'left'
? 'right' : 'left';
}
for (var i = 0, l = opt.length; i < l; i++) {
// 坐标轴类型,纵轴默认为数值型'value'
opt[i].type = opt[i].type || 'value';
// 标识轴类型&索引
opt[i].xAxisIndex = -1;
opt[i].yAxisIndex = i;
}
}
return opt;
}
/**
* 构造函数默认执行的初始化方法,也用于创建实例后动态修改
* @param {Object} newZr
* @param {Object} newOption
* @param {Object} newCompoent
*/
function init(newOption, newCompoent, newAxisType) {
component = newCompoent;
axisType = newAxisType;
self.clear();
var axisOption;
if (axisType == 'xAxis') {
option.xAxis = self.reformOption(newOption.xAxis);
axisOption = option.xAxis;
}
else {
option.yAxis = self.reformOption(newOption.yAxis);
axisOption = option.yAxis;
}
var CategoryAxis = require('./categoryAxis');
var ValueAxis = require('./valueAxis');
for (var i = 0, l = axisOption.length; i < l; i++) {
_axisList.push(
axisOption[i].type == 'category'
? new CategoryAxis(
ecConfig,
messageCenter, zr,
axisOption[i], component
)
: new ValueAxis(
ecConfig,
messageCenter, zr,
axisOption[i], component,
option.series
)
);
}
}
/**
* 刷新
*/
function refresh(newOption) {
var axisOption;
var series;
if (newOption) {
if (axisType == 'xAxis') {
option.xAxis =self.reformOption(newOption.xAxis);
axisOption = option.xAxis;
}
else {
option.yAxis = reformOption(newOption.yAxis);
axisOption = option.yAxis;
}
series = newOption.series;
}
for (var i = 0, l = _axisList.length; i < l; i++) {
_axisList[i].refresh && _axisList[i].refresh(
axisOption ? axisOption[i] : false, series
);
}
}
/**
* 根据值换算位置
* @param {number} idx 坐标轴索引0~1
*/
function getAxis(idx) {
return _axisList[idx];
}
/**
* 清除坐标轴子对象,实例仍可用,重载基类方法
*/
function clear() {
for (var i = 0, l = _axisList.length; i < l; i++) {
_axisList[i].dispose && _axisList[i].dispose();
}
_axisList = [];
}
// 重载基类方法
self.clear = clear;
self.reformOption = reformOption;
self.init = init;
self.refresh = refresh;
self.getAxis = getAxis;
init(option, component, axisType);
}
require('../component').define('axis', Axis);
return Axis;
});