gpt4 book ai didi

bar-chart - Chart.js 动态条宽

转载 作者:行者123 更新时间:2023-12-05 04:15:33 28 4
gpt4 key购买 nike

我有一个需求,需要渲染一组连续 block 的时间序列数据。

我需要用它们自己的 Y 值描述一系列可能跨越数小时或仅几分钟的柱状图。

我不确定 ChartJS 是否是我应该为此使用的,但我已经研究过扩展 Bar 类型,但似乎很难将每个条形编码为相同的宽度。 Scale Class 在内部用于标签、图表宽度等,而不仅仅是条形图本身。

我正在尝试实现类似这样的在 Excel 中工作的东西:http://peltiertech.com/variable-width-column-charts/

有没有其他人想出类似的东西?

enter image description here

最佳答案

我发现我需要这样做,@potatopeelings 的回答很好,但对于 Chartjs 的第 2 版来说已经过时了。我通过扩展栏创建我自己的 Controller /图表类型做了类似的事情:

//controller.barw.js

module.exports = function(Chart) {

var helpers = Chart.helpers;

Chart.defaults.barw = {
hover: {
mode: 'label'
},

scales: {
xAxes: [{
type: 'category',

// Specific to Bar Controller
categoryPercentage: 0.8,
barPercentage: 0.9,

// grid line settings
gridLines: {
offsetGridLines: true
}
}],
yAxes: [{
type: 'linear'
}]
}
};

Chart.controllers.barw = Chart.controllers.bar.extend({

/**
* @private
*/
getRuler: function() {
var me = this;
var scale = me.getIndexScale();
var options = scale.options;
var stackCount = me.getStackCount();
var fullSize = scale.isHorizontal()? scale.width : scale.height;
var tickSize = fullSize / scale.ticks.length;
var categorySize = tickSize * options.categoryPercentage;
var fullBarSize = categorySize / stackCount;
var barSize = fullBarSize * options.barPercentage;

barSize = Math.min(
helpers.getValueOrDefault(options.barThickness, barSize),
helpers.getValueOrDefault(options.maxBarThickness, Infinity));

return {
fullSize: fullSize,
stackCount: stackCount,
tickSize: tickSize,
categorySize: categorySize,
categorySpacing: tickSize - categorySize,
fullBarSize: fullBarSize,
barSize: barSize,
barSpacing: fullBarSize - barSize,
scale: scale
};
},


/**
* @private
*/
calculateBarIndexPixels: function(datasetIndex, index, ruler) {
var me = this;
var scale = ruler.scale;
var options = scale.options;
var isCombo = me.chart.isCombo;
var stackIndex = me.getStackIndex(datasetIndex);
var base = scale.getPixelForValue(null, index, datasetIndex, isCombo);
var size = ruler.barSize;

var dataset = me.chart.data.datasets[datasetIndex];
if(dataset.weights) {
var total = dataset.weights.reduce((m, x) => m + x, 0);
var perc = dataset.weights[index] / total;
var offset = 0;
for(var i = 0; i < index; i++) {
offset += dataset.weights[i] / total;
}
var pixelOffset = Math.round(ruler.fullSize * offset);
var base = scale.isHorizontal() ? scale.left : scale.top;
base += pixelOffset;

size = Math.round(ruler.fullSize * perc);
size -= ruler.categorySpacing;
size -= ruler.barSpacing;
}

base -= isCombo? ruler.tickSize / 2 : 0;
base += ruler.fullBarSize * stackIndex;
base += ruler.categorySpacing / 2;
base += ruler.barSpacing / 2;

return {
size: size,
base: base,
head: base + size,
center: base + size / 2
};
},
});
};

然后您需要像这样将它添加到您的 chartjs 实例中:

import Chart from 'chart.js'
import barw from 'controller.barw'

barw(Chart); //add plugin to chartjs

最后,与另一个答案类似,需要将条形宽度的权重添加到数据集中:

var data = {
labels: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
datasets: [
{
label: "My First dataset",
fillColor: "rgba(220,220,220,0.5)",
strokeColor: "rgba(220,220,220,0.8)",
highlightFill: "rgba(220,220,220,0.7)",
highlightStroke: "rgba(220,220,220,1)",
data: [65, 59, 80, 30, 56, 65, 40],
weights: [1, 0.9, 1, 2, 1, 4, 0.3]
},
]
};

这有望使某人走上正轨。我所拥有的当然并不完美,但如果您确保数据点的权重数量正确,那么您应该是正确的。

祝你好运。

关于bar-chart - Chart.js 动态条宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32138505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com