Chart.js中折线图的图例

6za6bjd0  于 2022-11-06  发布在  Chart.js
关注(0)|答案(5)|浏览(248)

我想自订缐条数据的图例,使图例图形成为缐条(样式与实际数据缐条相同)而非方块。
就我所知from the source,图形可以是一个点或一个框,框的高度固定为字体大小。“generateLabels”选项似乎不允许围绕这些约束进行扩展。
版本2.2.1。
谢谢你的帮助。

liwlm1x9

liwlm1x91#

注意:此解决方案仅适用于Chart.js的本地版本,因为它需要在库的源代码中编辑函数,而如果从CDN导入,则无法完成此操作。

要达到您的目的,您需要编辑drawLegendBox函数(* 在此处链接到源代码 *)。
首先,就像您要制作pointStyle图例一样,加入useLineStyle并将其设定为true,如下所示:

options: {
    legend: {
        labels : {
            useLineStyle: true
        }
    }
}

然后您需要转到Chart.js的本地版本(* 显然,如果您从CDN导入它,您将无法编辑它 *),并搜索函数drawLegendBox(在Chart.js v2.2.1上,它大约是第6460行;在Chart.js v2.9.4中搜索labelOpts && labelOpts.usePointStyle)。
向下滚动一点,可以看到如下内容:

if (opts.labels && opts.labels.usePointStyle) {
    // Recalulate x and y for drawPoint() because its expecting
    // x and y to be center of figure (instead of top left)
    var radius = fontSize * Math.SQRT2 / 2;
    var offSet = radius / Math.SQRT2;
    var centerX = x + offSet;
    var centerY = y + offSet;

    // Draw pointStyle as legend symbol
    Chart.canvasHelpers.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
}
// --- NEW CONDITION GOES HERE ---
else {
    // Draw box as legend symbol
    ctx.strokeRect(x, y, boxWidth, fontSize);
    ctx.fillRect(x, y, boxWidth, fontSize);
}

并在这两个条件之间加上这一条:

else if (opts.labels && opts.labels.useLineStyle) {
    ctx.beginPath();
    ctx.moveTo(x, y + fontSize * 0.45);
    ctx.lineTo(x + boxWidth, y + fontSize * 0.45);
    ctx.stroke();
}

通过此编辑,每次将useLineStyle设置为true时,图例框都将绘制为线条,如以下屏幕截图所示:

ncgqoxb0

ncgqoxb02#

我可以使用pointStyle:line,在数据集中,然后在选项下使用标签:{usePointStyle: true,}

tvmytwxo

tvmytwxo3#

只是为了改进这个来自tektiv的解决方案。如果你想显示一条虚线,也可以在同一个地方使用这个代码。
(16289号线附近的图表2.7.2):

if (opts.labels && opts.labels.usePointStyle) {
                // CHARTJS CODE
            } else if (opts.labels && opts.labels.useLineStyle) {
                if (legendItem.borderDash) {
                    ctx.setLineDash(legendItem.borderDash);
                }
                ctx.beginPath();
                ctx.moveTo(x, y + fontSize / 2);
                ctx.lineTo(x + boxWidth, y + fontSize / 2);
                ctx.stroke();
            } else {
                // CHARTJS CODE
            }
doinxwow

doinxwow4#

chart.js版本3

对于这个版本,前面提到的内置配置都不起作用。您可以在图例标签上设置boxHeight: 0,以便获得一条线而不是一个框:

{
  legend: {
    labels: {
      boxHeight: 0
    }
  }
}
x759pob2

x759pob25#

你可以通过改变图例框的宽度(例如2px)来制作线图例,它将是垂直线,但它看起来也很漂亮

plugins: {
   legend: {
       display: true,
       labels: {
           boxWidth: 2
       }
    }
}

相关问题