This is an automated email from the ASF dual-hosted git repository. ovilia pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/echarts.git
The following commit(s) were added to refs/heads/master by this push: new 8734ed145 fix(sunburst): fix align error caused by float precision new 5b448f6de Merge pull request #18962 from linghaoSu/fix/sunburst-label-align 8734ed145 is described below commit 8734ed14521f73cacd6cc28bf0b0b3eb3663cb6b Author: linghao.su <slh...@live.cn> AuthorDate: Sat Aug 5 15:23:38 2023 +0800 fix(sunburst): fix align error caused by float precision --- src/chart/sunburst/SunburstPiece.ts | 5 +- test/sunburst-label-align.html | 1163 +++++++++++++++++++++++++++++++++++ 2 files changed, 1166 insertions(+), 2 deletions(-) diff --git a/src/chart/sunburst/SunburstPiece.ts b/src/chart/sunburst/SunburstPiece.ts index b0d662796..35d1d1ac0 100644 --- a/src/chart/sunburst/SunburstPiece.ts +++ b/src/chart/sunburst/SunburstPiece.ts @@ -33,6 +33,7 @@ import {createOrUpdatePatternFromDecal} from '../../util/decal'; import ExtensionAPI from '../../core/ExtensionAPI'; import { saveOldStyle } from '../../animation/basicTransition'; import { normalizeRadian } from 'zrender/src/contain/util'; +import { isRadianAroundZero } from '../../util/number'; const DEFAULT_SECTOR_Z = 2; const DEFAULT_TEXT_Z = 4; @@ -231,13 +232,13 @@ class SunburstPiece extends graphic.Sector { } else if (textAlign === 'left') { r = layout.r0 + labelPadding; - if (midAngle > Math.PI / 2) { + if (midAngle > Math.PI / 2 && !isRadianAroundZero(midAngle - Math.PI / 2)) { textAlign = 'right'; } } else if (textAlign === 'right') { r = layout.r - labelPadding; - if (midAngle > Math.PI / 2) { + if (midAngle > Math.PI / 2 && !isRadianAroundZero(midAngle - Math.PI / 2)) { textAlign = 'left'; } } diff --git a/test/sunburst-label-align.html b/test/sunburst-label-align.html new file mode 100644 index 000000000..0bb6e3a63 --- /dev/null +++ b/test/sunburst-label-align.html @@ -0,0 +1,1163 @@ +<!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/simpleRequire.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> + <script src="lib/dat.gui.min.js"></script> + <!-- <script src="ut/lib/canteen.js"></script> --> + <link rel="stylesheet" href="lib/reset.css" /> +</head> + +<body> + <style> + </style> + + + <div id="main0"></div> + <div id="main1"></div> + + + + + + + <script> + require([ + 'echarts', + // 'map/js/china', + // './data/nutrients.json' + ], function (echarts) { + var option; + + var data = [{ + name: 'sum', + children: [{ + name: 'text1', + value: 10, + itemStyle: { + color: 'blue' + }, + children: [{ + name: 'other', + value: 10, + itemStyle: { + color: 'red' + } + }] + }, + { + name: 'abc', + value: 270, + itemStyle: { + color: 'blue' + }, + children: [{ + name: 'next', + value: 270, + itemStyle: { + color: 'red', + }, + + }] + }, + + { + name: 'text2', + value: 10, + itemStyle: { + color: 'green' + }, + children: [{ + name: 'three', + value: 10, + itemStyle: { + color: 'orange' + } + }] + }] + }]; + + option = { + series: { + radius: ['0%', '80%'], + type: 'sunburst', + sort: null, + highlightPolicy: 'ancestor', + nodeClick: 'false', + data: data, + levels: [ + {}, + { + label: { align: 'center', rotate: 0 } + }, + { + label: { align: 'right' } + }, + { + label: { align: 'left' } + } + ] + } + }; + + var chart = testHelper.create(echarts, 'main0', { + title: [ + 'Put label in the center if it\'s a circle' + ], + option: option + // height: 300, + // buttons: [{text: 'btn-txt', onclick: function () {}}], + // recordCanvas: true, + }); + }); + </script> + + + <script> + require([ + 'echarts', + // 'map/js/china', + // './data/nutrients.json' + ], function (echarts) { + var option; + + var data = [ + { + "name": "脆弱性", + "itemStyle": { + "color": "#da0d68" + }, + "children": [ + { + "name": "图像分类对抗攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "FGSM", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "PGD", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "AdamPGD", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DeepFool", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FMNA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "PointwiseAttack", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "NewtonFool", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DDNA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "EADA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LSBUNA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "GBA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "CW", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "HSJA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SPNA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "GENA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Boundary", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Square attack", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Shadow attack", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "ColorFool", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Targeted UAP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Wasserstein", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SSAH", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FSA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "图像分类自然变换", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "resize", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "mosaic", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "poisson_noise", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "表格分类对抗攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "FGM", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DFT", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "图像分类预处理防御", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "SpatialSmoothing", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FeatureSqueezing", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Cutout", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "TotalVarMin", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "JpegCompression", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "GaussianAugmentation", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LabelSmoothing", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Mixup", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Resample", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Trapdoor Model", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Fortified Networks", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "ME-Net", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "WSNNS", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "MultiMagnet", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Februus", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "NEO", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "ConFoc", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "IBAU", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Mode Connectivity", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "NAD", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Fine-pruning", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "图像分类对抗检测", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "CutMixDetect", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "NSS", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LID", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "NIC", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DNR", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SF", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "图像分类后门攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "BadNets", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DFST", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "AWP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FTrojan", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DeepPayLoad", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "BppAttack", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "图像分类中毒检测", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "NC", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "STRIP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "语音识别对抗攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "MOO", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "UAP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "WSP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SSA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + } + ] + }, + { + "name": "可解释性", + "itemStyle": { + "color": "#da0d68" + }, + "children": [ + { + "name": "白盒局部可解释", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "GradCAM", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Guided Grad-CAM", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "IG", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LRP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DeepLIFT", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SmoothGrad", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Grad-cam++", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Smooth Grad-CAM++", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Axiom-based grad-cam", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "黑盒局部可解释", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "LIME", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "counterfactual", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Saliency Maps", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "RISE", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Score-cam", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Ablation-cam", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Seq2Seq-Vis", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LORE", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "黑盒全局可解释", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "t-sne", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Shaply值", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "Influence Functions", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "白盒全局可解释", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "DGN-AM", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + } + ] + }, + { + "name": "隐私性", + "itemStyle": { + "color": "#da0d68" + }, + "children": [ + { + "name": "黑盒成员推理攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "MIA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "MIA", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "白盒成员推理防御", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "RelaxLoss", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "黑盒模型窃取攻击", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "Knockoff", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "白盒模型窃取防御", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "Prediction Poisoning", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "黑盒成员推理攻击防御", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "MemGuard", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + } + ] + }, + { + "name": "公平性", + "itemStyle": { + "color": "#da0d68" + }, + "children": [ + { + "name": "黑盒评估", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "FD", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "SPB", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "ACC", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FPR", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "LLE", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "黑盒去偏", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "CGL", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FSCL", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "DebiAN", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "白盒评估", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "UBD", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + }, + { + "name": "白盒去偏", + "itemStyle": { + "color": "#e0719c" + }, + "children": [ + { + "name": "AAS", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + }, + { + "name": "FAAP", + "value": 1, + "itemStyle": { + "color": "#f99e1c" + } + } + ] + } + ] + } + ]; + option = { + title: { + text: 'WORLD COFFEE RESEARCH SENSORY LEXICON', + subtext: 'Source: https://worldcoffeeresearch.org/work/sensory-lexicon/', + textStyle: { + fontSize: 14, + align: 'center' + }, + subtextStyle: { + align: 'center' + }, + sublink: 'https://worldcoffeeresearch.org/work/sensory-lexicon/' + }, + series: { + type: 'sunburst', + data: data, + radius: [0, '95%'], + sort: undefined, + emphasis: { + focus: 'ancestor' + }, + levels: [ + {}, + { + r0: '15%', + r: '35%', + itemStyle: { + borderWidth: 2 + }, + label: { + rotate: 'tangential' + } + }, + { + r0: '35%', + r: '70%', + label: { + align: 'left' + } + }, + { + r0: '70%', + r: '72%', + label: { + position: 'outside', + padding: 3, + silent: false + }, + itemStyle: { + borderWidth: 3 + } + } + ] + } + }; + + var chart = testHelper.create(echarts, 'main1', { + title: [ + 'Put label in the center if it\'s a circle' + ], + option: option + // height: 300, + // buttons: [{text: 'btn-txt', onclick: function () {}}], + // recordCanvas: true, + }); + }); + </script> +</body> + +</html> \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org For additional commands, e-mail: commits-h...@echarts.apache.org