javascript - 如何删除所有网格线、边框并仅显示 ChartJS 水平条形图上的刻度线

标签 javascript chart.js

this post中的答案之后

我有以下图表,也可以找到here

    const d0 = new Date("2023-02-15T00:00:00.721Z").getTime()
    const d1 = new Date("2023-02-15T01:00:00.721Z").getTime()
    const d2 = new Date("2023-02-15T02:30:00.721Z").getTime()
    const d3 = new Date("2023-02-15T03:20:00.721Z").getTime()
    const d4 = new Date("2023-02-15T05:05:00.721Z").getTime()
    let values = [d0, d1, d2, d3, d4];

    let data = {
        labels: [''],
        datasets: [{
          label: 'up',
          axis: 'y',
          data: [d1],
          backgroundColor: 'red',
        },{
          label: 'down',
          axis: 'y',
          data: [d2],
          backgroundColor: 'yellow',
        },{
          label: 'out',
          axis: 'y',
          data: [d3],
          backgroundColor: 'green',
        },{
          label: 'up',
          axis: 'y',
          data: [d4],
          backgroundColor: 'red',
        }
      ]
      };

    const config = {
    data,
    type: 'bar',
        options:{
          elements: {
            bar: {
              borderWidth: 0
            }
          },
          ticks: {
              display: true
            },

          interaction: {
                mode: 'dataset'
            },
          tooltip: {
             mode: 'dataset'  
          },
          hover: {
               mode: 'dataset'            
            },
           onClick: function (e) {
                           // debugger;
                            var activePointLabel = 
                              this.getElementsAtEventForMode(e, 'dataset', { intersect: true }, false)
                            alert(activePointLabel[0].datasetIndex);
                        }
                    ,      
        plugins: {
          legend: {
            display: false,
          },
          title: {
            display: false,
          },
        },
        indexAxis: 'y',
        responsive: true,
        maintainAspectRatio: false,
        scales: {
          x: {
            grid: {
              display: true
            },
            min: d0,
            ticks: {
                callback: function(value, index, ticks) {
                    return moment(value).format('HH:mm');
                }
            },
          //  afterBuildTicks: axis => axis.ticks = values.map(v => ({ value: v }))
          },
          y: {
             grid: {
              display: false
            },
            
            stacked: true
          },
        }    
      }};
      
      new Chart(document.getElementById("chart"), config);

这会产生这个...

screenshot wrong display ] 1

我想删除除刻度线之外的所有网格线,但如果我将网格显示设置为 false,刻度线也会消失,并且还会在图表周围留下边框,例如

screenshot correct display

有办法做到这一点吗?

最佳答案

只需将 border: {display: false} 添加到 scales 配置中。 ( here is the link to the documentation )

screenshot correct result

...
scales: {
  x: {
    border: {
      display: false,
    },
    ...
  },
  ...
}
...

更新添加的完整运行示例:

const d0 = moment.duration('07:00:00').asMinutes();
const d1 = moment.duration('09:00:00').asMinutes();
const d2 = moment.duration('10:45:00').asMinutes();
const d3 = moment.duration('17:35:00').asMinutes();
const d4 = moment.duration('19:00:00').asMinutes();
let values = [d0, d1, d2, d3, d4];

let data = {
    labels: [''],
    datasets: [{
      label: 'up',
      axis: 'y',
      data: [d1],
      backgroundColor: 'red',
    },{
      label: 'down',
      axis: 'y',
      data: [d2],
      backgroundColor: 'yellow',
    },{
      label: 'out',
      axis: 'y',
      data: [d3],
      backgroundColor: 'green',
    },{
      label: 'up',
      axis: 'y',
      data: [d4],
      backgroundColor: 'red',
    }
  ]
  };

const config = {
data,
type: 'bar',
    options:{
       plugins: {
        tooltip: {
           mode: 'dataset',
           callbacks: {
            label: function(item){
               return moment().startOf('day').add({ minute: item.raw}).format('HH:mm');
            }
          }
        },
        legend: {
          display: false,
        },
        title: {
          display: false,
        },
    },
    indexAxis: 'y',
    responsive: true,
    maintainAspectRatio: false,
    scales: {
      x: {
        min: d0,
        border: { display: false },
        ticks: {
            callback: function(value, index, ticks) {
                return moment().startOf('day').add({ minute: value}).format('HH:mm');
            }
        },
        afterBuildTicks: axis => axis.ticks = values.map(v => ({ value: v }))
      },
      y: {
        stacked: true,
        grid: { display: false },
      },
    }
  }};
  
  new Chart(document.getElementById("chart"), config);
<script src="//cdn.jsdelivr.net/npm/chart.js"></script>    
<script src="//cdn.jsdelivr.net/npm/moment@^2"></script>
<script src="//cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1"></script>   
<div class="chart" style="height:84px; width:350px;">
    <canvas  id="chart" ></canvas>
</div>

关于javascript - 如何删除所有网格线、边框并仅显示 ChartJS 水平条形图上的刻度线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75455765/

相关文章:

javascript - 如果 div 位于特定位置之上,则仅重新加载页面一次

javascript - 在 HTML 中使用数组命名输入字段时——如何计算数组长度?

javascript - Chartjs 与 Vue,条形图边框半径不起作用

php - 如何在刷新时更改全屏背景?

javascript - 对象的原型(prototype)方法仅返回函数定义,不执行。

Javascript 从输入复选框转换数组

chart.js - 图表 JS 数据标签被削减

javascript - Chart.js,虚线,全宽图表

javascript - Chart js v2 工具提示回调换行符

javascript - Chart.js 图例位置错误