当前位置: 首页 > 知识库问答 >
问题:

如何在图表上移动标签的位置。js派

宋翔
2023-03-14

我正在使用Chart.js,我试图将饼图上的标签移动到饼图区域之外(见红色X):

这是我现在的代码:

<div class="container" id="pieContainer">
    <h4 class="title">Title</h4>
    <center><canvas id="pie"></canvas></center>
</div>

<script>                                  
    var pieData = [
    {
        value: 39,
        color:"#335478",
        label: "Blue"
    },
    {
        value : 4,
        color : "#7f7f7f",
        label: "Grey"
    },
    {
        value : 57,
        color : "#99cb55",
        label: "Green"
    }
    ];

    var optionsPie = {
        responsive : true,
        tooltipEvents: [],
        showTooltips: true,
        onAnimationComplete: function() {
             this.showTooltip(this.segments, true);
        },
        tooltipTemplate: "<%= label %> - <%= value %>%"
    };
    new Chart(document.getElementById("pie").getContext("2d")).Pie(pieData, optionsPie);
</script>

我不想使用图例,也找不到移动标签的内置方法。是否有一种方法可以在不更改<code>图表的情况下执行此操作。js?实现目标的最佳方式是什么?

共有3个答案

梁宪
2023-03-14

看起来您可以控制工具提示的 x 和 y 位置:

var myPieChart = new Chart(ctx).Pie(data, {
    customTooltips: function(tooltip) {

        // tooltip will be false if tooltip is not visible or should be hidden
        if (!tooltip) {
            return;
        }

        // Otherwise, tooltip will be an object with all tooltip properties like:

        // tooltip.caretHeight
        // tooltip.caretPadding
        // tooltip.chart
        // tooltip.cornerRadius
        // tooltip.fillColor
        // tooltip.font...
        // tooltip.text
        // tooltip.x
        // tooltip.y
        // etc...

    };
});

看看 http://www.chartjs.org/docs/#doughnut-pie-chart-chart-options

莫乐
2023-03-14

我最近遇到了同样的问题,chartsjs插件标签为我解决了这个问题。

示例:

import {Chart} from 'chartjs';
import 'chartjs-plugin-labels';

let options = {
  plugins: {
    labels: {
      position: 'outside',
      render: (args) => {
        return `${args.label}: ${args.value}%`;
      }
    }
  }
}

let data = {
  datasets: [
    {
      data: [39, 4, 57],
      labels: ['Blue', 'Gray', 'Green'],
    },
  ],
}

new Chart(ctx, {
  type: 'pie',
  data: data,
  options: options
}
裴昊阳
2023-03-14

只需扩展图表即可。如果您的标签是静态的,那么只需更改< code>tooltipPosition方法可能会更简单。

预览

脚本

Chart.types.Pie.extend({
    name: "PieAlt",
    initialize: function(data){
        Chart.types.Pie.prototype.initialize.apply(this, arguments);

        var requiredSpace = 0;
        for (var i = 0; i < data.length; i++)
            requiredSpace = Math.max(ctx.measureText(Chart.helpers.template(this.options.tooltipTemplate, data[i])).width, requiredSpace);
        this.outerRadius -= (requiredSpace + 20);
    },
    draw: function(data){
        Chart.types.Pie.prototype.draw.apply(this, arguments);

        var self = this;
        ctx.save();
        ctx.font = Chart.helpers.fontString(self.options.scaleFontSize, self.options.scaleFontStyle, self.options.scaleFontFamily);
                ctx.textBaseline = "middle";
        self.segments.forEach(function (segment) {
            var outerEdge = Chart.Arc.prototype.tooltipPosition.apply({
                x: this.chart.width / 2,
                y: this.chart.height / 2,
                startAngle: segment.startAngle,
                endAngle: segment.endAngle,
                outerRadius: segment.outerRadius * 2 + 20,
                innerRadius: 0
            })

            var normalizedAngle = (segment.startAngle + segment.endAngle) / 2;
            while (normalizedAngle > 2 * Math.PI) {
                normalizedAngle -= (2 * Math.PI)
            }

            if (normalizedAngle < (Math.PI * 0.4) || (normalizedAngle > Math.PI * 1.5))
                ctx.textAlign = "start";
            else if (normalizedAngle > (Math.PI * 0.4) && (normalizedAngle < Math.PI * 0.6)) {
                outerEdge.y += 5;
                ctx.textAlign = "center";
            }
            else if (normalizedAngle > (Math.PI * 1.4) && (normalizedAngle < Math.PI * 1.6)) {
                outerEdge.y - 5;
                ctx.textAlign = "center";
            }
            else
                ctx.textAlign = "end";

            ctx.fillText(Chart.helpers.template(self.options.tooltipTemplate, segment), outerEdge.x, outerEdge.y);
        });

        ctx.restore();
    }
});

然后呢

new Chart(ctx).PieAlt(data, {
    showTooltips: false
});

小提琴-http://jsfiddle.net/h8rggkhp/

 类似资料:
  • 我的极坐标图是什么样子的 我试图移动ytick标签,使它们与轴标签类似地对齐。例如,'PTS'标签水平对齐到其轴,但ytick标签向右移动。 对于y值标签,我使用set_rgrids()函数指定角度和标签值,并使用tick_params()函数指定标签属性,如旋转。但是,此函数不允许我设置标签的文本框对齐。 如何将y值向左移动,使其直接位于相应的轴标签下? 完整代码:

  • 我把chart.js和React一起用。我的问题是如何一个月只显示一次月份标签(MMM)?< br > 图表当前有标签: 结果我想得到: 代码沙盒 折线图:

  • 问题内容: 我敢肯定这是可能的,但是我所有的搜索都空白了。 在Java中,是否可以在Java应用程序之外注册鼠标移动事件?因此,如果鼠标指针移动到屏幕上的任何地方,我都会回电。轮询可能是近似值,但必须有更好的方法。 谢谢 解释用例:它仅用于一个宠物项目,但是基本上是当鼠标击中屏幕边缘时触发事件。我还认为,如果您尝试 超越 屏幕边缘,可能会触发其他事件。为此,我认为鼠标运动侦听器可能更合适。 问题答

  • 问题内容: 我正在为网站创建流畅的布局。我正在尝试在移动视图中隐藏一个或整个内容的内容,而不是在平板电脑和台式机视图中隐藏。 到目前为止,这就是我所得到的… 我将移动版式的显示设置为“无”,并在平板电脑/台式机版式上将其设置为“阻止” …有没有更简单的方法? 问题答案: 您将需要两件事。第一种是在特定屏幕尺寸下激活特定代码,用于响应式设计。第二个是属性的使用。一旦浏览器/屏幕达到600像素,则将被

  • 我是D3的新手,我不太擅长js,但我仍然很喜欢使用d3制作饼图。我有存储在数组中的数据和我希望在数组。 我在这个例子的基础上http://bl.ocks.org/mbostock/3887193,这很容易理解。我的图表的重点是我将值存储在数组中而不是csv文件中,所以我删除了函数。 到目前为止,该图表运行良好,但它不会使用不同的颜色,也不会显示标签。 我可以想到两种可能的解决方案: 循环元素(包含

  • 我正在做Liferay 6.2项目。在Liferay中,他们使用了Vaadin。当我点击一个按钮时,它会打开一个不同的iframe。我可以为所有功能编写代码。现在我想使用WebDriver将光标移动到iframe元素。因为当我将鼠标移动到iframe复选框之后,我的自动脚本就可以运行了。我想自动化一个脚本,将鼠标指针移动到元素。 我已经尝试了下面的代码,但它不起作用。 1) 使用动作移动元素: 2