Chart.js - 设置最大 Y 轴值并保持步骤正确
Chart.js - Setting max Y axis value and keeping steps correct
我正在使用 Chart.js 2.6。我有一个图表,我在其中添加了自定义分页以遍历数据集,因为它非常大。我的分页和一切都运行良好,我只需获取我集合中的下一块数据并使用新数据对象更新 chart.config.data,然后在图表上调用 .update()。但是,为了使图表有意义,我需要在用户分页时保持左侧(Y 轴)比例不变。通常 Chart.js 会根据图表中的数据重建它,但我希望它始终反映相同的值。
我已将图表的 yAxes 对象上的 max
值设置为我的数据集中的最大值。我还将 beginAtZero 选项设置为 true,将 maxTicksLimit 设置为 10。但是,即使我的 Yaxis 保持不变,它看起来并不总是那么好(见下面的屏幕截图)。在此示例中,图表中我的最大值设置为 21,000。有没有人对我如何提供更好的最大值(根据值四舍五入到下一个 5,000、500、100 等)或某种方法来创建 Y 轴而不用处理最高数字有任何建议现在可以了吗?
这是我目前用来确定最大数据值以设置为图表中 Yaxes 对象最大值的函数。 plugin.settings.chartData 变量表示图表中使用的数据值数组。我试图让它根据 maxValue 正确递增到下一个 1000、500 等,但正如您所看到的,我的数学计算不正确。在屏幕截图示例中,maxValue 返回为 20,750,我的函数将其四舍五入为 21,000。在这个例子中,它应该向上舍入到下一个增量,即 25,000。
var determineMaxDataValue = function() {
var maxValue = Math.max.apply(Math, plugin.settings.chartData);
var step = maxValue > 1000 ? 1000 : 500;
plugin.settings.maxDataValue = (Math.ceil(maxValue / step) * step);
};
想通了。我没有像以前那样在 Y 轴上提供最大值,而是实现了 afterBuildTicks 回调并更新了刻度以具有正确的增量。
yAxes: [{
afterBuildTicks: function(scale) {
scale.ticks = updateChartTicks(scale);
return;
},
beforeUpdate: function(oScale) {
return;
},
ticks: {
beginAtZero:true,
// max:plugin.settings.maxDataValue,
maxTicksLimit: 10
}
}]
我的 updateChartTicks 函数遍历现有的刻度并确定刻度之间的正确增量。然后我使用该值添加我的最终 "tick",它总是大于数据集中的最大数据。
var updateChartTicks = function(scale) {
var incrementAmount = 0;
var previousAmount = 0;
var newTicks = [];
newTicks = scale.ticks;
for (x=0;x<newTicks.length;x++) {
incrementAmount = (previousAmount - newTicks[x]);
previousAmount = newTicks[x];
}
if (newTicks.length > 2) {
if (newTicks[0] - newTicks[1] != incrementAmount) {
newTicks[0] = newTicks[1] + incrementAmount;
}
}
return newTicks;
};
我也遇到了同样的问题。您无需编写任何特殊函数来确定 Yaxes 中的最大值。使用 'suggestedMax' 设置。而不是将 'max' 设置为图表中的最大值,而是将 suggestMax 设置为图表中的最大值。如果您设置了 'stepsize'.
,这永远不会起作用
options: {
scales: {
yAxes: [{
ticks: {
suggestedMax: maxvalue+20
}
}]
}
}
增加了20,使最大值的工具提示清晰可见。
有关详细信息,请参阅 http://www.chartjs.org/docs/latest/axes/cartesian/linear.html#axis-range-settings
我正在使用 Chart.js 2.6。我有一个图表,我在其中添加了自定义分页以遍历数据集,因为它非常大。我的分页和一切都运行良好,我只需获取我集合中的下一块数据并使用新数据对象更新 chart.config.data,然后在图表上调用 .update()。但是,为了使图表有意义,我需要在用户分页时保持左侧(Y 轴)比例不变。通常 Chart.js 会根据图表中的数据重建它,但我希望它始终反映相同的值。
我已将图表的 yAxes 对象上的 max
值设置为我的数据集中的最大值。我还将 beginAtZero 选项设置为 true,将 maxTicksLimit 设置为 10。但是,即使我的 Yaxis 保持不变,它看起来并不总是那么好(见下面的屏幕截图)。在此示例中,图表中我的最大值设置为 21,000。有没有人对我如何提供更好的最大值(根据值四舍五入到下一个 5,000、500、100 等)或某种方法来创建 Y 轴而不用处理最高数字有任何建议现在可以了吗?
这是我目前用来确定最大数据值以设置为图表中 Yaxes 对象最大值的函数。 plugin.settings.chartData 变量表示图表中使用的数据值数组。我试图让它根据 maxValue 正确递增到下一个 1000、500 等,但正如您所看到的,我的数学计算不正确。在屏幕截图示例中,maxValue 返回为 20,750,我的函数将其四舍五入为 21,000。在这个例子中,它应该向上舍入到下一个增量,即 25,000。
var determineMaxDataValue = function() {
var maxValue = Math.max.apply(Math, plugin.settings.chartData);
var step = maxValue > 1000 ? 1000 : 500;
plugin.settings.maxDataValue = (Math.ceil(maxValue / step) * step);
};
想通了。我没有像以前那样在 Y 轴上提供最大值,而是实现了 afterBuildTicks 回调并更新了刻度以具有正确的增量。
yAxes: [{
afterBuildTicks: function(scale) {
scale.ticks = updateChartTicks(scale);
return;
},
beforeUpdate: function(oScale) {
return;
},
ticks: {
beginAtZero:true,
// max:plugin.settings.maxDataValue,
maxTicksLimit: 10
}
}]
我的 updateChartTicks 函数遍历现有的刻度并确定刻度之间的正确增量。然后我使用该值添加我的最终 "tick",它总是大于数据集中的最大数据。
var updateChartTicks = function(scale) {
var incrementAmount = 0;
var previousAmount = 0;
var newTicks = [];
newTicks = scale.ticks;
for (x=0;x<newTicks.length;x++) {
incrementAmount = (previousAmount - newTicks[x]);
previousAmount = newTicks[x];
}
if (newTicks.length > 2) {
if (newTicks[0] - newTicks[1] != incrementAmount) {
newTicks[0] = newTicks[1] + incrementAmount;
}
}
return newTicks;
};
我也遇到了同样的问题。您无需编写任何特殊函数来确定 Yaxes 中的最大值。使用 'suggestedMax' 设置。而不是将 'max' 设置为图表中的最大值,而是将 suggestMax 设置为图表中的最大值。如果您设置了 'stepsize'.
,这永远不会起作用options: {
scales: {
yAxes: [{
ticks: {
suggestedMax: maxvalue+20
}
}]
}
}
增加了20,使最大值的工具提示清晰可见。
有关详细信息,请参阅 http://www.chartjs.org/docs/latest/axes/cartesian/linear.html#axis-range-settings