首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆叠条形图上的Chart.js动态数据集和工具提示

堆叠条形图上的Chart.js动态数据集和工具提示
EN

Stack Overflow用户
提问于 2020-02-10 11:49:53
回答 1查看 911关注 0票数 0

我想创建一个堆叠条形图。

我在chart.js上看到了sampledocumentation,但没有找到使用动态数据集和工具提示的示例。

我想要实现的就像下面的图片。

因此,第一个堆叠的条形图由两个数据表组成;15和30,总和为45。当用户悬停第一个堆叠栏时,它将显示工具提示;"15 (1-3)“表示底部栏,"30 (3-6)”表示悬停顶部栏。问题是我不知道如何附加动态数据集(对于单个日期,它将包含1到10个数据集)并显示相应的工具提示。我可以使用动态数据集生成线形图/条形图,但堆叠条形图对我来说是新的。

我的json数据源是这样的:

代码语言:javascript
运行
复制
[
   {
      "date":"2020-02-07",
      "range":"1-3",
      "off":15
   },
   {
      "date":"2020-02-07",
      "range":"3-6",
      "off":30
   },
   {
      "date":"2020-02-08",
      "range":"1-4",
      "off":25
   },
   {
      "date":"2020-02-08",
      "range":"4-5",
      "off":15
   },
   {
      "date":"2020-02-08",
      "range":"5-6",
      "off":15
   }
]

它应该生成下面的堆叠条形图。

你能给我提供一些例子,或者我可能遗漏了文档中已经说明我想要什么的某些部分吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-10 17:46:40

请看一看https://stackoverflow.com/a/59658062/2358409,了解它的基本工作原理。

从这些信息开始,一些数据处理和chartjs-plugin-datalabels的使用将您引向以下示例代码。

代码语言:javascript
运行
复制
const data = [
   {
      "date":"2020-02-07",
      "range":"1-3",
      "off":15
   },
   {
      "date":"2020-02-07",
      "range":"3-6",
      "off":30
   },
   {
      "date":"2020-02-08",
      "range":"1-4",
      "off":25
   },
   {
      "date":"2020-02-08",
      "range":"4-5",
      "off":15
   },
   {
      "date":"2020-02-08",
      "range":"5-6",
      "off":15
   }
];

const distinctDates = Array.from(new Set(data.map(o => o.date)));
const dataPerDate = distinctDates.map(d => data.filter(o => o.date == d));
const numberOfDatasets = Math.max.apply(null, dataPerDate.map(data => data.length));
const dataSets = [];
for (let i = 0; i < numberOfDatasets; i++) {
  dataSets.push({
    data: dataPerDate.map(data => i < data.length ? data[i].off : 0),
    ranges: dataPerDate.map(data => i < data.length ? data[i].range : ''),
    backgroundColor: distinctDates.map(d => 
      "rgba(" + Math.floor(Math.random() * 255) + "," + Math.floor(Math.random() * 255) + "," + Math.floor(Math.random() * 255) + ", 0.5)"),
    categoryPercentage: 1,
    barPercentage: 1
  }); 
}

new Chart(document.getElementById("myChart"), {
  type: "bar",
  data: {
    labels: distinctDates,
    datasets: dataSets
  },
  options: {
    plugins: {
	  datalabels: {
        display: context => context.dataset.data[context.dataIndex] > 0,
        formatter: (value, context) => value + ' (' + context.dataset.ranges[context.dataIndex] + ')'
			}
		},
    legend: {
      display: false
    },
    tooltips: {
      enabled: false
    },
    scales: {
      xAxes: [{
         stacked: true
      }],
      yAxes: [{
        stacked: true
      }]      
    }
  }
});
代码语言:javascript
运行
复制
canvas {
  max-width: 300px
}
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels"></script>
<canvas id="myChart" width="100" height="100"></canvas>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60143838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档