【问题标题】:Fusion chart multilevelpie text truncate/overlap issueFusion chart multilevelpie 文本截断/重叠问题
【发布时间】:2016-12-02 07:33:15
【问题描述】:

我使用了“多级饼图”图表。 由于图表中的数据较少(比如 10 或 1),标签名称正在与另一个名称合并。

我已附上消息的截图,请考虑并给我一个解决方案

请检查 JsFiddle 重新生成的问题.. & 我也附上了图片,奇怪的错误

Js Fiddle example

FusionCharts.ready(function () {
var topProductsChart = new FusionCharts({
    type: 'multilevelpie',
    renderAt: 'chart-container',
    id : "myChart",
    width: '500',
    height: '500',
    dataFormat: 'json',
    dataSource: {
        "chart": {
            "caption": "Split of Top Products Sold",
            "subCaption": "Last Quarter",
            "captionFontSize": "14",
            "subcaptionFontSize": "14",
            "baseFontColor" : "#333333",
            "baseFont" : "Helvetica Neue,Arial",   
            "basefontsize": "9",
            "subcaptionFontBold": "0",
            "bgColor" : "#ffffff",
            "canvasBgColor" : "#ffffff",
            "showBorder" : "0",
            "showShadow" : "0",
            "showCanvasBorder": "0",
            "pieFillAlpha": "60",
            "pieBorderThickness": "2",
            "hoverFillColor": "#cccccc",
            "pieBorderColor": "#ffffff",
            "useHoverColor": "1",
            "showValuesInTooltip": "1",
            "showPercentInTooltip": "0",
            "numberPrefix": "$",
            "plotTooltext": "$label, $$valueK, $percentValue"
        },
        "category": [
            {
                "label": "Sales by category",
                "color": "#ffffff",
                "value": "150",
                "category": [
                    {
                        "label": "Food & {br}Beverages",
                        "color": "#f8bd19",
                        "value": "55.5",
                        "category": [
                            {
                                "label": "Breads",
                                "color": "#f8bd19",
                                "value": "11.1"
                            },
                            {
                                "label": "Juice",
                                "color": "#f8bd19",
                                "value": "27.75"
                            },
                            {
                                "label": "Noodles",
                                "color": "#f8bd19",
                                "value": "19.99"
                            },
                            {
                                "label": "Seafood",
                                "color": "#f8bd19",
                                "value": "0"
                            }
                        ]
                    },
                    {
                        "label": "Apparel &{br}Accessories",
                        "color": "#e44a00",
                        "value": "42",
                        "category": [
                            {
                                "label": "Sun Glasses",
                                "color": "#e44a00",
                                "value": "62.08"
                            },
                            {
                                "label": "Clothing",
                                "color": "#e44a00",
                                "value": "18.9"
                            },
                            {
                                "label": "Handbags",
                                "color": "#e44a00",
                                "value": "6.3"
                            },
                            {
                                "label": "Shoes",
                                "color": "#e44a00",
                                "value": "6.72"
                            }
                        ]
                    },
                    {
                        "label": "Baby {br}Products",
                        "color": "#008ee4",
                        "value": "22.5",
                        "category": [
                            {
                                "label": "Bath &{br}Grooming",
                                "color": "#008ee4",
                                "value": "9.45"
                            },
                            {
                                "label": "Feeding",
                                "color": "#008ee4",
                                "value": "16.3"
                            },
                            {
                                "label": "Diapers",
                                "color": "#008ee4",
                                "value": "76.75"
                            }
                        ]
                    },
                    {
                        "label": "Electronics",
                        "color": "#33bdda",
                        "value": "30",
                        "category": [
                            {
                                "label": "Laptops",
                                "color": "#33bdda",
                                "value": "8.1"
                            },
                            {
                                "label": "Televisions",
                                "color": "#33bdda",
                                "value": "10.5"
                            },
                            {
                                "label": "SmartPhones",
                                "color": "#33bdda",
                                "value": "11.4"
                            }
                        ]
                    }
                ]
            }
        ]
    }
});

    topProductsChart.render();
});

