On June 30, on the 493rd day of a Russian “special operation” which was only supposed to last a week or two, Kiev announced that the Ukrainian armed forces had liberated around 200 km2 since the start of their counter-offensive.
But at a time when the initiative is Ukrainian on an almost fixed front, the figures confirm what the maps have been saying for many long months already: in Ukraine, the area controlled by Moscow is stagnating, even after the capture of the devastated city of Bakhmout, in May 2023.
After making slow progress for several weeks, and despite the offensives announced by the Russian general staff in the spring, Moscow only controlled 17.5% of Ukrainian territory at the end of June. At the height of its advance, in March 2022, it occupied just over a quarter.
The slow decline of the territory occupied by Moscow
This graph represents, from January 2022 to today, the proportion of the 603,550 km² of Ukrainian territory occupied by Russia and that still controlled by kyiv.
Controlled by Kyiv
Occupied by Moscow
…before February 2022
“;
html += “”;
html += “
Controlled by Ukraine: ” + String(d.ukraine).replace(“.”, “,”) + ” % i.e. ” + kmSquares(d.ukraine) + “
“; // liberation of territories since March 2022 if (i > 2) { html += “
Of which released since March 2022: ” + String(d.liberation).replace(“.”, “,”) + ” %, i.e. ” + kmCarres(d.liberation) + “
”
}
html += “
Occupied by Russia: ” + String(d.russia).replace(“.”, “,”) + ” %+ ” + String(d.beforeFeb2022).replace(“.”, “,”) + ” % = ” + String((d.beforeFeb2022 + d.russia).round(2)).replace(“.”, “,”) + ” %, i.e. ” + kmSquares(d.russia + d.beforeFeb2022) + “
“;
return html;
})
.on(“mouseover”, function(d) {
numMois = “m” + d.mois;
barresUA.selectAll(“.barre_typo.” + numMois)
.style(“fill-opacity”, 1);
})
.on(“mouseout”, function(d) {
barresUA.selectAll(“.barre_typo”)
.style(“fill-opacity”, .7);
});
axesUA.append(“g”)
.attr(“class”, “axes y passelect”)
.attr(“transform”, “translate(10,-8)”)
.call(d3.axisLeft(y).tickValues(valeursUA).tickSizeOuter(0).tickFormat((d, i) => (i > 0) ? String(d).replace(“.”, “,”) + ” %” : “”));
axesUA.append(“g”)
.attr(“transform”, “translate(0,” + height + “)”)
.attr(“class”, “axes x passelect”)
.call(d3.axisBottom(x).tickFormat(
function(d, i) {
rabeAnnee = “”;
if (d.split(“-“)[0] != anneEnCours) { anneEnCours = d.split(“-“)[0];
rabeAnnee = ” ” + d.split(“-“)[0].slice(2, 4);
}
numMois = +d.split(“-“)[1] – 1;
if (!mobileDec) {
return dicoMoisCourt[numMois] + rabeAnnee;
} else {
if (i % 2 == 0) {
return dicoMoisCourt[numMois] + rabeAnnee;
}
}
}
));
grilleUA.append(“g”)
.attr(“class”, “grid”)
.call(make_y_gridlines()
.tickSizeOuter(tailleTicksUA)
.tickSize(-width)
.tickFormat(“”)
);
// On modifie les ticks des abscisses
axesUA.selectAll(“.axes.x .tick line”)
.attr(“transform”, “translate(” + (((x.bandwidth() + .1) / 2) + ((mobileDec) ? 0 : -0.5)) + “,0)”)
.style(“display”, function(d, i) {
if (i == data.length – 1) {
return “none”;
}
});
function make_tooltip_brt(selector, func) {
let tt_barres_elmts = getA(selector);
forEach(tt_barres_elmts, function(elmt) {
elmt.addEventListener(‘mouseover’, function() {
let tt_barres = document.createElement(‘div’);
tt_barres.classList.add(“tooltipdecodeurs”)
tt_barres.innerHTML = (typeof func === ‘undefined’ ? this.getAttribute(‘data-tt’) : func(this.getAttribute(‘data-tt’))) + “;
document.body.appendChild(tt_barres);
tt_barres.style.top = this.getBoundingClientRect().top – 14 + window.scrollY – tt_barres.offsetHeight + ‘px’;
tt_barres.style.left = this.getBoundingClientRect().left + this.getBoundingClientRect().width / 2 – tt_barres.getBoundingClientRect().width / 2 + ‘px’;
tt_barres.addEventListener(‘click’, () => this.remove());
})
elmt.addEventListener(‘mouseout’, function() {
let tt_barres = document.querySelector(‘.tooltipdecodeurs’);
if (tt_barres != null)
tt_barres.remove()
})
})
}
make_tooltip_brt(“#graphique .barre_typo_transparent”);
La série “In one graph” Decoders illuminates the news in visual form. Find all the articles in our section.