如何在Chart.js柱状图上添加圆角

16

我使用以下代码在chart.js中创建了一个条形图。然而,我想给条形的顶部圆角而不是边缘。我无法找到任何使用chart.js全局设置实现这一效果的方法。是否有任何方法可以实现我想要的效果?

var barContext = document.getElementById("canvas").getContext("2d");

var barGradientFirst = barContext.createLinearGradient(0, 0, 0, 450);
barGradientFirst.addColorStop(0, 'rgba(112,122,157, 0.1)');   
barGradientFirst.addColorStop(1, 'rgba(112,122,157, 1)');

var barGradientSecond = barContext.createLinearGradient(0, 0, 0, 450);
barGradientSecond.addColorStop(0, 'rgba(151,122,208, 0.1 )');  
barGradientSecond.addColorStop(1, 'rgba(151,122,208, 1)');


var barChartData = {
labels: ["High", "Med", "Low", "None"],
datasets : [
    {
        fillColor : barGradientFirst,
        strokeColor: "rgb(112,122,200)",
        data: [30, 40, 70, 90]
    }, {
        fillColor : barGradientSecond,
        strokeColor: "rgba(220,100,80,0.8)",
        data: [50, 60, 65, 20]
    }]  
};

new Chart(barContext).Bar(barChartData, {
    responsive : true,
    scaleOverride : true,
    scaleBeginAtZero : true,
    scaleSteps : 2,
    scaleLineWidth: 3,
    scaleStepWidth : 50,
    scaleShowLabels : true,
    scaleShowVerticalLines: false,
    scaleShowHorizontalLines: false,
    scaleFontSize: 30,
    barValueSpacing : 40,
    barDatasetSpacing : 3,
    scaleLabel: "<%= value + '%' %>"
});

第一个问题非常好,清晰简洁。只是缺少一些关于你已经尝试过什么的信息(例如查看文档、阅读属性或更改其中一些)。 - jumps4fun
我确实查看了这里的文档,但似乎没有任何东西可以让我改变条形图的形状,除了大小和宽度。由于我对JavaScript还很陌生,所以不太清楚还能告诉你什么。 - c0d3appl3
嗯...我之前有一点使用Highcharts的经验,它将图表呈现为一组HTML元素。在那里,我可以编辑单个显示元素的CSS,但这似乎不是这种情况。它只是作为一张图片显示... - jumps4fun
@c0d3appl3 - 在Chart.js中可以绘制圆角矩形(没有配置,但是可以扩展现有的图表来实现)。有一个辅助方法,你可以在工具提示中看到它的效果。 - potatopeelings
没有更多的痛苦了。这将在下一个主要版本中添加。https://www.chartjs.org/docs/master/charts/bar#borderradius - Rem
2个回答

20
https://dev59.com/C1wZ5IYBdhLWcg3wVfAC#68778432所指出的,此功能在v3中已经有原生实现。

原始回答

以下是如何扩展Chart.js来绘制带有圆角的条形图。

Chart.types.Bar.extend({
    name: "BarAlt",
    initialize: function (data) {
        Chart.types.Bar.prototype.initialize.apply(this, arguments);
            
        if (this.options.curvature !== undefined && this.options.curvature <= 1) {
            var rectangleDraw = this.datasets[0].bars[0].draw;
            var self = this;
            var radius = this.datasets[0].bars[0].width * this.options.curvature * 0.5;

            // override the rectangle draw with ours
            this.datasets.forEach(function (dataset) {
                dataset.bars.forEach(function (bar) {
                    bar.draw = function () {
                        // draw the original bar a little down (so that our curve brings it to its original position)
                        var y = bar.y;
                        // the min is required so animation does not start from below the axes
                        bar.y = Math.min(bar.y + radius, self.scale.endPoint - 1);
                        // adjust the bar radius depending on how much of a curve we can draw
                        var barRadius = (bar.y - y);
                        rectangleDraw.apply(bar, arguments);

                        // draw a rounded rectangle on top
                        Chart.helpers.drawRoundedRectangle(self.chart.ctx, bar.x - bar.width / 2, bar.y - barRadius + 1, bar.width, bar.height, barRadius);
                        ctx.fill();

                        // restore the y value
                        bar.y = y;
                    }
                })
            })
        }
    }
});


var lineChartData = {
    labels: ["January", "February", "March", "April", "May", "June"],
    datasets: [
        {
            fillColor: "#79D1CF",
            strokeColor: "#79D1CF",
            data: [60, 80, 81, 56, 55, 40]
        },
        {
            fillColor: "#D1CF79",
            strokeColor: "#D1CF79",
            data: [34, 43, 43, 12, 65, 65]
        }
    ]
};

var ctx = document.getElementById("myChart").getContext("2d");
var myLine = new Chart(ctx).BarAlt(lineChartData, {
    // 0 (flat) to 1 (more curvy)
    curvature: 1
});

如果你不需要动画效果,可以简化代码。
示例 - http://jsfiddle.net/0dzp3jxw/
enter image description here

1
不用担心。找出答案真的很有趣 :-) - potatopeelings
如果图表的值太低,我该怎么办?我发现圆角矩形要么悬浮在条形图上方,要么穿过图表底部。 - c0d3appl3
1
有人知道如何在angular-chart中使用它吗?(chartjs的包装器) - Peheje
1
@potatopeelings,你的回答太棒了!我很想应用你的代码块来扩展我的条形图,使用chart.js v2.0。有什么想法吗?请看这里https://dev59.com/qpnga4cB1Zd3GeqPXFa6 - Jibeee
1
v3原生支持圆角。https://dev59.com/C1wZ5IYBdhLWcg3wVfAC#68778432 - Franco Altuna
显示剩余8条评论

7

从Chart.js v3开始,您只需在数据集上指定borderRadius: NUMBER即可。

new Chart(document.querySelector('canvas').getContext('2d'), {
        type: 'bar',
        data: {
            labels: ['1','2','3','4','5','6'],
            datasets: [{
                label: 'Sales',
                data: [20,30,10,20,30,10],
                fill: true,
                borderRadius: 15,
                borderColor: '#5eb8ff',
                backgroundColor: '#5eb8ff',
                datalabels: {
                    display: false
                }
            }]
        }
    });
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <canvas></canvas>
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/chart.js@3.0.0/dist/chart.min.js"></script>
</body>
</html>


注意:这只适用于栏的一端。如果您需要两端都是圆形,请添加 borderSkipped: false - DarkTrick
你能帮我做一个堆叠条形图吗?需要使用chartjs v3.7,并设置顶部和底部的border-radius。 - Yash Shukla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接