echarts 4.5.0-rc.2 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/.github/pull_request_template.md +66 -0
  2. package/.github/workflows/nodejs.yml +12 -2
  3. package/CONTRIBUTING.md +16 -160
  4. package/NOTICE +1 -1
  5. package/README.md +2 -2
  6. package/dist/echarts-en.common.js +2808 -1188
  7. package/dist/echarts-en.common.min.js +1 -1
  8. package/dist/echarts-en.js +3559 -1437
  9. package/dist/echarts-en.js.map +1 -1
  10. package/dist/echarts-en.min.js +1 -1
  11. package/dist/echarts-en.simple.js +2453 -1002
  12. package/dist/echarts-en.simple.min.js +1 -1
  13. package/dist/echarts.common.js +2782 -1188
  14. package/dist/echarts.common.min.js +1 -1
  15. package/dist/echarts.js +3533 -1437
  16. package/dist/echarts.js.map +1 -1
  17. package/dist/echarts.min.js +1 -1
  18. package/dist/echarts.simple.js +2427 -1002
  19. package/dist/echarts.simple.min.js +1 -1
  20. package/dist/extension/bmap.js +336 -2
  21. package/dist/extension/bmap.js.map +1 -1
  22. package/dist/extension/bmap.min.js +1 -1
  23. package/extension/bmap/BMapView.js +6 -2
  24. package/extension-src/bmap/BMapView.js +3 -2
  25. package/lib/chart/bar/BarSeries.js +14 -1
  26. package/lib/chart/bar/BarView.js +161 -16
  27. package/lib/chart/bar/BaseBarSeries.js +3 -1
  28. package/lib/chart/candlestick/candlestickVisual.js +1 -1
  29. package/lib/chart/effectScatter/EffectScatterSeries.js +3 -1
  30. package/lib/chart/funnel/FunnelSeries.js +13 -5
  31. package/lib/chart/gauge/GaugeSeries.js +0 -2
  32. package/lib/chart/graph/GraphSeries.js +11 -5
  33. package/lib/chart/graph/GraphView.js +30 -12
  34. package/lib/chart/heatmap/HeatmapView.js +4 -4
  35. package/lib/chart/helper/EffectLine.js +23 -1
  36. package/lib/chart/helper/EffectSymbol.js +2 -1
  37. package/lib/chart/helper/Line.js +94 -33
  38. package/lib/chart/helper/LineDraw.js +5 -1
  39. package/lib/chart/helper/Symbol.js +1 -2
  40. package/lib/chart/helper/createClipPathFromCoordSys.js +4 -1
  41. package/lib/chart/helper/createListFromArray.js +14 -8
  42. package/lib/chart/helper/createRenderPlanner.js +6 -3
  43. package/lib/chart/helper/whiskerBoxCommon.js +22 -16
  44. package/lib/chart/line/LineSeries.js +3 -1
  45. package/lib/chart/line/LineView.js +41 -2
  46. package/lib/chart/map/MapSeries.js +11 -3
  47. package/lib/chart/pie/PieSeries.js +27 -6
  48. package/lib/chart/pie/PieView.js +22 -15
  49. package/lib/chart/pie/labelLayout.js +102 -19
  50. package/lib/chart/pie/pieLayout.js +19 -7
  51. package/lib/chart/radar/RadarSeries.js +23 -3
  52. package/lib/chart/sankey/SankeySeries.js +13 -1
  53. package/lib/chart/sankey/SankeyView.js +70 -32
  54. package/lib/chart/sankey/sankeyLayout.js +22 -3
  55. package/lib/chart/scatter/ScatterSeries.js +3 -1
  56. package/lib/chart/sunburst/SunburstPiece.js +1 -0
  57. package/lib/chart/sunburst/SunburstSeries.js +12 -7
  58. package/lib/chart/sunburst/SunburstView.js +5 -1
  59. package/lib/chart/themeRiver/ThemeRiverSeries.js +3 -3
  60. package/lib/chart/tree/TreeSeries.js +20 -3
  61. package/lib/chart/tree/TreeView.js +151 -25
  62. package/lib/chart/treemap/TreemapSeries.js +15 -3
  63. package/lib/chart/treemap/TreemapView.js +80 -38
  64. package/lib/component/axis/AngleAxisView.js +64 -7
  65. package/lib/component/axis/AxisBuilder.js +62 -24
  66. package/lib/component/axis/CartesianAxisView.js +52 -85
  67. package/lib/component/axis/RadiusAxisView.js +36 -4
  68. package/lib/component/axis/SingleAxisView.js +21 -6
  69. package/lib/component/axis/axisSplitHelper.js +132 -0
  70. package/lib/component/brush/BrushView.js +11 -1
  71. package/lib/component/brush/visualEncoding.js +13 -2
  72. package/lib/component/dataZoom/SliderZoomView.js +4 -10
  73. package/lib/component/helper/BrushController.js +33 -43
  74. package/lib/component/helper/MapDraw.js +30 -4
  75. package/lib/component/legend/LegendModel.js +3 -3
  76. package/lib/component/legend/LegendView.js +17 -13
  77. package/lib/component/legend/ScrollableLegendView.js +18 -18
  78. package/lib/component/marker/MarkLineModel.js +2 -1
  79. package/lib/component/marker/markerHelper.js +7 -4
  80. package/lib/component/title.js +6 -2
  81. package/lib/component/toolbox/ToolboxView.js +5 -1
  82. package/lib/component/toolbox/feature/MagicType.js +20 -14
  83. package/lib/component/toolbox/feature/SaveAsImage.js +2 -1
  84. package/lib/component/tooltip/TooltipContent.js +60 -23
  85. package/lib/component/tooltip/TooltipView.js +7 -8
  86. package/lib/component/visualMap/PiecewiseModel.js +3 -6
  87. package/lib/coord/Axis.js +30 -2
  88. package/lib/coord/View.js +9 -0
  89. package/lib/coord/axisDefault.js +21 -2
  90. package/lib/coord/axisHelper.js +22 -16
  91. package/lib/coord/calendar/Calendar.js +8 -4
  92. package/lib/coord/geo/geoJSONLoader.js +3 -2
  93. package/lib/coord/geo/geoSourceManager.js +3 -2
  94. package/lib/coord/geo/parseGeoJson.js +3 -2
  95. package/lib/coord/radar/Radar.js +5 -5
  96. package/lib/data/DataDimensionInfo.js +157 -0
  97. package/lib/data/List.js +25 -19
  98. package/lib/data/Tree.js +9 -19
  99. package/lib/data/helper/completeDimensions.js +43 -32
  100. package/lib/data/helper/createDimensions.js +2 -0
  101. package/lib/data/helper/sourceHelper.js +214 -114
  102. package/lib/echarts.js +57 -34
  103. package/lib/langEN.js +26 -0
  104. package/lib/layout/barGrid.js +19 -13
  105. package/lib/layout/barPolar.js +0 -5
  106. package/lib/loading/default.js +43 -27
  107. package/lib/model/Series.js +4 -4
  108. package/lib/model/referHelper.js +40 -12
  109. package/lib/scale/Interval.js +87 -2
  110. package/lib/scale/Log.js +9 -2
  111. package/lib/scale/helper.js +1 -43
  112. package/lib/stream/Scheduler.js +9 -1
  113. package/lib/theme/dark.js +3 -0
  114. package/lib/util/format.js +19 -2
  115. package/lib/util/graphic.js +14 -12
  116. package/lib/visual/LegendVisualProvider.js +75 -0
  117. package/lib/visual/dataColor.js +2 -12
  118. package/lib/visual/seriesColor.js +15 -7
  119. package/lib/visual/symbol.js +12 -2
  120. package/map/js/china.js +1 -1
  121. package/map/js/province/chongqing.js +1 -1
  122. package/map/js/province/gansu.js +2 -2
  123. package/map/js/province/tianjin.js +1 -28
  124. package/map/json/china.json +1 -1
  125. package/map/json/province/chongqing.json +1 -1
  126. package/map/json/province/tianjin.json +1 -1
  127. package/package.json +11 -6
  128. package/src/chart/bar/BarSeries.js +15 -1
  129. package/src/chart/bar/BarView.js +162 -15
  130. package/src/chart/bar/BaseBarSeries.js +1 -1
  131. package/src/chart/candlestick/candlestickVisual.js +1 -1
  132. package/src/chart/effectScatter/EffectScatterSeries.js +1 -1
  133. package/src/chart/funnel/FunnelSeries.js +10 -4
  134. package/src/chart/gauge/GaugeSeries.js +0 -1
  135. package/src/chart/graph/GraphSeries.js +10 -4
  136. package/src/chart/graph/GraphView.js +28 -10
  137. package/src/chart/heatmap/HeatmapView.js +4 -4
  138. package/src/chart/helper/EffectLine.js +23 -1
  139. package/src/chart/helper/EffectSymbol.js +2 -1
  140. package/src/chart/helper/Line.js +84 -26
  141. package/src/chart/helper/LineDraw.js +5 -1
  142. package/src/chart/helper/Symbol.js +2 -2
  143. package/src/chart/helper/createClipPathFromCoordSys.js +4 -0
  144. package/src/chart/helper/createListFromArray.js +13 -8
  145. package/src/chart/helper/createRenderPlanner.js +5 -2
  146. package/src/chart/helper/whiskerBoxCommon.js +21 -16
  147. package/src/chart/line/LineSeries.js +1 -1
  148. package/src/chart/line/LineView.js +45 -1
  149. package/src/chart/map/MapSeries.js +8 -3
  150. package/src/chart/pie/PieSeries.js +26 -5
  151. package/src/chart/pie/PieView.js +20 -15
  152. package/src/chart/pie/labelLayout.js +114 -22
  153. package/src/chart/pie/pieLayout.js +20 -7
  154. package/src/chart/radar/RadarSeries.js +27 -3
  155. package/src/chart/sankey/SankeySeries.js +12 -1
  156. package/src/chart/sankey/SankeyView.js +75 -30
  157. package/src/chart/sankey/sankeyLayout.js +25 -5
  158. package/src/chart/scatter/ScatterSeries.js +1 -1
  159. package/src/chart/sunburst/SunburstPiece.js +2 -0
  160. package/src/chart/sunburst/SunburstSeries.js +12 -7
  161. package/src/chart/sunburst/SunburstView.js +2 -1
  162. package/src/chart/themeRiver/ThemeRiverSeries.js +4 -3
  163. package/src/chart/tree/TreeSeries.js +19 -6
  164. package/src/chart/tree/TreeView.js +155 -22
  165. package/src/chart/treemap/TreemapSeries.js +15 -5
  166. package/src/chart/treemap/TreemapView.js +77 -41
  167. package/src/component/axis/AngleAxisView.js +75 -7
  168. package/src/component/axis/AxisBuilder.js +77 -32
  169. package/src/component/axis/CartesianAxisView.js +47 -83
  170. package/src/component/axis/RadiusAxisView.js +37 -4
  171. package/src/component/axis/SingleAxisView.js +21 -4
  172. package/src/component/axis/axisSplitHelper.js +114 -0
  173. package/src/component/brush/BrushView.js +8 -1
  174. package/src/component/brush/visualEncoding.js +6 -3
  175. package/src/component/dataZoom/SliderZoomView.js +4 -9
  176. package/src/component/helper/BrushController.js +40 -47
  177. package/src/component/helper/MapDraw.js +27 -4
  178. package/src/component/legend/LegendModel.js +3 -3
  179. package/src/component/legend/LegendView.js +18 -12
  180. package/src/component/legend/ScrollableLegendView.js +18 -16
  181. package/src/component/marker/MarkLineModel.js +2 -1
  182. package/src/component/marker/markerHelper.js +8 -5
  183. package/src/component/title.js +3 -2
  184. package/src/component/toolbox/ToolboxView.js +5 -0
  185. package/src/component/toolbox/feature/MagicType.js +19 -13
  186. package/src/component/toolbox/feature/SaveAsImage.js +2 -1
  187. package/src/component/tooltip/TooltipContent.js +59 -22
  188. package/src/component/tooltip/TooltipView.js +10 -8
  189. package/src/component/visualMap/PiecewiseModel.js +5 -9
  190. package/src/coord/Axis.js +29 -2
  191. package/src/coord/View.js +10 -1
  192. package/src/coord/axisDefault.js +25 -1
  193. package/src/coord/axisHelper.js +26 -19
  194. package/src/coord/calendar/Calendar.js +12 -5
  195. package/src/coord/geo/geoJSONLoader.js +3 -2
  196. package/src/coord/geo/geoSourceManager.js +3 -2
  197. package/src/coord/geo/parseGeoJson.js +3 -2
  198. package/src/coord/radar/Radar.js +6 -8
  199. package/src/data/DataDimensionInfo.js +135 -0
  200. package/src/data/List.js +29 -16
  201. package/src/data/Tree.js +12 -17
  202. package/src/data/helper/completeDimensions.js +49 -30
  203. package/src/data/helper/createDimensions.js +2 -0
  204. package/src/data/helper/sourceHelper.js +216 -124
  205. package/src/echarts.js +60 -36
  206. package/src/langEN.js +26 -0
  207. package/src/layout/barGrid.js +22 -10
  208. package/src/layout/barPolar.js +0 -4
  209. package/src/loading/default.js +46 -34
  210. package/src/model/Series.js +4 -4
  211. package/src/model/referHelper.js +34 -11
  212. package/src/scale/Interval.js +84 -4
  213. package/src/scale/Log.js +9 -2
  214. package/src/scale/helper.js +1 -39
  215. package/src/stream/Scheduler.js +8 -0
  216. package/src/theme/dark.js +3 -0
  217. package/src/util/format.js +17 -1
  218. package/src/util/graphic.js +13 -11
  219. package/src/visual/LegendVisualProvider.js +55 -0
  220. package/src/visual/dataColor.js +0 -13
  221. package/src/visual/seriesColor.js +13 -7
  222. package/src/visual/symbol.js +11 -2
  223. package/theme/azul.js +163 -0
  224. package/theme/bee-inspired.js +178 -0
  225. package/theme/blue.js +178 -0
  226. package/theme/caravan.js +178 -0
  227. package/theme/carp.js +163 -0
  228. package/theme/cool.js +180 -0
  229. package/theme/dark-blue.js +168 -0
  230. package/theme/dark-bold.js +168 -0
  231. package/theme/dark-digerati.js +168 -0
  232. package/theme/dark-fresh-cut.js +168 -0
  233. package/theme/dark-mushroom.js +168 -0
  234. package/theme/dark.js +69 -62
  235. package/theme/eduardo.js +178 -0
  236. package/theme/forest.js +163 -0
  237. package/theme/fresh-cut.js +163 -0
  238. package/theme/fruit.js +178 -0
  239. package/theme/gray.js +220 -0
  240. package/theme/green.js +222 -0
  241. package/theme/helianthus.js +263 -0
  242. package/theme/infographic.js +72 -57
  243. package/theme/inspired.js +163 -0
  244. package/theme/jazz.js +163 -0
  245. package/theme/london.js +163 -0
  246. package/theme/macarons.js +80 -57
  247. package/theme/macarons2.js +251 -0
  248. package/theme/mint.js +155 -0
  249. package/theme/red-velvet.js +163 -0
  250. package/theme/red.js +225 -0
  251. package/theme/roma.js +55 -22
  252. package/theme/royal.js +163 -0
  253. package/theme/sakura.js +140 -0
  254. package/theme/shine.js +52 -45
  255. package/theme/tech-blue.js +180 -0
  256. package/theme/vintage.js +37 -23
