get_bdm_chart = async function(data, spread_dimension, dst_def) {
vl.vega.formatLocale(locale);
vl.vega.timeFormatLocale(locale);
let idbank_row =
idbanks_list[viewof selected_idbank.querySelector('select').selectedIndex];
let zoom_ckb = viewof chart_zoom;
if (idbank_row.zoom && !chart_zoom[0]) {
zoom_ckb.value = [1];
zoom_ckb.dispatchEvent(new Event("input"));
zoom_ckb.querySelector('input').setAttribute('disabled', 'disabled');
return;
}
if (!idbank_row.zoom)
zoom_ckb.querySelector('input').removeAttribute('disabled');
let yscale = chart_zoom[0] == 1 ? { zero: false } : {};
let cl_tb,
cl_eclat_map,
fmt_eclat,
lib_eclat,
isOrigin = vl.selectPoint('isOrigin');
if (spread_dimension) {
cl_tb = codelist_map.get(dst_def.indic_to_codelist.get(spread_dimension));
(fmt_eclat = id =>
cl_tb
.params({ id })
.filter(d => d.id == id)
.get('lib')
.split(', ')),
(lib_eclat = codelist_lib_map
.get(dst_def.indic_to_codelist.get(spread_dimension))
.split(' ')
.filter(d => d.trim() != ''));
if (lib_eclat.length > 2)
lib_eclat = [lib_eclat.slice(0, lib_eclat.length / 2).join(' ')].concat(
lib_eclat.slice(lib_eclat.length / 2).join(' ')
);
isOrigin = vl
.selectPoint('isOrigin')
.fields(spread_dimension)
.bind('legend');
}
if (fmt_eclat) vl.vega.expressionFunction('fmt_eclat', fmt_eclat);
let title = data.extrait_title.split('-').filter(d => d.trim() != '');
if (title.length > 2)
title = [title.slice(0, title.length / 2).join(' - ')].concat(
title.slice(title.length / 2).join(' - ')
);
let source = ['Source : Insee BDM', data.unite_str.substring(2)];
if (source[1].trim() == '') source.pop();
if (width > 600) source = source.join(' - ');
aq.addFunction('convert_to_date', convert_to_date, { override: true });
let dt = data.tb.derive({ t: d => op.convert_to_date(d.TIME_PERIOD) });
let plage_an = d3.extent(dt.array('t'), d => d.getFullYear()),
delta_an = plage_an[1] - plage_an[0];
let label_fn = function(v) {
if (v.getMonth() == 11) return v.getFullYear() + 1;
if ((v.getMonth() + 1) % 6 == 0 && delta_an <= 15 && width > 500)
return v.toLocaleString('fr', { month: 'short' });
if ((v.getMonth() + 1) % 3 == 0 && delta_an <= 8 && width > 500)
return v.toLocaleString('fr', { month: 'short' });
return '';
};
vl.vega.expressionFunction('periodicite', () =>
delta_an > 15 || width < 500 ? 12 : 3
);
vl.vega.expressionFunction('label_fn', label_fn);
let period = 'infra_an';
let x = vl
.x()
.fieldT('t')
.axis({
labelAngle: 0,
labelOverlap: true,
labelFlush: false,
tickCount: { interval: "month", step: 1 },
gridColor: {
expr:
"timeFormat(datum.value, '%m') % periodicite() == 0 ? '#eee' : '#fff'"
},
tickOpacity: { expr: "label_fn(datum.value) != '' ? 1 : 0" },
gridDash: { expr: "timeFormat(datum.value, '%m') == '12' ? [] : [2,2]" },
labelExpr: "label_fn(datum.value)"
});
if (parseInt(dt.get('TIME_PERIOD')) == dt.get('TIME_PERIOD')) {
period = 'an';
x = vl
.x()
.fieldT('t')
.axis({
labelAngle: 0,
labelOverlap: true,
grid: true,
gridColor: {
expr: "timeFormat(datum.value, '%m') == '01' ? '#eee' : null"
},
tickColor: {
expr: "timeFormat(datum.value, '%m') == '01' ? '#ccc' : null"
},
labelColor: {
expr: "timeFormat(datum.value, '%m') == '01' ? 'black' : null"
}
});
}
let c = vl.color();
if (spread_dimension) {
let cx = vl
.color()
.fieldN(spread_dimension)
.scale({
range: [
'#f4b84d',
'#1e9b9e',
'firebrick',
'steelblue',
'#AD7AA1',
'hotpink',
'olivedrab'
]
})
.legend({
title: lib_eclat,
titleAnchor: 'middle',
symbolStrokeWidth: 3,
symbolSize: 400,
labelLimit: width < 500 ? 150 : 300,
orient: width < 500 ? 'bottom' : 'right',
columns: width < 500 ? 2 : 1,
labelFontSize: 11,
labelExpr: "fmt_eclat(datum.value)"
});
if (idbank_row.sort) cx = cx.sort("-y");
c = c.if(isOrigin, cx).value('#ccc');
}
let y0 = idbank_row.y0;
let y_rule = idbank_row.hasOwnProperty('y0')
? vl.markRule({ size: 1, color: '#aaa' }).encode(vl.y().datum(y0))
: null;
let layers = [
vl
.markLine({
point:
data.tb.dedupe('TIME_PERIOD').numRows() < 20 &&
data.tb.dedupe('TIME_PERIOD').numRows() > 10,
interpolate: 'monotone',
size: 2,
color: '#1e9b9e'
})
.params(isOrigin)
.encode(
x.title(null),
vl
.y()
.fieldQ('OBS_VALUE')
.title(null)
.scale(yscale)
.axis({ grid: true }),
c,
vl
.opacity()
.if(isOrigin, vl.value(1.0))
.value(0.4),
vl.tooltip([
vl
.tooltip()
.fieldT('t')
.title('période ')
.format(period == 'an' ? '%Y' : '%m-%Y'),
vl
.tooltip()
.fieldQ('OBS_VALUE')
.format(',')
.title('valeur ')
])
)
];
if (y_rule) layers.unshift(y_rule);
return vl
.layer(layers)
.data(dt)
.title({
anchor: width < 500 ? 'start' : 'middle',
subtitlePadding: 10,
text: title,
subtitle: source,
limit: width
})
.width(width)
.autosize({
type: "fit",
contains: "padding"
})
.height(350)
.render({ renderer: 'svg' });
}