【问题讨论】:

    标签: javascript fusioncharts


    【解决方案1】:

    让我们指出我们在这里的担忧:

    • 问题1:如果dataValue为0,图表中应该没有标签。
    • 解决方案: 可能有一种哲学,即如何获取零数据和缺失数据的上下文。假设我有一个值为 0 的类别,并将其从图表中删除,如何设置完全有数据的上下文。无论如何,为了这个要求,我们可能会想到一个dataRefiner(),它只是细化了 dataSource 中的零和空数据。 :)

    • 问题 2: 文本重叠。
    • 解决方案: 目前FusionCharts似乎不支持ML饼图中文本的重叠管理。 :'(但我绝对可以解决我想到的变通办法。让我们动手吧!!!
    • Soultion 1:{br} 标签附加到标签上,以便它打破线条并适应弧线。在非常薄的切片中没有多大用处。
    • 解决方案 2: 将数据标签 font-size 减少到它可以容纳的程度。 Docs 可能有用。
    • 解决方案 3: 访问内部图形标签并旋转它。注意:访问内部图形元素没有 FusionCharts 的官方支持。

    创建一个解决方法来适应上面提到的一些修复。此代码与 FC 3.11.0 兼容。扩展支持:

    现在甚至在MultiLevel Pie charts。在 FusionCharts 原生支持之前,这是一个临时的、近似的解决方法。

    运行以下 sn-p 或使用fiddle

    /*
     Recursively removes the data containing falsy values.
     @param data {Object} - The original data.
     @return {Object} - The refined data.
    */
    function dataRefiner(data) {
      var i,
        category = data.category,
        len = category && category.length;
      for (i = 0; i < len; i += 1) {
        elem = category[i];
        if (elem.category) {
          dataRefiner(elem);
        } else if (!Number(elem.value)) {
          category.splice(i, 1);
          i -= 1;
          len -= 1;
        }
      }
      return data;
    }
    var overlapManager = (function() {
      return function(chartRef, dataSet) {
        var jsonData = chartRef.getJSONData(),
          chartAttrs = jsonData.chart;
        if (Number(chartAttrs.enablesmartlabels) === 0 || Number(chartAttrs.managelabeloverflow) === 0) {
          return;
        }
        /*
         * Returns the point to point distance for two points.
         * @return {Number}
         */
        function dist_point(point1, point2) {
          var math = Math;
          return math.sqrt((math.pow((point1.x - point2.x), 2)) + (math.pow((point1.y - point2.y), 2)))
        }
    
        /*
         * given a radius, center, and two ends of a chord.
         * return: {
            inner: Coordinate of the dipped point on the inner circle.
            outer: coordinate of the dipped point on the outer circle. 
         }
        */
        function give_dips(center_circle, angle, innerRadius, outerRadius) {
          var math = Math,
            res = {
              inner: {},
              outer: {}
            },
            getExtreme = function(radius) {
              return {
                x: center_circle.x + (radius * math.cos(angle)),
                y: center_circle.y - (radius * math.sin(angle))
              }
            };
    
          if (center_circle) {
            res.inner = getExtreme(innerRadius);
            res.outer = getExtreme(outerRadius);
          }
          return res;
        }
    
        /*
         * Manages the overlapping of the texts in ML pie chart.
         * @params: elem - {Object} - Internal store for the graphic and configurations.
         * @params: chartRef - {Object} - The reference for the chart.
         */
        function wrapText(elem, chartRef) {
          var conf = elem && elem.config || {},
            smartLabel = chartRef.jsVars.instanceAPI.linkedItems.smartLabel,
            jsonData = chartRef.getJSONData(),
            chart = jsonData.chart,
            useEllipsesWhenOverflow = chart && !!Number(chart.useellipseswhenoverflow),
            math = Math,
            graphics = elem && elem.graphics,
            ringpath = graphics.element && graphics.element.attr('ringpath') || [],
            center_circle = {
              x: ringpath[0],
              y: ringpath[1]
            },
            innerRadius = ringpath[3],
            outerRadius = ringpath[2],
            strechAngle = conf.angleStrech,
            angle = (2 * math.PI) - conf.startAngle - (strechAngle / 2),
            dipPoints = give_dips(center_circle, angle, innerRadius, outerRadius),
            center = {
              x: (dipPoints.inner.x + dipPoints.outer.x) / 2,
              y: (dipPoints.inner.y + dipPoints.outer.y) / 2
            },
            textObj,
            radius = math.min(dist_point(center, center_circle) * math.sin(strechAngle / 2) - (conf.borderWidth || 0),
              dist_point(center, dipPoints.inner)),
            offset = radius * math.cos(math.PI / 4),
            side = math.sqrt(2) * radius;
          smartLabel.useEllipsesOnOverflow(useEllipsesWhenOverflow);
          textObj = smartLabel.getSmartText(conf.displayValue, side, side);
          if (graphics.label && graphics.label.getBBox().width > side) {
            (innerRadius !== 0) && graphics.label
              .attr({
                text: textObj.text,
              });
          }
        }
    
        if (!dataSet) {
          dataSet = chartRef.jsVars.instanceAPI.components.dataset[0];
        }
        var data = dataSet.components.data || [],
          len = data.length,
          i;
    
        for (i = 0; i < len; i += 1) {
          // recursively traverse the graphical objects.
          overlapManager(chartRef, data[i]);
        }
        wrapText(dataSet, chartRef);
      }
    })();
    FusionCharts.ready(function() {
      topProductsChart = new FusionCharts({
        type: 'multilevelpie',
        renderAt: 'chart-container',
        id: "myChart",
        width: '500',
        height: '500',
        dataFormat: 'json',
        dataSource: dataRefiner(data),
        events: {
          "rendered": function(e, a) {
            if (FusionCharts.version.join('.') !== '3.11.0') {
              // It access the internal architechural properties of fusioncharts which might change in future release.
              console.log('overlapManager() is a work around supported for FusionCharts 3.11.0 and might not work in this version.');
            }
            overlapManager(e.sender);
          }
        }
      });
    
      topProductsChart.render();
    });
    
    var topProductsChart,
      data = {
        "chart": {
          "useEllipsesWhenOverflow": "1",
          "caption": "Split of Top Products Sold",
          "subCaption": "Last Quarter",
          "captionFontSize": "14",
          "subcaptionFontSize": "14",
          "baseFontColor": "#333333",
          "baseFont": "Helvetica Neue,Arial",
          "basefontsize": "9",
          "subcaptionFontBold": "0",
          "bgColor": "#ffffff",
          "canvasBgColor": "#ffffff",
          "showBorder": "0",
          "showShadow": "0",
          "showCanvasBorder": "0",
          "pieFillAlpha": "60",
          "pieBorderThickness": "2",
          "hoverFillColor": "#cccccc",
          "pieBorderColor": "#ffffff",
          "useHoverColor": "1",
          "showValuesInTooltip": "1",
          "showPercentInTooltip": "0",
          "numberPrefix": "$",
          "plotTooltext": "$label, $$valueK, $percentValue"
        },
        "category": [{
          "label": "Sales by category",
          "color": "#ffffff",
          "value": "150",
          "category": [{
            "label": "Food & {br}Beverages",
            "color": "#f8bd19",
            "value": "55.5",
            "category": [{
              "label": "Breads",
              "color": "#f8bd19",
              "value": "11.1"
            }, {
              "label": "Juice",
              "color": "#f8bd19",
              "value": "27.75"
            }, {
              "label": "Noodles",
              "color": "#f8bd19",
              "value": "19.99"
            }, {
              "label": "Seafood",
              "color": "#f8bd19",
              "value": "0"
            }]
          }, {
            "label": "Apparel &{br}Accessories",
            "color": "#e44a00",
            "value": "42",
            "category": [{
              "label": "Sun Glasses",
              "color": "#e44a00",
              "value": "62.08"
            }, {
              "label": "Clothing",
              "color": "#e44a00",
              "value": "18.9"
            }, {
              "label": "Han",
              "color": "#e44a00",
              "value": "6.3"
            }, {
              "label": "Shoes",
              "color": "#e44a00",
              "value": "6.72"
            }]
          }, {
            "label": "Baby {br}Products",
            "color": "#008ee4",
            "value": "22.5",
            "category": [{
              "label": "Bath & Grooming",
              "color": "#008ee4",
              "value": "9.45"
            }, {
              "label": "Feeding",
              "color": "#008ee4",
              "value": "16.3"
            }, {
              "label": "Diapers",
              "color": "#008ee4",
              "value": "76.75"
            }]
          }, {
            "label": "Electronics",
            "color": "#33bdda",
            "value": "30",
            "category": [{
              "label": "Laptops",
              "color": "#33bdda",
              "value": "8.1"
            }, {
              "label": "Televisions",
              "color": "#33bdda",
              "value": "10.5"
            }, {
              "label": "SmartPhones",
              "color": "#33bdda",
              "value": "11.4"
            }]
          }]
        }]
      };
    <script src="http://static.fusioncharts.com/code/latest/fusioncharts.js"></script>
    <!-- 
        Sales by category shown using Multi-level Pie Chart.
    -->
    <div id="chart-container">FusionCharts will render here</div>

    您也可以参考融合treeMap chart 来表示树和层次数据。

    【讨论】:

    • 感谢您的回复....您定义了静态类别....." rotate("Handbags", e.sender, -42); rotate("Shoes", e.sender , -50); rotate("洗澡和美容", e.sender, -57); rotate("喂食", e.sender, -64);"在我的场景中,数据源是动态的......我认为这无助于解决问题......你能提出其他方法吗?我创建了 jsfiddle 你能不能解决这个问题。jsfiddle.net/prasadraja07/J7svx/427
    • 嘿 @prasad dataRefiner() 将动态工作。但rotate() 有其局限性。我是这么想的,但无法安排一个通用的重叠经理。告诉我一件事,如果这个轮换是动态的,那么你的问题解决了吗?但是如果一个小切片有一个大文本,它仍然需要修剪。让我看看我是否可以更新一些改进的版本。您使用的是 FC 3.11+ 版本吗?
    • 是的,我只使用 3.11……我为你创建了一个小提琴……我尝试了动态“dataSource:dataRefiner(data)”,……它不起作用。 ...jsfiddle.net/prasadraja07/J7svx/427 你能在 jsfiddle 中做类似的事情吗
    • 嘿@PrasadRaja 请检查jsfiddle.net/AyanGhatak/J7svx/429
    • 不,兄弟,我不这么认为。在小提琴jsfiddle.net/AyanGhatak/J7svx/429 中,我展示了如何使用自己的自定义函数来优化结果。对于重叠部分,我需要一些时间来设置一些逻辑/算法来处理它,直到 FusionCharts 决定从他们的最后开始管理它。您也可以通过 ghatak.ayan.btech@gmail.com 与我联系离线 cmets。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2019-01-04
    • 2019-03-09
    • 2014-10-21
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多