@@ -20,6 +20,10 @@
20
20
 
21
21
  var textContain = require("zrender/lib/contain/text");
22
22
 
23
+ var _number = require("../../util/number");
24
+
25
+ var parsePercent = _number.parsePercent;
26
+
23
27
  /*
24
28
  * Licensed to the Apache Software Foundation (ASF) under one
25
29
  * or more contributor license agreements. See the NOTICE file
@@ -41,13 +45,17 @@ var textContain = require("zrender/lib/contain/text");
41
45
  // FIXME emphasis label position is not same with normal label position
42
46
  var RADIAN = Math.PI / 180;
43
47
 
44
- function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
48
+ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) {
45
49
  list.sort(function (a, b) {
46
50
  return a.y - b.y;
47
51
  });
48
52
 
49
53
  function shiftDown(start, end, delta, dir) {
50
54
  for (var j = start; j < end; j++) {
55
+ if (list[j].y + delta > viewTop + viewHeight) {
56
+ break;
57
+ }
58
+
51
59
  list[j].y += delta;
52
60
 
53
61
  if (j > start && j + 1 < end && list[j + 1].y > list[j].y + list[j].height) {
@@ -61,6 +69,10 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
61
69
 
62
70
  function shiftUp(end, delta) {
63
71
  for (var j = end; j >= 0; j--) {
72
+ if (list[j].y - delta < viewTop) {
73
+ break;
74
+ }
75
+
64
76
  list[j].y -= delta;
65
77
 
66
78
  if (j > 0 && list[j].y > list[j - 1].y + list[j - 1].height) {
@@ -78,6 +90,10 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
78
90
  : 0; // up
79
91
 
80
92
  for (var i = 0, l = list.length; i < l; i++) {
93
+ if (list[i].labelAlignTo !== 'none') {
94
+ continue;
95
+ }
96
+
81
97
  var deltaY = Math.abs(list[i].y - cy);
82
98
  var length = list[i].len;
83
99
  var length2 = list[i].len2;
@@ -105,6 +121,12 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
105
121
  var downList = [];
106
122
 
107
123
  for (var i = 0; i < len; i++) {
124
+ if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') {
125
+ var dx = list[i].x - farthestX;
126
+ list[i].linePoints[1][0] += dx;
127
+ list[i].x = farthestX;
128
+ }
129
+
108
130
  delta = list[i].y - lastY;
109
131
 
110
132
  if (delta < 0) {
@@ -130,9 +152,11 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
130
152
  changeX(downList, true, cx, cy, r, dir);
131
153
  }
132
154
 
133
- function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
155
+ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) {
134
156
  var leftList = [];
135
157
  var rightList = [];
158
+ var leftmostX = Number.MAX_VALUE;
159
+ var rightmostX = -Number.MAX_VALUE;
136
160
 
137
161
  for (var i = 0; i < labelLayoutList.length; i++) {
138
162
  if (isPositionCenter(labelLayoutList[i])) {
@@ -140,33 +164,72 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
140
164
  }
141
165
 
142
166
  if (labelLayoutList[i].x < cx) {
167
+ leftmostX = Math.min(leftmostX, labelLayoutList[i].x);
143
168
  leftList.push(labelLayoutList[i]);
144
169
  } else {
170
+ rightmostX = Math.max(rightmostX, labelLayoutList[i].x);
145
171
  rightList.push(labelLayoutList[i]);
146
172
  }
147
173
  }
148
174
 
149
- adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight);
150
- adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);
175
+ adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX);
176
+ adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX);
151
177
 
152
178
  for (var i = 0; i < labelLayoutList.length; i++) {
153
- if (isPositionCenter(labelLayoutList[i])) {
179
+ var layout = labelLayoutList[i];
180
+
181
+ if (isPositionCenter(layout)) {
154
182
  continue;
155
183
  }
156
184
 
157
- var linePoints = labelLayoutList[i].linePoints;
185
+ var linePoints = layout.linePoints;
158
186
 
159
187
  if (linePoints) {
188
+ var isAlignToEdge = layout.labelAlignTo === 'edge';
189
+ var realTextWidth = layout.textRect.width;
190
+ var targetTextWidth;
191
+
192
+ if (isAlignToEdge) {
193
+ if (layout.x < cx) {
194
+ targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.labelMargin;
195
+ } else {
196
+ targetTextWidth = viewLeft + viewWidth - layout.labelMargin - linePoints[2][0] - layout.labelDistance;
197
+ }
198
+ } else {
199
+ if (layout.x < cx) {
200
+ targetTextWidth = layout.x - viewLeft - layout.bleedMargin;
201
+ } else {
202
+ targetTextWidth = viewLeft + viewWidth - layout.x - layout.bleedMargin;
203
+ }
204
+ }
205
+
206
+ if (targetTextWidth < layout.textRect.width) {
207
+ layout.text = textContain.truncateText(layout.text, targetTextWidth, layout.font);
208
+
209
+ if (layout.labelAlignTo === 'edge') {
210
+ realTextWidth = textContain.getWidth(layout.text, layout.font);
211
+ }
212
+ }
213
+
160
214
  var dist = linePoints[1][0] - linePoints[2][0];
161
215
 
162
- if (labelLayoutList[i].x < cx) {
163
- linePoints[2][0] = labelLayoutList[i].x + 3;
216
+ if (isAlignToEdge) {
217
+ if (layout.x < cx) {
218
+ linePoints[2][0] = viewLeft + layout.labelMargin + realTextWidth + layout.labelDistance;
219
+ } else {
220
+ linePoints[2][0] = viewLeft + viewWidth - layout.labelMargin - realTextWidth - layout.labelDistance;
221
+ }
164
222
  } else {
165
- linePoints[2][0] = labelLayoutList[i].x - 3;
223
+ if (layout.x < cx) {
224
+ linePoints[2][0] = layout.x + layout.labelDistance;
225
+ } else {
226
+ linePoints[2][0] = layout.x - layout.labelDistance;
227
+ }
228
+
229
+ linePoints[1][0] = linePoints[2][0] + dist;
166
230
  }
167
231
 
168
- linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y;
169
- linePoints[1][0] = linePoints[2][0] + dist;
232
+ linePoints[1][1] = linePoints[2][1] = layout.y;
170
233
  }
171
234
  }
172
235
  }
@@ -176,7 +239,7 @@ function isPositionCenter(layout) {
176
239
  return layout.position === 'center';
177
240
  }
178
241
 
179
- function _default(seriesModel, r, viewWidth, viewHeight, sum) {
242
+ function _default(seriesModel, r, viewWidth, viewHeight, viewLeft, viewTop) {
180
243
  var data = seriesModel.getData();
181
244
  var labelLayoutList = [];
182
245
  var cx;
@@ -189,9 +252,16 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
189
252
  var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis
190
253
 
191
254
  var labelPosition = labelModel.get('position') || itemModel.get('emphasis.label.position');
255
+ var labelDistance = labelModel.get('distanceToLabelLine');
256
+ var labelAlignTo = labelModel.get('alignTo');
257
+ var labelMargin = parsePercent(labelModel.get('margin'), viewWidth);
258
+ var bleedMargin = labelModel.get('bleedMargin');
259
+ var font = labelModel.getFont();
192
260
  var labelLineModel = itemModel.getModel('labelLine');
193
261
  var labelLineLen = labelLineModel.get('length');
262
+ labelLineLen = parsePercent(labelLineLen, viewWidth);
194
263
  var labelLineLen2 = labelLineModel.get('length2');
264
+ labelLineLen2 = parsePercent(labelLineLen2, viewWidth);
195
265
 
196
266
  if (layout.angle < minShowLabelRadian) {
197
267
  return;
@@ -206,6 +276,8 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
206
276
  var textAlign;
207
277
  cx = layout.cx;
208
278
  cy = layout.cy;
279
+ var text = seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx);
280
+ var textRect = textContain.getBoundingRect(text, font, textAlign, 'top');
209
281
  var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
210
282
 
211
283
  if (labelPosition === 'center') {
@@ -224,15 +296,21 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
224
296
  var y2 = y1 + dy * (labelLineLen + r - layout.r);
225
297
  var x3 = x2 + (dx < 0 ? -1 : 1) * labelLineLen2;
226
298
  var y3 = y2;
227
- textX = x3 + (dx < 0 ? -5 : 5);
299
+
300
+ if (labelAlignTo === 'edge') {
301
+ // Adjust textX because text align of edge is opposite
302
+ textX = dx < 0 ? viewLeft + labelMargin : viewLeft + viewWidth - labelMargin;
303
+ } else {
304
+ textX = x3 + (dx < 0 ? -labelDistance : labelDistance);
305
+ }
306
+
228
307
  textY = y3;
229
308
  linePoints = [[x1, y1], [x2, y2], [x3, y3]];
230
309
  }
231
310
 
232
- textAlign = isLabelInside ? 'center' : dx > 0 ? 'left' : 'right';
311
+ textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? dx > 0 ? 'right' : 'left' : dx > 0 ? 'left' : 'right';
233
312
  }
234
313
 
235
- var font = labelModel.getFont();
236
314
  var labelRotate;
237
315
  var rotate = labelModel.get('rotate');
238
316
 
@@ -242,8 +320,6 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
242
320
  labelRotate = rotate ? dx < 0 ? -midAngle + Math.PI : -midAngle : 0;
243
321
  }
244
322
 
245
- var text = seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx);
246
- var textRect = textContain.getBoundingRect(text, font, textAlign, 'top');
247
323
  hasLabelRotate = !!labelRotate;
248
324
  layout.label = {
249
325
  x: textX,
@@ -256,7 +332,14 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
256
332
  textAlign: textAlign,
257
333
  verticalAlign: 'middle',
258
334
  rotation: labelRotate,
259
- inside: isLabelInside
335
+ inside: isLabelInside,
336
+ labelDistance: labelDistance,
337
+ labelAlignTo: labelAlignTo,
338
+ labelMargin: labelMargin,
339
+ bleedMargin: bleedMargin,
340
+ textRect: textRect,
341
+ text: text,
342
+ font: font
260
343
  }; // Not layout the inside label
261
344
 
262
345
  if (!isLabelInside) {
@@ -265,7 +348,7 @@ function _default(seriesModel, r, viewWidth, viewHeight, sum) {
265
348
  });
266
349
 
267
350
  if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {
268
- avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight);
351
+ avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop);
269
352
  }
270
353
  }
271
354
 
@@ -23,6 +23,8 @@ var _number = require("../../util/number");
23
23
  var parsePercent = _number.parsePercent;
24
24
  var linearMap = _number.linearMap;
25
25
 
26
+ var layout = require("../../util/layout");
27
+
26
28
  var labelLayout = require("./labelLayout");
27
29
 
28
30
  var zrUtil = require("zrender/lib/core/util");
@@ -48,10 +50,18 @@ var zrUtil = require("zrender/lib/core/util");
48
50
  var PI2 = Math.PI * 2;
49
51
  var RADIAN = Math.PI / 180;
50
52
 
53
+ function getViewRect(seriesModel, api) {
54
+ return layout.getLayoutRect(seriesModel.getBoxLayoutParams(), {
55
+ width: api.getWidth(),
56
+ height: api.getHeight()
57
+ });
58
+ }
59
+
51
60
  function _default(seriesType, ecModel, api, payload) {
52
61
  ecModel.eachSeriesByType(seriesType, function (seriesModel) {
53
62
  var data = seriesModel.getData();
54
63
  var valueDim = data.mapDimension('value');
64
+ var viewRect = getViewRect(seriesModel, api);
55
65
  var center = seriesModel.get('center');
56
66
  var radius = seriesModel.get('radius');
57
67
 
@@ -63,11 +73,11 @@ function _default(seriesType, ecModel, api, payload) {
63
73
  center = [center, center];
64
74
  }
65
75
 
66
- var width = api.getWidth();
67
- var height = api.getHeight();
76
+ var width = parsePercent(viewRect.width, api.getWidth());
77
+ var height = parsePercent(viewRect.height, api.getHeight());
68
78
  var size = Math.min(width, height);
69
- var cx = parsePercent(center[0], width);
70
- var cy = parsePercent(center[1], height);
79
+ var cx = parsePercent(center[0], width) + viewRect.x;
80
+ var cy = parsePercent(center[1], height) + viewRect.y;
71
81
  var r0 = parsePercent(radius[0], size / 2);
72
82
  var r = parsePercent(radius[1], size / 2);
73
83
  var startAngle = -seriesModel.get('startAngle') * RADIAN;
@@ -102,7 +112,8 @@ function _default(seriesType, ecModel, api, payload) {
102
112
  cx: cx,
103
113
  cy: cy,
104
114
  r0: r0,
105
- r: roseType ? NaN : r
115
+ r: roseType ? NaN : r,
116
+ viewRect: viewRect
106
117
  });
107
118
  return;
108
119
  } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样?
@@ -130,7 +141,8 @@ function _default(seriesType, ecModel, api, payload) {
130
141
  cx: cx,
131
142
  cy: cy,
132
143
  r0: r0,
133
- r: roseType ? linearMap(value, extent, [r0, r]) : r
144
+ r: roseType ? linearMap(value, extent, [r0, r]) : r,
145
+ viewRect: viewRect
134
146
  });
135
147
  currentAngle = endAngle;
136
148
  }); // Some sector is constrained by minAngle
@@ -164,7 +176,7 @@ function _default(seriesType, ecModel, api, payload) {
164
176
  }
165
177
  }
166
178
 
167
- labelLayout(seriesModel, r, width, height);
179
+ labelLayout(seriesModel, r, viewRect.width, viewRect.height, viewRect.x, viewRect.y);
168
180
  });
169
181
  }
170
182
 
@@ -28,6 +28,8 @@ var _format = require("../../util/format");
28
28
 
29
29
  var encodeHTML = _format.encodeHTML;
30
30
 
31
+ var LegendVisualProvider = require("../../visual/LegendVisualProvider");
32
+
31
33
  /*
32
34
  * Licensed to the Apache Software Foundation (ASF) under one
33
35
  * or more contributor license agreements. See the NOTICE file
@@ -54,9 +56,7 @@ var RadarSeries = SeriesModel.extend({
54
56
  RadarSeries.superApply(this, 'init', arguments); // Enable legend selection for each data item
55
57
  // Use a function instead of direct access because data reference may changed
56
58
 
57
- this.legendDataProvider = function () {
58
- return this.getRawData();
59
- };
59
+ this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));
60
60
  },
61
61
  getInitialData: function (option, ecModel) {
62
62
  return createListSimply(this, {
@@ -74,6 +74,26 @@ var RadarSeries = SeriesModel.extend({
74
74
  return encodeHTML(axis.name + ' : ' + val);
75
75
  }).join('<br />');
76
76
  },
77
+
78
+ /**
79
+ * @implement
80
+ */
81
+ getTooltipPosition: function (dataIndex) {
82
+ if (dataIndex != null) {
83
+ var data = this.getData();
84
+ var coordSys = this.coordinateSystem;
85
+ var values = data.getValues(zrUtil.map(coordSys.dimensions, function (dim) {
86
+ return data.mapDimension(dim);
87
+ }), dataIndex, true);
88
+
89
+ for (var i = 0, len = values.length; i < len; i++) {
90
+ if (!isNaN(values[i])) {
91
+ var indicatorAxes = coordSys.getIndicatorAxes();
92
+ return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i);
93
+ }
94
+ }
95
+ }
96
+ },
77
97
  defaultOption: {
78
98
  zlevel: 0,
79
99
  z: 2,
@@ -160,6 +160,18 @@ var SankeySeries = SeriesModel.extend({
160
160
  option.focusNodeAdjacency = 'allEdges';
161
161
  }
162
162
  },
163
+ // Override Series.getDataParams()
164
+ getDataParams: function (dataIndex, dataType) {
165
+ var params = SankeySeries.superCall(this, 'getDataParams', dataIndex, dataType);
166
+
167
+ if (params.value == null && dataType === 'node') {
168
+ var node = this.getGraph().getNodeByIndex(dataIndex);
169
+ var nodeValue = node.getLayout().value;
170
+ params.value = nodeValue;
171
+ }
172
+
173
+ return params;
174
+ },
163
175
  defaultOption: {
164
176
  zlevel: 0,
165
177
  z: 2,
@@ -205,7 +217,7 @@ var SankeySeries = SeriesModel.extend({
205
217
  show: true
206
218
  },
207
219
  lineStyle: {
208
- opacity: 0.6
220
+ opacity: 0.5
209
221
  }
210
222
  },
211
223
  animationEasing: 'linear',
@@ -43,7 +43,9 @@ var zrUtil = require("zrender/lib/core/util");
43
43
  * under the License.
44
44
  */
45
45
  var nodeOpacityPath = ['itemStyle', 'opacity'];
46
+ var hoverNodeOpacityPath = ['emphasis', 'itemStyle', 'opacity'];
46
47
  var lineOpacityPath = ['lineStyle', 'opacity'];
48
+ var hoverLineOpacityPath = ['emphasis', 'lineStyle', 'opacity'];
47
49
 
48
50
  function getItemOpacity(item, opacityPath) {
49
51
  return item.getVisual('opacity') || item.getModel().get(opacityPath);
@@ -69,12 +71,13 @@ function fadeOutItem(item, opacityPath, opacityRatio) {
69
71
  function fadeInItem(item, opacityPath) {
70
72
  var opacity = getItemOpacity(item, opacityPath);
71
73
  var el = item.getGraphicEl();
72
- el.highlight && el.highlight();
73
74
  el.traverse(function (child) {
74
75
  if (child.type !== 'group') {
75
76
  child.setStyle('opacity', opacity);
76
77
  }
77
- });
78
+ }); // Support emphasis here.
79
+
80
+ el.highlight && el.highlight();
78
81
  }
79
82
 
80
83
  var SankeyShape = graphic.extendShape({
@@ -104,6 +107,12 @@ var SankeyShape = graphic.extendShape({
104
107
  }
105
108
 
106
109
  ctx.closePath();
110
+ },
111
+ highlight: function () {
112
+ this.trigger('emphasis');
113
+ },
114
+ downplay: function () {
115
+ this.trigger('normal');
107
116
  }
108
117
  });
109
118
 
@@ -266,9 +275,22 @@ var _default = echarts.extendChartView({
266
275
  el.cursor = 'move';
267
276
  }
268
277
 
278
+ el.highlight = function () {
279
+ this.trigger('emphasis');
280
+ };
281
+
282
+ el.downplay = function () {
283
+ this.trigger('normal');
284
+ };
285
+
286
+ el.focusNodeAdjHandler && el.off('mouseover', el.focusNodeAdjHandler);
287
+ el.unfocusNodeAdjHandler && el.off('mouseout', el.unfocusNodeAdjHandler);
288
+
269
289
  if (itemModel.get('focusNodeAdjacency')) {
270
- el.off('mouseover').on('mouseover', function () {
290
+ el.on('mouseover', el.focusNodeAdjHandler = function () {
271
291
  if (!sankeyView._focusAdjacencyDisabled) {
292
+ sankeyView._clearTimer();
293
+
272
294
  api.dispatchAction({
273
295
  type: 'focusNodeAdjacency',
274
296
  seriesId: seriesModel.id,
@@ -276,22 +298,23 @@ var _default = echarts.extendChartView({
276
298
  });
277
299
  }
278
300
  });
279
- el.off('mouseout').on('mouseout', function () {
301
+ el.on('mouseout', el.unfocusNodeAdjHandler = function () {
280
302
  if (!sankeyView._focusAdjacencyDisabled) {
281
- api.dispatchAction({
282
- type: 'unfocusNodeAdjacency',
283
- seriesId: seriesModel.id
284
- });
303
+ sankeyView._dispatchUnfocus(api);
285
304
  }
286
305
  });
287
306
  }
288
307
  });
289
308
  edgeData.eachItemGraphicEl(function (el, dataIndex) {
290
309
  var edgeModel = edgeData.getItemModel(dataIndex);
310
+ el.focusNodeAdjHandler && el.off('mouseover', el.focusNodeAdjHandler);
311
+ el.unfocusNodeAdjHandler && el.off('mouseout', el.unfocusNodeAdjHandler);
291
312
 
292
313
  if (edgeModel.get('focusNodeAdjacency')) {
293
- el.off('mouseover').on('mouseover', function () {
314
+ el.on('mouseover', el.focusNodeAdjHandler = function () {
294
315
  if (!sankeyView._focusAdjacencyDisabled) {
316
+ sankeyView._clearTimer();
317
+
295
318
  api.dispatchAction({
296
319
  type: 'focusNodeAdjacency',
297
320
  seriesId: seriesModel.id,
@@ -299,12 +322,9 @@ var _default = echarts.extendChartView({
299
322
  });
300
323
  }
301
324
  });
302
- el.off('mouseout').on('mouseout', function () {
325
+ el.on('mouseout', el.unfocusNodeAdjHandler = function () {
303
326
  if (!sankeyView._focusAdjacencyDisabled) {
304
- api.dispatchAction({
305
- type: 'unfocusNodeAdjacency',
306
- seriesId: seriesModel.id
307
- });
327
+ sankeyView._dispatchUnfocus(api);
308
328
  }
309
329
  });
310
330
  }
@@ -318,10 +338,30 @@ var _default = echarts.extendChartView({
318
338
 
319
339
  this._data = seriesModel.getData();
320
340
  },
321
- dispose: function () {},
322
- focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
323
- var data = this._model.getData();
341
+ dispose: function () {
342
+ this._clearTimer();
343
+ },
344
+ _dispatchUnfocus: function (api) {
345
+ var self = this;
324
346
 
347
+ this._clearTimer();
348
+
349
+ this._unfocusDelayTimer = setTimeout(function () {
350
+ self._unfocusDelayTimer = null;
351
+ api.dispatchAction({
352
+ type: 'unfocusNodeAdjacency',
353
+ seriesId: self._model.id
354
+ });
355
+ }, 500);
356
+ },
357
+ _clearTimer: function () {
358
+ if (this._unfocusDelayTimer) {
359
+ clearTimeout(this._unfocusDelayTimer);
360
+ this._unfocusDelayTimer = null;
361
+ }
362
+ },
363
+ focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
364
+ var data = seriesModel.getData();
325
365
  var graph = data.graph;
326
366
  var dataIndex = payload.dataIndex;
327
367
  var itemModel = data.getItemModel(dataIndex);
@@ -341,7 +381,7 @@ var _default = echarts.extendChartView({
341
381
  });
342
382
 
343
383
  if (node) {
344
- fadeInItem(node, nodeOpacityPath);
384
+ fadeInItem(node, hoverNodeOpacityPath);
345
385
  var focusNodeAdj = itemModel.get('focusNodeAdjacency');
346
386
 
347
387
  if (focusNodeAdj === 'outEdges') {
@@ -350,8 +390,8 @@ var _default = echarts.extendChartView({
350
390
  return;
351
391
  }
352
392
 
353
- fadeInItem(edge, lineOpacityPath);
354
- fadeInItem(edge.node2, nodeOpacityPath);
393
+ fadeInItem(edge, hoverLineOpacityPath);
394
+ fadeInItem(edge.node2, hoverNodeOpacityPath);
355
395
  });
356
396
  } else if (focusNodeAdj === 'inEdges') {
357
397
  zrUtil.each(node.inEdges, function (edge) {
@@ -359,8 +399,8 @@ var _default = echarts.extendChartView({
359
399
  return;
360
400
  }
361
401
 
362
- fadeInItem(edge, lineOpacityPath);
363
- fadeInItem(edge.node1, nodeOpacityPath);
402
+ fadeInItem(edge, hoverLineOpacityPath);
403
+ fadeInItem(edge.node1, hoverNodeOpacityPath);
364
404
  });
365
405
  } else if (focusNodeAdj === 'allEdges') {
366
406
  zrUtil.each(node.edges, function (edge) {
@@ -368,22 +408,21 @@ var _default = echarts.extendChartView({
368
408
  return;
369
409
  }
370
410
 
371
- fadeInItem(edge, lineOpacityPath);
372
- fadeInItem(edge.node1, nodeOpacityPath);
373
- fadeInItem(edge.node2, nodeOpacityPath);
411
+ fadeInItem(edge, hoverLineOpacityPath);
412
+ edge.node1 !== node && fadeInItem(edge.node1, hoverNodeOpacityPath);
413
+ edge.node2 !== node && fadeInItem(edge.node2, hoverNodeOpacityPath);
374
414
  });
375
415
  }
376
416
  }
377
417
 
378
418
  if (edge) {
379
- fadeInItem(edge, lineOpacityPath);
380
- fadeInItem(edge.node1, nodeOpacityPath);
381
- fadeInItem(edge.node2, nodeOpacityPath);
419
+ fadeInItem(edge, hoverLineOpacityPath);
420
+ fadeInItem(edge.node1, hoverNodeOpacityPath);
421
+ fadeInItem(edge.node2, hoverNodeOpacityPath);
382
422
  }
383
423
  },
384
424
  unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
385
- var graph = this._model.getGraph();
386
-
425
+ var graph = seriesModel.getGraph();
387
426
  graph.eachNode(function (node) {
388
427
  fadeOutItem(node, nodeOpacityPath);
389
428
  });
@@ -405,8 +444,7 @@ function createGridClipShape(rect, seriesModel, cb) {
405
444
  });
406
445
  graphic.initProps(rectEl, {
407
446
  shape: {
408
- width: rect.width + 20,
409
- height: rect.height + 20
447
+ width: rect.width + 20
410
448
  }
411
449
  }, seriesModel, cb);
412
450
  return rectEl;
@@ -97,7 +97,8 @@ function computeNodeValues(nodes) {
97
97
  zrUtil.each(nodes, function (node) {
98
98
  var value1 = sum(node.outEdges, getEdgeValue);
99
99
  var value2 = sum(node.inEdges, getEdgeValue);
100
- var value = Math.max(value1, value2);
100
+ var nodeRawValue = node.getValue() || 0;
101
+ var value = Math.max(value1, value2, nodeRawValue);
101
102
  node.setLayout({
102
103
  value: value
103
104
  }, true);
@@ -456,6 +457,11 @@ function relaxRightToLeft(nodesByBreadth, alpha, orient) {
456
457
  if (node.outEdges.length) {
457
458
  var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue, orient);
458
459
 
460
+ if (isNaN(y)) {
461
+ var len = node.outEdges.length;
462
+ y = len ? sum(node.outEdges, centerTarget, orient) / len : 0;
463
+ }
464
+
459
465
  if (orient === 'vertical') {
460
466
  var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
461
467
  node.setLayout({
@@ -476,10 +482,18 @@ function weightedTarget(edge, orient) {
476
482
  return center(edge.node2, orient) * edge.getValue();
477
483
  }
478
484
 
485
+ function centerTarget(edge, orient) {
486
+ return center(edge.node2, orient);
487
+ }
488
+
479
489
  function weightedSource(edge, orient) {
480
490
  return center(edge.node1, orient) * edge.getValue();
481
491
  }
482
492
 
493
+ function centerSource(edge, orient) {
494
+ return center(edge.node1, orient);
495
+ }
496
+
483
497
  function center(node, orient) {
484
498
  return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2;
485
499
  }
@@ -488,13 +502,13 @@ function getEdgeValue(edge) {
488
502
  return edge.getValue();
489
503
  }
490
504
 
491
- function sum(array, f, orient) {
505
+ function sum(array, cb, orient) {
492
506
  var sum = 0;
493
507
  var len = array.length;
494
508
  var i = -1;
495
509
 
496
510
  while (++i < len) {
497
- var value = +f.call(array, array[i], orient);
511
+ var value = +cb.call(array, array[i], orient);
498
512
 
499
513
  if (!isNaN(value)) {
500
514
  sum += value;
@@ -518,6 +532,11 @@ function relaxLeftToRight(nodesByBreadth, alpha, orient) {
518
532
  if (node.inEdges.length) {
519
533
  var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue, orient);
520
534
 
535
+ if (isNaN(y)) {
536
+ var len = node.inEdges.length;
537
+ y = len ? sum(node.inEdges, centerSource, orient) / len : 0;
538
+ }
539
+
521
540
  if (orient === 'vertical') {
522
541
  var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
523
542
  node.setLayout({
@@ -44,7 +44,9 @@ var _default = SeriesModel.extend({
44
44
  type: 'series.scatter',
45
45
  dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
46
46
  getInitialData: function (option, ecModel) {
47
- return createListFromArray(this.getSource(), this);
47
+ return createListFromArray(this.getSource(), this, {
48
+ useEncodeDefaulter: true
49
+ });
48
50
  },
49
51
  brushSelector: 'point',
50
52
  getProgressive: function () {