base.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /**
  2. * @fileOverview the Attribute base class
  3. */
  4. var isString = require('@antv/util/lib/type/is-string');
  5. var isArray = require('@antv/util/lib/type/is-array');
  6. var mix = require('@antv/util/lib/mix');
  7. var each = require('@antv/util/lib/each');
  8. function toScaleString(scale, value) {
  9. if (isString(value)) {
  10. return value;
  11. }
  12. return scale.invert(scale.scale(value));
  13. }
  14. /**
  15. * 所有视觉通道属性的基类
  16. * @class Attr
  17. */
  18. var AttributeBase =
  19. /*#__PURE__*/
  20. function () {
  21. function AttributeBase(cfg) {
  22. /**
  23. * 属性的类型
  24. * @type {String}
  25. */
  26. this.type = 'base';
  27. /**
  28. * 属性的名称
  29. * @type {String}
  30. */
  31. this.name = null;
  32. /**
  33. * 回调函数
  34. * @type {Function}
  35. */
  36. this.method = null;
  37. /**
  38. * 备选的值数组
  39. * @type {Array}
  40. */
  41. this.values = [];
  42. /**
  43. * 属性内部的度量
  44. * @type {Array}
  45. */
  46. this.scales = [];
  47. /**
  48. * 是否通过线性取值, 如果未指定,则根据数值的类型判定
  49. * @type {Boolean}
  50. */
  51. this.linear = null;
  52. mix(this, cfg);
  53. } // 获取属性值,将值映射到视觉通道
  54. var _proto = AttributeBase.prototype;
  55. _proto._getAttrValue = function _getAttrValue(scale, value) {
  56. var values = this.values;
  57. if (scale.isCategory && !this.linear) {
  58. var index = scale.translate(value);
  59. return values[index % values.length];
  60. }
  61. var percent = scale.scale(value);
  62. return this.getLinearValue(percent);
  63. };
  64. /**
  65. * 如果进行线性映射,返回对应的映射值
  66. * @protected
  67. * @param {Number} percent 百分比
  68. * @return {*} 颜色值、形状、大小等
  69. */
  70. _proto.getLinearValue = function getLinearValue(percent) {
  71. var values = this.values;
  72. var steps = values.length - 1;
  73. var step = Math.floor(steps * percent);
  74. var leftPercent = steps * percent - step;
  75. var start = values[step];
  76. var end = step === steps ? start : values[step + 1];
  77. var rstValue = start + (end - start) * leftPercent;
  78. return rstValue;
  79. };
  80. /**
  81. * 默认的回调函数
  82. * @param {*} value 回调函数的值
  83. * @type {Function}
  84. * @return {Array} 返回映射后的值
  85. */
  86. _proto.callback = function callback(value) {
  87. var self = this;
  88. var scale = self.scales[0];
  89. var rstValue = null;
  90. if (scale.type === 'identity') {
  91. rstValue = scale.value;
  92. } else {
  93. rstValue = self._getAttrValue(scale, value);
  94. }
  95. return rstValue;
  96. };
  97. /**
  98. * 根据度量获取属性名
  99. * @return {Array} dims of this Attribute
  100. */
  101. _proto.getNames = function getNames() {
  102. var scales = this.scales;
  103. var names = this.names;
  104. var length = Math.min(scales.length, names.length);
  105. var rst = [];
  106. for (var i = 0; i < length; i++) {
  107. rst.push(names[i]);
  108. }
  109. return rst;
  110. };
  111. /**
  112. * 根据度量获取维度名
  113. * @return {Array} dims of this Attribute
  114. */
  115. _proto.getFields = function getFields() {
  116. var scales = this.scales;
  117. var rst = [];
  118. each(scales, function (scale) {
  119. rst.push(scale.field);
  120. });
  121. return rst;
  122. };
  123. /**
  124. * 根据名称获取度量
  125. * @param {String} name the name of scale
  126. * @return {Scale} scale
  127. */
  128. _proto.getScale = function getScale(name) {
  129. var scales = this.scales;
  130. var names = this.names;
  131. var index = names.indexOf(name);
  132. return scales[index];
  133. };
  134. /**
  135. * 映射数据
  136. * @param {*} param1...paramn 多个数值
  137. * @return {Array} 映射的值组成的数组
  138. */
  139. _proto.mapping = function mapping() {
  140. var scales = this.scales;
  141. var callback = this.callback;
  142. for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
  143. params[_key] = arguments[_key];
  144. }
  145. var values = params;
  146. if (callback) {
  147. for (var i = 0, len = params.length; i < len; i++) {
  148. params[i] = this._toOriginParam(params[i], scales[i]);
  149. }
  150. values = callback.apply(this, params);
  151. }
  152. values = [].concat(values);
  153. return values;
  154. }; // 原始的参数
  155. _proto._toOriginParam = function _toOriginParam(param, scale) {
  156. var rst = param;
  157. if (!scale.isLinear) {
  158. if (isArray(param)) {
  159. rst = [];
  160. for (var i = 0, len = param.length; i < len; i++) {
  161. rst.push(toScaleString(scale, param[i]));
  162. }
  163. } else {
  164. rst = toScaleString(scale, param);
  165. }
  166. }
  167. return rst;
  168. };
  169. return AttributeBase;
  170. }();
  171. module.exports = AttributeBase;