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

如何对齐Chart.js2中的图例项?

彭硕
2023-03-14

我只需要对齐图表图例,这样它就不会像默认显示的那样看起来太乱,下面是我试图实现的一个示例:

new Chart(document.getElementById("field-0"), {
  type: 'pie',
  data: {
    labels: ["Chat", "Prospeção", "Whatsapp", "Trial", "Site", "Telefone", "E-mail", "Evento"],
    datasets: [{
      data: [700, 400, 200, 150, 80, 50, 20, 10],
      borderWidth: 2,
      hoverBorderWidth: 10,
      backgroundColor: pieColors,
      hoverBackgroundColor: pieColors,
      hoverBorderColor: pieColors,
      borderColor: pieColors
    }]
  },
  options: {
    legend: {
      labels: {
        padding: 20
      }
    }
  }
});

共有3个答案

萧宣
2023-03-14

我试着按照上面评论的建议去做。但要看到这真的很难。对我来说,设置更好、更容易:

图例:{show: FALSE,...}',然后使用html渲染图例(角,反应,视图...另一个渲染模板):

// part of angualr model class
public  dataSets = [{
    label: "New Deals",
    backgroundColor: "#88B2FF",
    data: [26, 15, 5],
  },
  {
    label: "Active Deals",
    backgroundColor: "#397FFF",
    data: [7, 13, 22],
  },
  
  ....
   this.chart = new Chart(ctx, {
      type: "roundedBar",
      data: {
        labels: this.xLabels,
        datasets: this.dataSets,
      },
  <div style="width: 380px;height: 200px; display: inline-block;">
    <canvas id="chart" aria-label="Hello ARIA World" role="img"></canvas>
  </div>
   <!-- This is angular template -->
  <ul class="legend">
    <li *ngFor="let set of dataSets">
      <i [style.backgroundColor]="set.backgroundColor" class="icon"></i>
      <label>
        {{ set.label }}
      </label>
    </li>
  </ul>
  
  <style>
  .legend {
    display: flex;
    text-align: center;
    justify-content: space-between;
    font-size: 10px;
    line-height: 12px;
  }
  .icon {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    display: inline-block;
  }
</style>
丁恩
2023-03-14

chartjs v2创建了处理图例的开销。基本上,你正在寻找的是利用GenerateLabels的使用。

要记住的关键点是,您需要返回一个有效的图例对象数组。

这个plunker描述了解决方案。

这一部分的主要重点是:

generateLabels: (chart) => {

  chart.legend.afterFit = function () {
    var width = this.width; 
    console.log(this);

    this.lineWidths = this.lineWidths.map( () => this.width-12 );

    this.options.labels.padding = 30;
    this.options.labels.boxWidth = 15;
  };

  var data = chart.data;
  //https://github.com/chartjs/Chart.js/blob/1ef9fbf7a65763c13fa4bdf42bf4c68da852b1db/src/controllers/controller.doughnut.js
  if (data.labels.length && data.datasets.length) {
    return data.labels.map((label, i) => {
      var meta = chart.getDatasetMeta(0);
      var ds = data.datasets[0];
      var arc = meta.data[i];
      var custom = arc && arc.custom || {};
      var getValueAtIndexOrDefault = this.getValueAtIndexOrDefault;
      var arcOpts = chart.options.elements.arc;
      var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);
      var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);
      var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);

      return {
        text: label,
        fillStyle: fill,
        strokeStyle: stroke,
        lineWidth: bw,
        hidden: isNaN(ds.data[i]) || meta.data[i].hidden,

        // Extra data used for toggling the correct item
        index: i
      };
    });
  }
  return [];
}
濮阳旺
2023-03-14

图例。标签。generateLabelshook,您通常可以使用它来定制图例标签。我发现,你们可以用下面的方法来调整图表。js计算。

generateLabels:  function (chart) {
    chart.legend.afterFit = function () {
      var width = this.width; // guess you can play with this value to achieve needed layout
      this.lineWidths = this.lineWidths.map(function(){return width;});

    };
    // here goes original or customized code of your generateLabels callback
}

奇怪的是,没有实际的配置选项来实现这一点。

 类似资料:
  • 问题内容: 如何在容器中对齐图像? 例 在我的例子,我需要垂直居中的在用“: 的高度是固定的,图像的高度是未知的。如果这是唯一的解决方案,则可以添加新元素。我正在尝试在Internet Explorer 7和更高版本的WebKit,Gecko上执行此操作。 在这里查看jsfiddle 。 问题答案: 唯一的(和最好的跨浏览器)的方式,因为我知道是使用佣工,并在这两个元素。 因此,有一个解决方案:h

  • 在这个页面上,有一些员工的照片。 在肖像模式的iPad上,员工照片在右手边被切断。 我不介意他们被切断,但我希望他们对齐中心,而不是左对齐。 注意,我希望图像的尺寸是相同的,只是对齐向左移动,变成中心,这样脸就显示在图像边界的中间。 我尝试了以下解决这个问题的方法: 和 和 但这些都不起作用。

  • 问题内容: 我在div中垂直对齐图像时遇到问题 据我所知,我需要“显示:块;” 定位图像在中心,这是可行的。同样在教程中,我找到了很多答案,但它们并不是“有用的”,因为我的所有图像都不在同一高度! 问题答案: 如果容器中的高度固定,则可以将line-height设置为与高度相同,并且它将垂直居中。然后只需添加text-align使其水平居中即可。 编辑 您的代码应如下所示: 更新 现在是2016年

  • 我正在尝试新发布的BottomNavigationView从android支持库 我的假设是,如果我不设置菜单标题,菜单图标将垂直居中对齐,但事实并非如此。下面是示例屏幕截图。 如果可能的话,有人能给我指出正确的方向,而不必向下滚动和自定义视图吗?我的目标是以下输出。

  • 这让我发疯,我想知道我是否只是不了解直方图,matplotlib或世界的基本知识。如果我尝试用matplotlib的直方图绘制以下数据,我得到以下图像,这绝对不正确: 1.25 似乎是正确的,但例如,5 是完全错误的,而 1 没有绘制。我做错了什么吗?(注意:矩阵直方图的默认对齐方式以值为中心)

  • 我想使用flexbox来垂直对齐 中的一些内容,但没有取得很大的成功。 我在网上查了一下,很多教程实际上都使用了包装器div,它从父级的flex设置中获得,但我想知道是否可以去掉这个附加元素? 我选择在此实例中使用flexbox,因为列表项高度将是动态的。 null null

  • 我目前正在使用作为用户交互界面网格,它运行良好。但是,我想启用水平滚动。网格每页支持8个项目,当项目总数为4个时,这是启用水平滚动方向时应该如何排列项目: 这里0 - 有没有办法让它们像这样居中对齐: 这样内容看起来更干净? 下面的安排也可能是我期待的一个解决方案。

  • 问题内容: 我正在使用SwiftUI绘制一个表,该表的行和列太多,无法容纳 屏幕宽度/高度。在这种情况下,我无法将视图对齐为 领先,但总是以某种方式居中。我该如何调整他们的领先地位?这 是绘制表格的视图: 这是GridStack: 这就是应用程序中的外观。请注意,边缘不适合 屏幕内部。即使我尝试滚动到那里,它也会反弹回来。 问题答案: 这是一个可能的方法演示(以及改进的方向,因为我 没有测试所有情