当Chart.js中未显示数据时隐藏Y轴标签

lnxxn5zx  于 2022-11-07  发布在  Chart.js
关注(0)|答案(4)|浏览(311)

我有一个Chart.js条形图,其中显示了两组数据:总SQL查询和慢速SQL查询。我有Y轴标签的每一个相应的数据集。图形可以看到如下:

当我将其中一组数据切换为不显示时,对应的Y轴标签仍会显示。在解释图形时,这有点令人困惑。如下图所示:

**我的问题:**如何隐藏当前未显示的任何数据集的Y轴标签?

以下是我目前设置图表的方式:

  1. <canvas id="SQLPerformanceChart" minHeight="400"></canvas>
  2. <script type="text/javascript">
  3. ...
  4. var data = {
  5. labels: labelArray,
  6. datasets: [{
  7. label: "Total SQL Queries",
  8. fill: false,
  9. borderWidth: 1,
  10. borderColor: "green",
  11. backgroundColor: "rgba(0, 255, 0, 0.3)",
  12. yAxisID: "y-axis-0",
  13. data: totalQueriesArray
  14. }, {
  15. label: "Slow SQL Queries",
  16. fill: false,
  17. borderWidth: 1,
  18. borderColor: "orange",
  19. backgroundColor: "rgba(255, 255, 0, 0.3)",
  20. yAxisID: "y-axis-1",
  21. data: slowQueriesArray,
  22. }]
  23. };
  24. var options = {
  25. animation: false,
  26. scales: {
  27. yAxes: [{
  28. position: "left",
  29. ticks: {
  30. beginAtZero: true
  31. },
  32. scaleLabel: {
  33. display: true,
  34. labelString: 'Total SQL Queries'
  35. },
  36. id: "y-axis-0"
  37. }, {
  38. position: "right",
  39. ticks: {
  40. beginAtZero: true
  41. },
  42. scaleLabel: {
  43. display: true,
  44. labelString: 'Slow SQL Queries'
  45. },
  46. id: "y-axis-1"
  47. }]
  48. },
  49. tooltips: {
  50. enabled: true,
  51. mode: 'single',
  52. callbacks: {
  53. title: function(tooltipItem, data) {
  54. return data.label;
  55. },
  56. beforeLabel: function(tooltipItem, data) {
  57. if (tooltipItem.index == 24) {
  58. return data.labels[tooltipItem.index] + " - Now";
  59. } else {
  60. return data.labels[tooltipItem.index] + " - " + data.labels[(tooltipItem.index) + 1];
  61. }
  62. }
  63. }
  64. }
  65. }
  66. var ctx = document.getElementById("SQLPerformanceChart");
  67. var SQLPerformanceChart = new Chart(ctx, {
  68. type: 'bar',
  69. data: data,
  70. options: options
  71. });
  72. </script>
gblwokeq

gblwokeq1#

您可以将回调函数添加到图例onClick:

  1. var options = {
  2. animation: false,
  3. scales: {
  4. yAxes: [{
  5. position: "left",
  6. ticks: {
  7. beginAtZero: true
  8. },
  9. scaleLabel: {
  10. display: true,
  11. labelString: 'Total SQL Queries'
  12. },
  13. id: "y-axis-0"
  14. }, {
  15. position: "right",
  16. ticks: {
  17. beginAtZero: true
  18. },
  19. scaleLabel: {
  20. display: true,
  21. labelString: 'Slow SQL Queries'
  22. },
  23. id: "y-axis-1"
  24. }]
  25. },
  26. legend: {
  27. onClick: function(event, legendItem) {
  28. //get the index of the clicked legend
  29. var index = legendItem.datasetIndex;
  30. //toggle chosen dataset's visibility
  31. SQLPerformanceChart.data.datasets[index].hidden =
  32. !SQLPerformanceChart.data.datasets[index].hidden;
  33. //toggle the related labels' visibility
  34. SQLPerformanceChart.options.scales.yAxes[index].display =
  35. !SQLPerformanceChart.options.scales.yAxes[index].display;
  36. SQLPerformanceChart.update();
  37. }
  38. }
  39. }
