You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by su...@apache.org on 2018/12/29 21:02:22 UTC

[incubator-echarts] branch master updated: Fix #9657 (label is not always at center when pie label position 'center')

This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/master by this push:
     new 73af4bf  Fix #9657 (label is not always at center when pie label position 'center')
73af4bf is described below

commit 73af4bf764d284de9c2b5d1eb53df6d2cf1da10c
Author: sushuang <su...@gmail.com>
AuthorDate: Sun Dec 30 05:00:47 2018 +0800

    Fix #9657 (label is not always at center when pie label position 'center')
---
 src/chart/pie/labelLayout.js |  33 ++++++----
 test/pie-label.html          | 148 +++++++++++++++++++++++++++++++++++++++++++
 test/tmp-base.html           |   4 +-
 3 files changed, 168 insertions(+), 17 deletions(-)

diff --git a/src/chart/pie/labelLayout.js b/src/chart/pie/labelLayout.js
index e0b69b8..3244673 100644
--- a/src/chart/pie/labelLayout.js
+++ b/src/chart/pie/labelLayout.js
@@ -26,7 +26,6 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
         return a.y - b.y;
     });
 
-    // 压
     function shiftDown(start, end, delta, dir) {
         for (var j = start; j < end; j++) {
             list[j].y += delta;
@@ -42,7 +41,6 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
         shiftUp(end - 1, delta / 2);
     }
 
-    // 弹
     function shiftUp(end, delta) {
         for (var j = end; j >= 0; j--) {
             list[j].y -= delta;
@@ -56,18 +54,14 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
 
     function changeX(list, isDownList, cx, cy, r, dir) {
         var lastDeltaX = dir > 0
-            ? isDownList                // 右侧
-                ? Number.MAX_VALUE      // 下
-                : 0                     // 上
-            : isDownList                // 左侧
-                ? Number.MAX_VALUE      // 下
-                : 0;                    // 上
+            ? isDownList                // right-side
+                ? Number.MAX_VALUE      // down
+                : 0                     // up
+            : isDownList                // left-side
+                ? Number.MAX_VALUE      // down
+                : 0;                    // up
 
         for (var i = 0, l = list.length; i < l; i++) {
-            // Not change x for center label
-            if (list[i].position === 'center') {
-                continue;
-            }
             var deltaY = Math.abs(list[i].y - cy);
             var length = list[i].len;
             var length2 = list[i].len2;
@@ -78,11 +72,11 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
                     )
                 : Math.abs(list[i].x - cx);
             if (isDownList && deltaX >= lastDeltaX) {
-                // 右下,左下
+                // right-down, left-down
                 deltaX = lastDeltaX - 10;
             }
             if (!isDownList && deltaX <= lastDeltaX) {
-                // 右上,左上
+                // right-up, left-up
                 deltaX = lastDeltaX + 10;
             }
 
@@ -122,6 +116,9 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
     var leftList = [];
     var rightList = [];
     for (var i = 0; i < labelLayoutList.length; i++) {
+        if (isPositionCenter(labelLayoutList[i])) {
+            continue;
+        }
         if (labelLayoutList[i].x < cx) {
             leftList.push(labelLayoutList[i]);
         }
@@ -134,6 +131,9 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
     adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);
 
     for (var i = 0; i < labelLayoutList.length; i++) {
+        if (isPositionCenter(labelLayoutList[i])) {
+            continue;
+        }
         var linePoints = labelLayoutList[i].linePoints;
         if (linePoints) {
             var dist = linePoints[1][0] - linePoints[2][0];
@@ -149,6 +149,11 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
     }
 }
 
+function isPositionCenter(layout) {
+    // Not change x for center label
+    return layout.position === 'center';
+}
+
 export default function (seriesModel, r, viewWidth, viewHeight) {
     var data = seriesModel.getData();
     var labelLayoutList = [];
diff --git a/test/pie-label.html b/test/pie-label.html
new file mode 100644
index 0000000..332b53e
--- /dev/null
+++ b/test/pie-label.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+
+<html>
+    <head>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        <script src="lib/esl.js"></script>
+        <script src="lib/config.js"></script>
+        <script src="lib/jquery.min.js"></script>
+        <script src="lib/facePrint.js"></script>
+        <script src="lib/testHelper.js"></script>
+        <link rel="stylesheet" href="lib/reset.css" />
+    </head>
+    <body>
+        <style>
+            .test-title {
+                background: #146402;
+                color: #fff;
+            }
+        </style>
+
+
+        <div id="main0"></div>
+        <div id="main1"></div>
+
+
+        <script>
+
+            require([
+                'echarts'/*, 'map/js/china' */
+            ], function (echarts) {
+
+                var value2 = 400;
+                var total = 1000;
+
+                function getData() {
+                    return [{
+                        name: '',
+                        value: total - value2,
+                        itemStyle: { color: 'rgb(8,90,150)' },
+                        label: { show: false }
+                    }, {
+                        name: '50%',
+                        value: value2,
+                        itemStyle: { color: 'rgb(23,235,255)'},
+                        label: { position: 'center', color: '#999', fontSize: '100' }
+                    }]
+                }
+
+                var option = {
+                    animation: false,
+                    series: [{
+                        type: 'pie',
+                        radius: ['60%','80%'],
+                        labelLine: { show: false },
+                        hoverAnimation: false,
+                        data: getData()
+                    }]
+                };
+
+                var chart = testHelper.create(echarts, 'main0', {
+                    title: 'Label should be always at center of the pie',
+                    option: option,
+                    info: {
+                        data: [{
+                            label: {position: 'center'}
+                        }]
+                    }
+                });
+
+                setInterval(function () {
+                    value2 += 3;
+                    if (value2 > total) {
+                        value2 = 0;
+                    }
+                    chart.setOption({
+                        series: [{
+                            data: getData()
+                        }]
+                    });
+                }, 20);
+            });
+
+        </script>
+
+
+
+        <script>
+
+            require([
+                'echarts'/*, 'map/js/china' */
+            ], function (echarts) {
+
+                var count = 60;
+                var data = [];
+                for (var i = 0; i < count; i++) {
+                    var label = i === 30
+                        ? {
+                            position: 'center',
+                            fontSize: 30,
+                            color: '#fff'
+                        }
+                        : null;
+                    data.push({
+                        name: i + 'A',
+                        value: Math.random(),
+                        label: label
+                    });
+                }
+
+                var option = {
+                    series: [{
+                        type: 'pie',
+                        radius: '50%',
+                        data: data
+                    }]
+                };
+
+                var chart = testHelper.create(echarts, 'main1', {
+                    title: 'Too many',
+                    option: option
+                });
+            });
+
+        </script>
+
+
+    </body>
+</html>
\ No newline at end of file
diff --git a/test/tmp-base.html b/test/tmp-base.html
index 3f3693c..fb3a3ba 100644
--- a/test/tmp-base.html
+++ b/test/tmp-base.html
@@ -44,8 +44,6 @@ under the License.
 
         <script>
 
-            var chart;
-            var myChart;
             var option;
 
             require([
@@ -55,7 +53,7 @@ under the License.
                 // $.getJSON('./data/nutrients.json', function (data) {
                 // });
 
-                chart = myChart = testHelper.create(echarts, 'main0', {
+                var chart = testHelper.create(echarts, 'main0', {
                     option: option
                 });
             });


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org