如何使用 Chart.js 在圆环图中添加文本?

新手上路,请多包涵

如何在圆环图中呈现文本,我正在使用 ChartJs

原文由 shashisp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您必须修改代码,如:

chart.Doughnut.defaults

 labelFontFamily : "Arial",
 labelFontStyle : "normal",
 labelFontSize : 24,
 labelFontColor : "#666"

然后在函数 drawPieSegments

ctx.fillText(data[0].value + "%", width/2 - 20, width/2, 200);

看到这个拉: https ://github.com/nnnick/Chart.js/pull/35

这是一个实现相同的小提琴 http://jsfiddle.net/mayankcpdixit/6xV78/

原文由 mayankcpdixit 发布,翻译遵循 CC BY-SA 3.0 许可协议

其他答案都没有根据文本的数量和甜甜圈的大小调整文本的大小。这是一个小脚本,您可以使用它在中间动态放置任意数量的文本,它会自动调整大小。

示例:http: //jsfiddle.net/kdvuxbtj/

中间有动态文本的甜甜圈

它将在甜甜圈中使用任意数量的文本,其大小非常适合甜甜圈。为避免接触边缘,您可以将侧边距设置为圆内直径的百分比。如果您不设置它,它将默认为 20。您还可以设置颜色、字体和文本。该插件负责其余的工作。

插件代码将以 30px 的基本字体大小开始。从那里它将检查文本的宽度并将其与圆的半径进行比较并根据圆/文本宽度比调整它的大小。

它的默认最小字体大小为 20px。如果文本超出最小字体大小的界限,它将环绕文本。换行时的默认行高为 25px,但您可以更改它。如果将默认的最小字体大小设置为 false,文本将变得无限小并且不会换行。

它还具有 75px 的默认最大字体大小,以防没有足够的文本并且字体太大。

这是插件代码

Chart.pluginService.register({
  beforeDraw: function(chart) {
    if (chart.config.options.elements.center) {
      // Get ctx from string
      var ctx = chart.chart.ctx;

      // Get options from the center object in options
      var centerConfig = chart.config.options.elements.center;
      var fontStyle = centerConfig.fontStyle || 'Arial';
      var txt = centerConfig.text;
      var color = centerConfig.color || '#000';
      var maxFontSize = centerConfig.maxFontSize || 75;
      var sidePadding = centerConfig.sidePadding || 20;
      var sidePaddingCalculated = (sidePadding / 100) * (chart.innerRadius * 2)
      // Start with a base font of 30px
      ctx.font = "30px " + fontStyle;

      // Get the width of the string and also the width of the element minus 10 to give it 5px side padding
      var stringWidth = ctx.measureText(txt).width;
      var elementWidth = (chart.innerRadius * 2) - sidePaddingCalculated;

      // Find out how much the font can grow in width.
      var widthRatio = elementWidth / stringWidth;
      var newFontSize = Math.floor(30 * widthRatio);
      var elementHeight = (chart.innerRadius * 2);

      // Pick a new font size so it will not be larger than the height of label.
      var fontSizeToUse = Math.min(newFontSize, elementHeight, maxFontSize);
      var minFontSize = centerConfig.minFontSize;
      var lineHeight = centerConfig.lineHeight || 25;
      var wrapText = false;

      if (minFontSize === undefined) {
        minFontSize = 20;
      }

      if (minFontSize && fontSizeToUse < minFontSize) {
        fontSizeToUse = minFontSize;
        wrapText = true;
      }

      // Set font settings to draw it correctly.
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      var centerX = ((chart.chartArea.left + chart.chartArea.right) / 2);
      var centerY = ((chart.chartArea.top + chart.chartArea.bottom) / 2);
      ctx.font = fontSizeToUse + "px " + fontStyle;
      ctx.fillStyle = color;

      if (!wrapText) {
        ctx.fillText(txt, centerX, centerY);
        return;
      }

      var words = txt.split(' ');
      var line = '';
      var lines = [];

      // Break words up into multiple lines if necessary
      for (var n = 0; n < words.length; n++) {
        var testLine = line + words[n] + ' ';
        var metrics = ctx.measureText(testLine);
        var testWidth = metrics.width;
        if (testWidth > elementWidth && n > 0) {
          lines.push(line);
          line = words[n] + ' ';
        } else {
          line = testLine;
        }
      }

      // Move the center up depending on line height and number of lines
      centerY -= (lines.length / 2) * lineHeight;

      for (var n = 0; n < lines.length; n++) {
        ctx.fillText(lines[n], centerX, centerY);
        centerY += lineHeight;
      }
      //Draw text in center
      ctx.fillText(line, centerX, centerY);
    }
  }
});

并且您在图表对象中使用以下选项

options: {
  elements: {
    center: {
      text: 'Red is 2/3 the total numbers',
      color: '#FF6384', // Default is #000000
      fontStyle: 'Arial', // Default is Arial
      sidePadding: 20, // Default is 20 (as a percentage)
      minFontSize: 20, // Default is 20 (in px), set to false and text will not wrap.
      lineHeight: 25 // Default is 25 (in px), used for when text wraps
    }
  }
}

感谢@Jenna Sloan 在此解决方案中使用的数学帮助。

原文由 scorgn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题