展开查看全部
kuarbcqp

kuarbcqp2#

此解决方案适用于使用angular-chartjs,以及将此行为应用于所有显示的图表的情况。
如果要跳到代码,请选中此fiddlejs
您也可以选中其他fiddlejs,以检查默认Angular 图表行为。

循序渐进:

我在angular-chart.js中使用了第一个图表示例,因此这将是单击后的最终结果:

  1. <div ng-app="app" ng-controller="MainController as mainCtrl">
  2. <canvas id="line" class="chart chart-line" chart-data="data"
  3. chart-labels="labels" chart-series="series" chart-options="options"
  4. chart-dataset-override="datasetOverride" chart-click="onClick">
  5. </canvas>
  6. </div>

1.替换全局图表的处理程序:

  1. Chart.defaults.global.legend.onClick = function (e, legendItem) {
  2. var idx = legendItem.datasetIndex;
  3. // IMPORTANT charts will be created in the second and third step
  4. var chart = charts[e.srcElement.id];
  5. chart.options.scales.yAxes[idx].display = !chart.options.scales.yAxes[idx].display;
  6. var meta = chart.getDatasetMeta(idx);
  7. // See controller.isDatasetVisible comment
  8. meta.hidden = meta.hidden === null ? !chart.data.datasets[idx].hidden : null;
  9. chart.update();
  10. };

1.创建一个全局变量charts,这样我们就可以访问画布ID为的每个图表:

  1. var charts = {};

1.使用chart-create事件填充图表变量:

  1. angular.module("app", ["chart.js"]).controller("MainController", function ($scope) {
  2. $scope.$on('chart-create', function (event, chart) {
  3. charts[chart.chart.canvas.id] = chart;
  4. });
  5. $scope.labels = ["January", "February", "March", "April", "May", "June", "July"];
  6. $scope.series = ['Series A', 'Series B'];
  7. $scope.data = [...

我希望会有一个更好的方法从画布id获得图表,但据我所知这是suggested way by the developers

展开查看全部
uurv41yg

uurv41yg3#

如果您将ng2图表与chart.js和Angular 7^一起使用,并且希望将此行为应用于所有显示的图表,则此解决方案适用。

  1. import Chart from chart.js
  2. Chart.defaults.global.legend.onClick = function (e: MouseEvent, chartLegendLabelItem: ChartLegendLabelItem) {
  3. const idx: number = chartLegendLabelItem.datasetIndex;
  4. const chart = this.chart;
  5. chart.options.scales.yAxes[idx].display = !chart.options.scales.yAxes[idx].display;
  6. const meta = chart.getDatasetMeta(idx);
  7. meta.hidden = meta.hidden === null ? !chart.data.datasets[idx].hidden : null;
  8. chart.update();
  9. };

或用于本地配置

  1. legend: <ChartLegendOptions>{
  2. onClick: function (e: MouseEvent, chartLegendLabelItem:ChartLegendLabelItem) {
  3. const idx: number = chartLegendLabelItem.datasetIndex;
  4. const chart = this.chart;
  5. chart.options.scales.yAxes[idx].display =
  6. !chart.options.scales.yAxes[idx].display;
  7. const meta = chart.getDatasetMeta(idx);
  8. meta.hidden = meta.hidden === null ?
  9. !chart.data.datasets[idx].hidden : null;
  10. chart.update();
  11. }
  12. }
展开查看全部
gcmastyq

gcmastyq4#

我在使用v3.8.0时沿着这个问题,上面的任何一个都不适合我。这段代码适合我。注意,我将所有图表示例存储在一个Map中,因为我在同一页上有多个图表。

  1. var instances = new Map();

当我创造incances时,我把它们放在那里。
现在,隐藏Y轴标签和图例上的数据单击:

  1. onClick: function (event, legendItem) {
  2. var instance = instances.get(event.chart.id);
  3. var meta = instance.getDatasetMeta(legendItem.datasetIndex);
  4. var newValue = !meta.yScale.options.display;
  5. meta.hidden = meta.yScale.options.display;
  6. meta.yScale.options.display = newValue;
  7. instance.update();
  8. }

相关问题