在图表中显示分组数据(不同颜色)的图例

Posted

技术标签:

【中文标题】在图表中显示分组数据(不同颜色)的图例【英文标题】:Display legend of grouped data (different colors) in chart 【发布时间】:2021-11-12 22:48:48 【问题描述】:

我有一个不同颜色的水平图表来对数据进行分组。在下面的代码中,图表布局按预期显示,但图例仅显示单一颜色(黄色)。如何在保持图表布局的同时强制图表显示其他两个的图例?图例应该是黄色的“第 1 组”、橙色的“第 2 组”和粉红色的“第 3 组”。

var ctx = document.getElementById("myChart").getContext("2d");

var dataArr = [21, 34, 21, 90, 88, 88, 22, 11, 10, 62, 55, 96, 62];
var dataLabelsArr = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"];
var dataColorsArr = ["yellow", "yellow", "yellow", "yellow", "orange", "orange", "orange", "orange", "orange", "hotpink", "hotpink", "hotpink", "hotpink"];


var data = 
  datasets: [
    label: dataLabelsArr,
    backgroundColor: dataColorsArr,
    data: dataArr
  ]
;

var myBarChart = new Chart(ctx, 
  type: 'bar',
  data: 
    labels: dataLabelsArr,
    datasets: [
      data: dataArr,
      backgroundColor: dataColorsArr,
      label: "Group 1"
    ]
  ,
  options: 
    indexAxis: 'y',
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js"></script>
<canvas id="myChart"  ></canvas>

【问题讨论】:

你想显示什么?您的数据未分组。如果对数据进行分组,这样的图表看起来会有所不同。也许您需要不同的图表? 我正在尝试显示一个像上面那样的水平条形图,数据中的三个“组”具有不同的颜色(A-D as Group 1E-I as Group 2,和J-MGroup 3),以便它们具有不同的颜色并显示3个“组”图例/颜色框。当我尝试添加其他数据集时,我没有对数据进行分组,但在每个黄色条旁边添加了一个橙色条。我不知道如何创建上面的图表但添加了颜色框/图例的任何解决方案。 【参考方案1】:

基于LeeLenaleeanswer的解决方案

const ctx = document.getElementById("myChart").getContext("2d");

const labels = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"];

const group1Data = [21, 34, 21, 90];
const group2Data = [88, 88, 22, 11, 10];
const group3Data = [62, 55, 96, 62];

const getResultData = (mainIndex, ...data) => data.reduce((acc, data, index) => 
  if (mainIndex === index) return acc.concat(data);
  return acc.concat(data.map(() => null));
, []);

const groups = [
  
    label: 'Group 1',
    data: getResultData(0, group1Data, group2Data, group3Data),
    backgroundColor: 'yellow'
  ,
  
    label: 'Group 2',
    data: getResultData(1, group1Data, group2Data, group3Data),
    backgroundColor: 'orange'
  ,
  
    label: 'Group 3',
    data: getResultData(2, group1Data, group2Data, group3Data),
    backgroundColor: 'hotpink'
  
];

const myBarChart = new Chart(ctx, 
  type: 'bar',
  data: 
    labels,
    datasets: groups.map((group) => (
      ...group,
      barPercentage: groups.length
    ))
  ,
  options: 
    indexAxis: 'y',
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js"></script>
<canvas id="myChart"  ></canvas>

【讨论】:

【参考方案2】:

您只提供一个数据集,因此您只会获得 1 个图例项。此图例项使用它看到的第一个背景颜色作为图例的颜色。

要达到您想要的效果,您需要使用 3 个不同的数据集,每个数据集都有一个静态背景颜色。 然后您可以使用对象表示法将点与正确的 X 标签匹配,或者您可以传递 X 数量的空值来填充空间

【讨论】:

如果传递零或空值,则条形宽度将减小,因为它们是分组的 是的,你可以增加栏百分比来对抗它

以上是关于在图表中显示分组数据(不同颜色)的图例的主要内容,如果未能解决你的问题,请参考以下文章

如何向 ASP.NET 3.5 图表控件添加图例?

当数据中不存在分组变量的所有级别时,绘图之间的颜色比例和图例一致

我们如何根据颜色标记散点图的图例

echarts折线图tooltip中图例颜色对应混乱问题

使用相同的标签和颜色为不同的图形手动斜体和着色图例

matplotlib:同一张图上有2个不同的图例