Ho riscontrato un problema con le etichette assegnate ai valori del mio grafico.c3js> Timeseries x valori non equidistanti
Il grafico è un numero temporale. Aggiungo valori usando la proprietà 'columns' di c3js.
Io uso timestamp puri (in secondi) e quindi li converto in stringhe usando label.format.
Tuttavia, questo è ciò che accade:
https://drive.google.com/file/d/0B9GDftIYQFIVb2Z3N2JfS2pzVjg/view?usp=sharing
, come si può notare lo spazio non è uniformemente distribuita, tra 18-21, 25-28 Ottobre e 1-4, 4-7 novembre solo due giorni mentre tutti gli altri hanno tre giorni tra le date.
Che cosa sta causando questo?
Mi piacerebbe avere spazi vuoti equidistanti (stesso numero di giorni).
Qui è un jfiddle con il codice: http://jsfiddle.net/ok1k6yjo/
var array_times = [1414540800, 1414627200];
var array_values = [67, 66.22];
var labelWeight = 'weight in kg';
var window_period = (30 * 24 * 3600); // last 30 days
var today = Math.floor(new Date(2014,10,20,0,0,0,0).getTime()/1000);
var timeEnd = today;
var timeStart = today - window_period;
var toShowTime = [1414540800, 1414627200];
var toShowValues = [67, 66.22];
var minT = Math.min.apply(null, array_times),
maxT = Math.max.apply(null, array_times.concat(today));
var minV = Math.min.apply(null, array_values),
maxV = Math.max.apply(null, array_values);
function dateToString(e) {
var date = new Date(e * 1000);
return date.toDateString().substring(4);
}
var chart = c3.generate({
bindto: '#chart',
data: {
x: 'times',
columns: [
['times'].concat(toShowTime),
[labelWeight].concat(toShowValues)],
labels: {
format: {
y: d3.format('.2')
}
},
type: 'scatter'
},
point: {
r: 6
},
legend: {
show: false
},
grid: {
x: {
show: true
},
y: {
show: true
}
},
axis: {
x: {
label: {
text: 'Time [days]'
},
type: 'timeseries',
tick: {
fit: false,
//count: 29,
rotate: -75,
multiline: false,
format: function (e, d) {
return dateToString(e);
}
},
height: 100
},
y: {
label: {
text: 'Weight [kg]',
position: 'outer',
min: minV - 10,
max: maxV + 10
},
tick: {
format: function (e, d) {
return parseFloat(e).toFixed(2);
}
},
}
}
});
chart.axis.range({min: {x:timeStart, y:minV-10}, max: {x:timeEnd, y:maxV+10}});
La lieve differenza è dovuta ad una diversa data di avvio.
Ecco un altro violino con problemi simili. http://jsfiddle.net/hfznh45w/5/
var d = (24 * 3600); // last 30 days
//var array_times = [1414540800-8*d, 1414540800-d, 1414540800, 1414627200, 1414627200 + d, 1414627200 + 2 * d, 1414627200 + 3 * d];
//var array_values = [61, 60, 67, 66.22, 68, 68, 68];
var array_times = [];
var array_values = [];
for (var i = -8; i < 30; i++) {
array_times.push(1414540800 + (i * d));
array_values.push(60 + i);
}
console.log(array_times);
console.log(array_values);
var labelWeight = 'weight in kg';
var window_period = (30 * 24 * 3600); // last 30 days
var today = Math.floor(new Date(2014, 10, 20, 0, 0, 0, 0).getTime()/1000);
var timeEnd = today;
var timeStart = today - window_period;
var minT = Math.min.apply(null, array_times),
maxT = Math.max.apply(null, array_times.concat(today));
var minV = Math.min.apply(null, array_values),
maxV = Math.max.apply(null, array_values);
function dateToString(e) {
var date = new Date(e * 1000);
return date.toDateString().substring(4);
}
var chart = c3.generate({
bindto: '#chart',
data: {
x: 'times',
columns: [
['times'].concat(array_times), [labelWeight].concat(array_values)],
labels: {
format: {
y: d3.format('.2')
}
},
type: 'scatter'
},
point: {
r: 6
},
legend: {
show: false
},
grid: {
x: {
show: true
},
y: {
show: true
}
},
axis: {
x: {
padding: {
left: 0,
right: 0,
},
label: {
text: 'Time [days]'
},
type: 'timeseries',
tick: {
fit: false,
rotate: -75,
multiline: false,
format: function (e, d) {
return dateToString(e);
}
},
height: 100
},
y: {
padding: {
top: 0,
bottom: 0
},
label: {
text: 'Weight [kg]',
position: 'outer',
min: minV - 10,
max: maxV + 10
},
tick: {
format: function (e, d) {
return parseFloat(e).toFixed(2);
}
}
}
}
});
chart.axis.range({
min: {
x: timeStart,
y: minV - 10
},
max: {
x: timeEnd,
y: maxV + 10
}
});
Qualsiasi indizio/correzione è più che benvenuto. Grazie!
Avete bisogno di mantenere l'asse x in timeseries? Chiamare le etichette sull'asse x singolarmente sarebbe un'opzione? – JasTonAChair
Se si intende mantenere una corrispondenza tra i dati tracciati e l'etichetta dell'asse x corrispondente: non ne ho bisogno e, in generale, per un timeseries, nessuno ne ha bisogno. Il comportamento di c3js per gli orari sembra un po 'strano. – 2dvisio