如何使用Chartjs绘制具有基于时间的x轴的单行彩色条

ltskdhd1  于 2023-02-16  发布在  Chart.js
关注(0)|答案(1)|浏览(239)

我有一些基于时间的数据,我想要一个图形表示,并希望使用Chartjs来绘制这个。
数据如下所示:

  1. Time State
  2. --------------
  3. 7am up
  4. 9am down
  5. 10.45am out
  6. 17.35 up

此外,每个"状态"都有自己的颜色,因此在使用条形图时,我会将其用作条形颜色

  1. up = red
  2. down = yellow
  3. out = green

最终的结果,我后是一个简单的一行酒吧,如下图所示...

我想我也许可以使用Chartjs horizontal stacked条形图(https://www.chartjs.org/docs/latest/charts/bar.html#horizontal-bar-chart)来完成这项工作,但我就是想不出如何让它工作。
一些(不工作的)实验代码如下:

  1. private createChart(): void {
  2. if (this.chart !== undefined) {
  3. return;
  4. }
  5. Chart.register(BarController, PointElement, Tooltip, Legend, TimeScale, LinearScale, CategoryScale, LinearScale, BarElement);
  6. const options: ChartOptions = {
  7. plugins: {
  8. legend: {
  9. display: false,
  10. },
  11. title: {
  12. display: false,
  13. },
  14. },
  15. indexAxis: 'y',
  16. responsive: true,
  17. maintainAspectRatio: false,
  18. scales: {
  19. y: {
  20. stacked: true,
  21. type: 'time',
  22. display: true,
  23. // position: 'bottom',
  24. time: {
  25. unit: 'minute',
  26. displayFormats: {
  27. minute: 'h:mm a'
  28. }
  29. }
  30. },
  31. x: {
  32. stacked: false,
  33. }
  34. }
  35. };
  36. this.chart = new Chart(this.canvasRef.nativeElement, {
  37. type: 'bar',
  38. data: this.chartData,
  39. options
  40. });
  41. this.chart.config.options.scales.y.min = new Date('2023-02-13T06:19:31.842Z').getTime();
  42. const labels = [
  43. 'up',
  44. 'down'
  45. // 'Dataset 2'
  46. ];
  47. const d1 = new Date('2023-02-13T06:20:32.842Z').getTime();
  48. const d2 = new Date('2023-02-13T06:21:33.842Z').getTime();
  49. this.chartData = {
  50. labels,
  51. datasets: [{
  52. label: 'up',
  53. data: [{x: 10, y: d1}],
  54. backgroundColor: 'red',
  55. },
  56. {
  57. label: 'down',
  58. data: [{x: 20, y: d2}],
  59. backgroundColor: 'green',
  60. }
  61. ]
  62. };
  63. this.chart.update();
  64. }

在上面的例子中,我尝试了标签、x值、y值、数据形状的各种组合,但我甚至只得到了一个空图。
也许这真的不可能(我试图使用错误的组件)。
如何使用chartjs实现这一点?

更新

使用下面@winner_joiner中的示例,我将其副本放在plunkr中,并尝试在x轴中使用时间,但可以看到它仍然没有使用日期作为长度来绘制条形图

tnkciper

tnkciper1#

你的代码基本上可以工作,这里是代码的一个稍微修改的版本。
在您的评论和更新的问题之后,我重新编写了这个示例 (见下文)。虽然可以使用chart.js,但问题是,对于这个特定的任务,不同的库或解决方案可能会更好/更方便。

    • 使用您问题中的一些 * 类似 * 值更新图表:**
  • (我在这里使用momentjs,因为它是chartjs中推荐的常用表单日期/时间操作,如the documentation中所述)*
  1. const d0 = moment.duration('07:00:00').asMinutes();
  2. const d1 = moment.duration('09:00:00').asMinutes();
  3. const d2 = moment.duration('10:45:00').asMinutes();
  4. const d3 = moment.duration('17:35:00').asMinutes();
  5. const d4 = moment.duration('19:00:00').asMinutes();
  6. let values = [d0, d1, d2, d3, d4];
  7. let data = {
  8. labels: [''],
  9. datasets: [{
  10. label: 'up',
  11. axis: 'y',
  12. data: [d1],
  13. backgroundColor: 'red',
  14. },{
  15. label: 'down',
  16. axis: 'y',
  17. data: [d2],
  18. backgroundColor: 'yellow',
  19. },{
  20. label: 'out',
  21. axis: 'y',
  22. data: [d3],
  23. backgroundColor: 'green',
  24. },{
  25. label: 'up',
  26. axis: 'y',
  27. data: [d4],
  28. backgroundColor: 'red',
  29. }
  30. ]
  31. };
  32. const config = {
  33. data,
  34. type: 'bar',
  35. options:{
  36. plugins: {
  37. tooltip: {
  38. mode: 'dataset',
  39. callbacks: {
  40. label: function(item){
  41. return moment().startOf('day').add({ minute: item.raw}).format('HH:mm');
  42. }
  43. }
  44. },
  45. legend: {
  46. display: false,
  47. },
  48. title: {
  49. display: false,
  50. },
  51. },
  52. indexAxis: 'y',
  53. responsive: true,
  54. maintainAspectRatio: false,
  55. scales: {
  56. x: {
  57. min: d0,
  58. ticks: {
  59. callback: function(value, index, ticks) {
  60. return moment().startOf('day').add({ minute: value}).format('HH:mm');
  61. }
  62. },
  63. afterBuildTicks: axis => axis.ticks = values.map(v => ({ value: v }))
  64. },
  65. y: {
  66. stacked: true
  67. },
  68. }
  69. }};
  70. new Chart(document.getElementById("chart"), config);
  1. <script src="//cdn.jsdelivr.net/npm/chart.js"></script>
  2. <script src="//cdn.jsdelivr.net/npm/moment@^2"></script>
  3. <script src="//cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1"></script>
  4. <div class="chart" style="height:184px; width:350px;">
  5. <canvas id="chart" ></canvas>
  6. </div>
展开查看全部

相关问题