• echarts 旭日图 自定义图例的实现


    echarts官网中的旭日图示例中,我们发现没有做好的图例,所以我们可以自定义图例

    实现的效果如下:

    具体实现效果是通过visualMap来实现的,废话不多说,直接上代码:

    1. setPersistentChart = function() {
    2. const data=[
    3. {
    4. "name": "内审未发现",
    5. "values": "1",
    6. "draftNumbers": 4
    7. },
    8. {
    9. "name": "内审已发现",
    10. "values": "0.9",
    11. "draftNumbers": 5,
    12. "children": [
    13. {
    14. "name": "内审已发现但未督促整改",
    15. "values": "0.90",
    16. "draftNumbers": 2
    17. },
    18. {
    19. "name": "内审已督促整改",
    20. "values": "0.8",
    21. "draftNumbers": 1,
    22. "children": [
    23. {
    24. "name": "内审已持续跟踪",
    25. "values": "0.7",
    26. "draftNumbers": 1
    27. },
    28. {
    29. "name": "内审已督促整改但未持续跟踪",
    30. "values": "0.80",
    31. "draftNumbers": 0
    32. }
    33. ]
    34. }
    35. ]
    36. }
    37. ]
    38. // 获取 chart 元素
    39. const chartDom = self.$refs.persistentChart;
    40. // 初始化 echarts
    41. const myChart = echarts.init(chartDom);
    42. const colors =['rgb(34,177,76)','rgb(255,242,0)','rgb(112,146,190)','rgb(255,127,39)','rgb(0,162,232)','rgb(221,45,75)'];
    43. let colorIndex = 0;
    44. const convertData = function(data) {
    45. return data.map(item => ({
    46. name: item.name,
    47. value: item.draftNumbers,
    48. children: item.children ? convertData(item.children) : null,
    49. values: item.values,
    50. itemStyle: {
    51. color: colors[colorIndex++%colors.length] // 你可以在这里设置颜色,可以是数组或函数等
    52. }
    53. }));
    54. };
    55. const convertedData = convertData(detail);
    56. const getAllNodeInfo = function(data) {
    57. let nodes = [];
    58. // 遍历当前节点的信息,并添加到数组中,如果你的图例需要排除图上不存在的,则可以添加一个判断条件 让循环里面item.value >0 就可以了
    59. data.forEach(item => {
    60. nodes.push({
    61. name: item.name,
    62. color: item.itemStyle.color, // 获取颜色信息
    63. });
    64. // 如果当前节点有孩子节点,则递归调用该函数
    65. if (item.children) {
    66. nodes = nodes.concat(getAllNodeInfo(item.children));
    67. }
    68. });
    69. return nodes;
    70. };
    71. const categoryArray = getAllNodeInfo(convertedData);
    72. const categoryMap = {};
    73. categoryArray.forEach(item => {
    74. categoryMap[item.name] = item.color;
    75. });
    76. const option = {
    77. title: {
    78. text: '旭日图',
    79. left: 'center',
    80. textStyle: {
    81. color: '#1a1b4e',
    82. fontStyle: 'normal',
    83. fontSize: 24
    84. },
    85. },
    86. visualMap: {
    87. left: 'right',
    88. top: 'center',
    89. dimension: 2,
    90. seriesIndex: 2,
    91. padding: 5,
    92. textGap: 4,
    93. selectedMode: false,//禁止了点击,因为现在的图列与图是无法联动的
    94. color: Object.values(categoryMap).reverse(),
    95. categories: Object.keys(categoryMap),// 设置图例的名称
    96. },
    97. series: [{
    98. type: 'sunburst',
    99. roam: false,
    100. nodeClick: true,//禁用了数据下钻的效果,如果需要数据下钻请删除roam和nodeClick
    101. itemStyle: {
    102. normal: {
    103. label: {
    104. show: true,
    105. formatter: "{b}"
    106. },
    107. },
    108. },
    109. label: {
    110. normal: {
    111. show: true,
    112. formatter: function(params) {
    113. return params.value + '条(' + (params.value / detail.reduce((acc, cur) => acc + cur.draftNumbers, 0) * 100).toFixed(2) +'%)';
    114. },
    115. fontSize: 8,
    116. position: 'insideRight', // 调整为 inside 或 insideRight
    117. }
    118. },
    119. data: convertedData,
    120. radius: [0, '75%'],
    121. sort: null,
    122. }]
    123. };
    124. myChart.setOption(option);
    125. };

    主要的问题就在于如何图例如何与图的颜色,名称相对应:我这里定义了一个颜色数组,然后给每一个类型都赋值不同的颜色,后面通过getAllNodeInfo()方法去获取了所有节点的一个名称和颜色;最后通过color和categories将名称和颜色一一对应起来,为什么要用到reverse()是因为拿到的图例颜色数组,由于和name属性是反着的,所以一定要将数组reverse一下。这样就可以实现我们上面的效果啦!

  • 相关阅读:
    设计模式---建造者模式
    【单片机】数码管的使用
    GmNAC181促进结瘤并提高根瘤的耐盐性
    一种便携式GNSS仿真策略
    零代码与低代码快速开发平台的区别
    实现zotero星标功能且可以排序
    lv11 嵌入式开发 ARM体系结构理论基础2
    VUE前端实现“模糊搜索“(纯前端)
    基于STM32自动售货机控制系统设计
    Android.mk和Android.bp
  • 原文地址:https://blog.csdn.net/qq_52110315/article/details/136349768