Chart.js - 在单杠内写标签?

Chart.js - Writing Labels Inside of Horizontal Bars?

在Chart.js中,有没有办法在"horizontalBar"图表的水平条内写标签?比如:

在 Chart.js 中有类似的东西吗?

谢谢!

目前似乎没有直接的选项。一种可能的实现是使用 onAnimationComplete 钩子迭代 bars/columns。您可以查看此问题以获得详细解释

我想提醒您这有一个缺点。由于它使用onAnimationComplete,每当图表上发生动画时,值会消失一秒钟然后再次出现。

参考animationonComplete中使用HTML5CanvasfillText()方法,代码如下会得到你需要的:

自定义显示任何图表相关数据的关键是检查图表的数据集,如下面 this.data.datasets 所示。我通过检查不同值在这个数据集中的位置,以及为 fillText 方法放置它们的位置来做到这一点。

检查图表的数据集:Image

脚本(Chart.js 2.0 及更高版本):

var barOptions = {
      events: false,
        showTooltips: false,
      legend: {
        display: false
      },
      scales:{
        yAxes: [{
          display: false
        }]
      },
        animation: {
        onComplete: function () {
          var ctx = this.chart.ctx;
          ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
          ctx.textAlign = 'left';
          ctx.textBaseline = 'bottom';

          this.data.datasets.forEach(function (dataset) {
            for (var i = 0; i < dataset.data.length; i++) {
              var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
                  left = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._xScale.left;
              ctx.fillStyle = '#444'; // label color
              var label = model.label;
              ctx.fillText(label, left + 15, model.y + 8);
            }
          });               
        }
        }
    };

jsFiddle: http://jsfiddle.net/jfvy12h9/

现在有选项 "mirror" 可以使标签显示在栏内。

水平条形图的 "options" 配置示例:

options: {
    scales: {
        yAxes: [{ticks: {mirror: true}}]
    }
}

文档:http://www.chartjs.org/docs/latest/axes/cartesian/#common-configuration

您可以在 chartjs 2.0 + 中实现此效果,方法是将标签旋转 90 度并应用负填充,以便标签在 'bar' 内向上移动。像这样:

new Chart(document.getElementById(id), {
  type: 'bar',
  data: data,
  options: {
    scales: {
      xAxes: [
        {
          ticks: {
            autoSkip: false,
            maxRotation: 90,
            minRotation: 90,
            padding: -110
          }
        }
      ]
    }
  }
});

有关详细信息,请参阅 tick configuration documentation

由于在 "bar" 图表上不起作用 "mirror" 选项...

我找到了解决方法: Fiddle link

我使用了 chart.js 2.8.0 版本,在 this link

中修改过
<html>
    <body>
        <canvas id="myChart" width="800" height="600">
        </canvas>
    </body>
</html>





var ctx = document.getElementById("myChart").getContext("2d");
var myChart = new Chart(ctx, {
type: "bar",
data: {
labels: ["ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT"],
datasets: [{
    label: "Quota Eni mensile",
    backgroundColor: [
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)"
    ],
    borderColor: [
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)",
        "rgba(255, 255, 153, 1)"
    ],
    borderWidth: 1,
    data: [10, 11, 18, 10, 13, 28, 12, 16]
  }
  ]
},
options: {
    legend: {
        display: false
    },
    scales: {
        xAxes: [{
            ticks:{
                maxRotation: 90,
                minRotation: 90,
                display: "top"
             },          
         }],
         yAxes: [{
             display: false
         }]
     },
     tooltips: {
         enabled: true
     },
     maintainAspectRatio: true,
     responsive: true
 }

});

Chart.plugins.register({
/* Adjust axis labelling font size according to chart size */
  id: "responsiveXlabels",
  beforeDraw: function(c) {
      var chartHeight = c.chart.height;
      var size = (chartHeight * 2.5) / 100;
      var xAxis = c.scales["x-axis-0"];
      xAxis.options.ticks.minor.fontSize = size;
      xAxis.height = 10;
      xAxis.minSize.height = 10;
      c.options.scales.xAxes[0].ticks.padding = -size * 4.5;
      xAxis.margins.bottom = size * 12.5;
  },
  afterDraw: function(c) {
      c.options.scales.xAxes[0].ticks.padding = -158;
  }

});

responsiveXlabel 插件用于在调整大小时转换文本。 只剩下一件事需要解决:在轴的底部对齐文本。

希望这对想要在 X 轴上实现镜像并满足响应请求的人有所帮助。