From a837d89c980c7e47189f8d0a7ceb7f894ed63e1d Mon Sep 17 00:00:00 2001 From: Jaro Habiger Date: Mon, 4 Sep 2023 04:44:15 +0200 Subject: [PATCH] add csu variant to timeseries plots --- src/ElectionCharts.tsx | 136 ++++++++++++++++++++++++++++++++++++----- src/essay.mdx | 10 +++ 2 files changed, 131 insertions(+), 15 deletions(-) diff --git a/src/ElectionCharts.tsx b/src/ElectionCharts.tsx index 08fa23b..0dd0a09 100644 --- a/src/ElectionCharts.tsx +++ b/src/ElectionCharts.tsx @@ -183,9 +183,8 @@ export function WahlDiffSelectable() { } export function ParlamentGröße() { - const years = electionsYears.filter((y) => Number.isFinite(y)); const series = Object.entries(electionMethods).map(([methodName, method]) => { - const data = years.map((year) => { + const data = electionsYears.map((year) => { const electionData = getElectionData(year); const ctx: CalculationContext = { ...electionData, @@ -207,18 +206,28 @@ export function ParlamentGröße() { return ( v.toString(), dataKey: 'jahr' }]} + xAxis={[ + { + data: electionsYears.map((y) => (y == '2021 CSU Sperrklausel' ? 2025 : y)), + valueFormatter: (v) => (v == 2025 ? '2021 CSU Sperrklausel' : v.toString()), + dataKey: 'jahr', + }, + ]} series={series} height={500} + sx={{ + '.MuiMarkElement-root': { + scale: '0.6', + strokeWidth: 2, + }, + }} /> ); } export function ParteienZweitstimmen() { const parteien = mapRecord(partyColors, (_, party) => [] as number[]); - const years = electionsYears.filter((y) => Number.isFinite(y)); - - years.forEach((year) => { + electionsYears.forEach((year) => { const electionData = getElectionData(year); Object.entries(parteien).forEach(([partei, results]) => { results.push( @@ -241,9 +250,21 @@ export function ParteienZweitstimmen() { return ( v.toString(), dataKey: 'jahr' }]} + xAxis={[ + { + data: electionsYears.map((y) => (y == '2021 CSU Sperrklausel' ? 2025 : y)), + valueFormatter: (v) => (v == 2025 ? '2021 CSU Sperrklausel' : v.toString()), + dataKey: 'jahr', + }, + ]} series={series} height={500} + sx={{ + '.MuiMarkElement-root': { + scale: '0.6', + strokeWidth: 2, + }, + }} /> ); } @@ -260,9 +281,7 @@ export function ÜberhangMandate() { ); const parteien = mapRecord(partyColors, (_, party) => [] as number[]); - const years = electionsYears.filter((y) => Number.isFinite(y)); - - years.forEach((year) => { + electionsYears.forEach((year) => { const electionData = getElectionData(year); const ctx: CalculationContext = { ...electionData, @@ -287,9 +306,21 @@ export function ÜberhangMandate() { return ( <> v.toString(), dataKey: 'jahr' }]} + xAxis={[ + { + data: electionsYears.map((y) => (y == '2021 CSU Sperrklausel' ? 2025 : y)), + valueFormatter: (v) => (v == 2025 ? '2021 CSU Sperrklausel' : v.toString()), + dataKey: 'jahr', + }, + ]} series={series} height={500} + sx={{ + '.MuiMarkElement-root': { + scale: '0.6', + strokeWidth: 2, + }, + }} />
@@ -307,9 +338,7 @@ export function ÜberhangMandateTotal() { }; const methodResults = mapRecord(methods, () => [] as number[]); - const years = electionsYears.filter((y) => Number.isFinite(y)); - - years.forEach((year) => { + electionsYears.forEach((year) => { const electionData = getElectionData(year); Object.entries(methods).forEach(([methodName, method]) => { const ctx: CalculationContext = { @@ -332,9 +361,86 @@ export function ÜberhangMandateTotal() { return ( v.toString(), dataKey: 'jahr' }]} + xAxis={[ + { + data: electionsYears.map((y) => (y == '2021 CSU Sperrklausel' ? 2025 : y)), + valueFormatter: (v) => (v == 2025 ? '2021 CSU Sperrklausel' : v.toString()), + dataKey: 'jahr', + }, + ]} series={series} height={500} + sx={{ + '.MuiMarkElement-root': { + scale: '0.6', + strokeWidth: 2, + }, + }} /> ); } + +export function AnteilVergleich() { + const methodA = useRecordSelectState(electionMethods, '2020'); + const methodB = useRecordSelectState(electionMethods, '2023'); + + const parteien = mapRecord(partyColors, (_, party) => [] as number[]); + electionsYears.forEach((year) => { + const electionData = getElectionData(year); + const ctx: CalculationContext = { + ...electionData, + apportionmentMethod: sainteLaguë, + sitze: electionData.kerg.wahlkreise.length * 2, + warnings: [], + }; + const resultA = methodA.state(ctx); + const sitzeA = ctx.sitze; + + ctx.sitze = electionData.kerg.wahlkreise.length * 2; + const resultB = methodB.state(ctx); + const sitzeB = ctx.sitze; + + Object.entries(parteien).forEach(([partei, results]) => { + results.push( + ((resultB[partei]?.sitze || 0) / sitzeB) * 100 - + ((resultA[partei]?.sitze || 0) / sitzeA) * 100 + ); + }); + }); + + const series = Object.entries(parteien).map(([partei, results]) => ({ + type: 'line' as 'line', + data: results, + label: partei, + curve: 'linear' as 'linear', + color: partyColors[partei as keyof typeof partyColors], + valueFormatter: (v: number) => `${v.toFixed(2)}%`, + })); + + return ( + <> + (y == '2021 CSU Sperrklausel' ? 2025 : y)), + valueFormatter: (v) => (v == 2025 ? '2021\n CSU Sperrklausel' : v.toString()), + dataKey: 'jahr', + }, + ]} + series={series} + height={500} + sx={{ + '.MuiMarkElement-root': { + scale: '0.6', + strokeWidth: 2, + }, + }} + tooltip={} + /> +
+ + +
+ + ); +} diff --git a/src/essay.mdx b/src/essay.mdx index dc9edef..c1160eb 100644 --- a/src/essay.mdx +++ b/src/essay.mdx @@ -7,6 +7,7 @@ import { ParteienZweitstimmen, ÜberhangMandate, ÜberhangMandateTotal, + AnteilVergleich, } from './ElectionCharts'; import { election2020 } from './calculate_election'; @@ -111,6 +112,15 @@ Tatsächlich interessant wird dieses aufwändige nachrechnen von Wahlen allerdin <ÜberhangMandateTotal /> +
+ + Unausgeglichene Überhangmandate. Da sich die Wahlsysteme von 2011, 2013 und 2020 hauptsächlich + im Ausgleich der Überhangmandateunterscheiden, ist die Betrachtung von 2011 die interessanteste + für die ursächliche Bestimmung der Überhangmandate dieser Wahlsysteme. + + +
+