旧的 yAxis 刻度不会被删除(chartjs、react-chartjs-2 包装器)
old yAxis ticks do not get removed (chartjs, react-chartjs-2 wrapper)
当我绘制一个包含 4 条线的图表时,每条线都有自己的数据 ofc,我以编程方式为具有 4 个 Y 轴的折线图创建选项,第一个在左侧,其余在右侧。现在,绘制图表后,我从列表中删除 select 一些数据源(绘制的线条更少),现在过时的 yAxis 刻度保留在那里,即使图表正确地仅绘制了 select ed 行,选项也会正确更新。我想不出删除它们的方法!
我用谷歌搜索了 2 天,但找不到解决方案。我正在使用函数式风格的 React,这让事情变得更加复杂,因为每条建议似乎都是经典风格。
如果有帮助的话,我也在使用 react-chartjs-2 包装器。
我对反应也很陌生,并在 Whosebug 中询问,所以请让我松懈 :)
我假设图表正在重新渲染或其他原因,因为行数等确实发生了变化。
在图像中,console.log 中显示的“createYaxis”是生成的 yAxes- 选项对象的一部分(否则它是功能性的)。问题 y 轴位于红色和黄色的右侧。图片显示前后情况。
img 下面的代码生成的选项对象的图像:
var yAxisItems = [];
function createYaxises (num){
var arr = [];
for (var i=0;i<num.length;i++){
if (i===0){
arr.push({
display: true,
id: i,
type: 'linear',
position: 'left',
gridLines: {
display:false,
//color: 'blue'
},
ticks: {
fontColor: lineColourArray[i],
fontSize: 14,
}
})
}
else {
arr.push({
display: true,
id: i,
type: 'linear',
position: 'right',
gridLines: {
display:false,
//color: 'blue'
},
ticks: {
display:true,
fontColor: lineColourArray[i],
fontSize: 14,
}
})
}}
yAxisItems = arr;
console.log("createyaxis arr: " , arr);
console.log("createyaxis: " , yAxisItems); //JSON.stringify(yAxisItems));
}
//get data for selected sensors and set it to chart data
const handleGetSelectedSensorData = function () {
var d = getSelectedSensorData();
console.log("d: ", d);
var dSets = [];
if (d[0]){
d.map((dItem,index)=> {
var newDsetData =[];
if (dItem.data){
dItem.data.map((innerDataItem)=> {
var dSet = {};
dSet.x = innerDataItem.timestamp;
dSet.y = innerDataItem.v;
newDsetData.push(dSet);
})
var newset = {
data: newDsetData,
label: dItem.sensorTag,
borderColor: lineColourArray[index],
fill: false,
pointRadius: 1.5,
backgroundColor:lineColourArray[index],
borderWidth: 2,
showLine: true,
pointHoverRadius: 5,
lineTension: 1,
};
dSets.push(newset);
}})
var dDataTemp = {};
var optionsTemp = new Object();
dDataTemp.datasets =dSets;
//create yaxises only once
createYaxises(dDataTemp.datasets);
//more than one set (TODO)
//console.log("dDataTemp.datasets : ", dDataTemp.datasets)
if (dDataTemp.datasets.length >1){
console.log("dset > 1");
for(var i=0;i< dDataTemp.datasets.length;i++) {
dDataTemp.datasets[i].yAxisID = i;
console.log("setting options");
optionsTemp ={
tooltips: {
enabled: true,
intersect:false,
mode:'x',
callbacks: {
title: function(tooltipItem, data) {
var toSplit = tooltipItem[0].label.split(",");
return (toSplit[0]);
},
label: function (tooltipItem) {
var split = tooltipItem.xLabel.split(',');
//return ( Number(tooltipItem.yLabel).toFixed(3));
return (split[2] + " : " + Number(tooltipItem.yLabel).toFixed(3));
}
},
},
hover: {
mode: 'nearest',
intersect: true,
},
title:{
display:true,
text:'Valittu sensoridata',
fontSize:20
},
legend:{
display:true,
position:'right'
},
scales: {
xAxes: [{
display: true,
type: 'time',
ticks: {
}
}],
yAxes:
yAxisItems
}
}
}
setOptions(optionsTemp);
console.log("options: " , optionsTemp);
setdData(dDataTemp);
}}
else {
console.log("error in handleGetSelectedSensorData()");
}
}
并且这条线是这样添加的:
<Line data={dData} options = {options} />
而不是设置 display: true
设置 display: 'auto'
,这将使轴消失,只要没有链接到该比例尺的可见数据集,一旦数据集变得可见,即链接到该比例,它将再次显示比例。
文档:https://www.chartjs.org/docs/master/axes/cartesian/#common-options-to-all-axes
当我绘制一个包含 4 条线的图表时,每条线都有自己的数据 ofc,我以编程方式为具有 4 个 Y 轴的折线图创建选项,第一个在左侧,其余在右侧。现在,绘制图表后,我从列表中删除 select 一些数据源(绘制的线条更少),现在过时的 yAxis 刻度保留在那里,即使图表正确地仅绘制了 select ed 行,选项也会正确更新。我想不出删除它们的方法!
我用谷歌搜索了 2 天,但找不到解决方案。我正在使用函数式风格的 React,这让事情变得更加复杂,因为每条建议似乎都是经典风格。 如果有帮助的话,我也在使用 react-chartjs-2 包装器。 我对反应也很陌生,并在 Whosebug 中询问,所以请让我松懈 :) 我假设图表正在重新渲染或其他原因,因为行数等确实发生了变化。
在图像中,console.log 中显示的“createYaxis”是生成的 yAxes- 选项对象的一部分(否则它是功能性的)。问题 y 轴位于红色和黄色的右侧。图片显示前后情况。
img 下面的代码生成的选项对象的图像:
var yAxisItems = [];
function createYaxises (num){
var arr = [];
for (var i=0;i<num.length;i++){
if (i===0){
arr.push({
display: true,
id: i,
type: 'linear',
position: 'left',
gridLines: {
display:false,
//color: 'blue'
},
ticks: {
fontColor: lineColourArray[i],
fontSize: 14,
}
})
}
else {
arr.push({
display: true,
id: i,
type: 'linear',
position: 'right',
gridLines: {
display:false,
//color: 'blue'
},
ticks: {
display:true,
fontColor: lineColourArray[i],
fontSize: 14,
}
})
}}
yAxisItems = arr;
console.log("createyaxis arr: " , arr);
console.log("createyaxis: " , yAxisItems); //JSON.stringify(yAxisItems));
}
//get data for selected sensors and set it to chart data
const handleGetSelectedSensorData = function () {
var d = getSelectedSensorData();
console.log("d: ", d);
var dSets = [];
if (d[0]){
d.map((dItem,index)=> {
var newDsetData =[];
if (dItem.data){
dItem.data.map((innerDataItem)=> {
var dSet = {};
dSet.x = innerDataItem.timestamp;
dSet.y = innerDataItem.v;
newDsetData.push(dSet);
})
var newset = {
data: newDsetData,
label: dItem.sensorTag,
borderColor: lineColourArray[index],
fill: false,
pointRadius: 1.5,
backgroundColor:lineColourArray[index],
borderWidth: 2,
showLine: true,
pointHoverRadius: 5,
lineTension: 1,
};
dSets.push(newset);
}})
var dDataTemp = {};
var optionsTemp = new Object();
dDataTemp.datasets =dSets;
//create yaxises only once
createYaxises(dDataTemp.datasets);
//more than one set (TODO)
//console.log("dDataTemp.datasets : ", dDataTemp.datasets)
if (dDataTemp.datasets.length >1){
console.log("dset > 1");
for(var i=0;i< dDataTemp.datasets.length;i++) {
dDataTemp.datasets[i].yAxisID = i;
console.log("setting options");
optionsTemp ={
tooltips: {
enabled: true,
intersect:false,
mode:'x',
callbacks: {
title: function(tooltipItem, data) {
var toSplit = tooltipItem[0].label.split(",");
return (toSplit[0]);
},
label: function (tooltipItem) {
var split = tooltipItem.xLabel.split(',');
//return ( Number(tooltipItem.yLabel).toFixed(3));
return (split[2] + " : " + Number(tooltipItem.yLabel).toFixed(3));
}
},
},
hover: {
mode: 'nearest',
intersect: true,
},
title:{
display:true,
text:'Valittu sensoridata',
fontSize:20
},
legend:{
display:true,
position:'right'
},
scales: {
xAxes: [{
display: true,
type: 'time',
ticks: {
}
}],
yAxes:
yAxisItems
}
}
}
setOptions(optionsTemp);
console.log("options: " , optionsTemp);
setdData(dDataTemp);
}}
else {
console.log("error in handleGetSelectedSensorData()");
}
}
并且这条线是这样添加的:
<Line data={dData} options = {options} />
而不是设置 display: true
设置 display: 'auto'
,这将使轴消失,只要没有链接到该比例尺的可见数据集,一旦数据集变得可见,即链接到该比例,它将再次显示比例。
文档:https://www.chartjs.org/docs/master/axes/cartesian/#common-options-to-all-axes