viewFull = view({
search: "Bad Ischl",
range: null,
showMap: true,
showRank: true,
showHist: true,
data: data,
tooltip: true,
mapText: true,
mainColors: colors,
mapLegend: false,
selectMenu: true,
})
viewFull.render({renderer: "svg"})
Lebenssituationsindex
config = ({
background: "transparent", // "#f1f1f1"
view: { stroke: null },
font: "Century Gothic", // "FFDaxPro"
axis: {
labelFontSize: 14,
titleFontSize: 14,
titleFontWeight: "normal",
},
legend: {
labelFontSize: 14,
titleFontSize: 14,
titleFontWeight: "normal",
},
mark: {
fontSize: 14
},
title: {
fontSize: 16,
subtitleFontSize: 14,
},
concat: { spacing: 10 },
locale: {number: {
decimal: ",",
thousands: ".",
format: ",.0f",
grouping: [3]
}},
padding: {left: 5, top: 5, right: 5, bottom: 5}
})
colors = [
"#2d76b3",
"#559bd5",
"#99c4e6",
"#bbd7ee",
"#ddebf7",
"#e3f1e2",
"#c7e3c6",
"#abd6a9",
"#72bb6f",
"#4b9847"
]
colors_change = [
"#3c6f4b",
"#5f936e",
"#9fc4a6",
"#c0d9c2",
"#e0eee0",
"#f5e9dc",
"#e2c9ab",
"#d0a977",
"#b48447",
"#94672d"
].reverse()
colors_change_old = [
"#166298",
"#12a7e7",
"#5bc1ed",
"#9ddcf2",
"#c7ecf6",
"#f1f4d4",
"#f8e7a1",
"#f5d85e",
"#f3d039",
"#c49b18"
]
colors_discrete = [
// "#559bd5",
"#559e8f",
"#f3d039",
// "#72bb6f",
// "#c3423f",
"#12a7e7",
"#96b428",
]
colors_discrete_gray = [
"gray",
"gray",
"gray",
"gray",
]
makeWidth = function(inputWidth) {
if (inputWidth>1800) {
return 1200
}
if (inputWidth>1700) {
return 1100
}
if (inputWidth>1600) {
return 1000
}
if (inputWidth>1500) {
return 900
}
if (inputWidth>1400) {
return 900
}
if (inputWidth>1200) {
return 800
}
if (inputWidth>1000) {
return 700
}
if (inputWidth>800) {
return 700
}
else {
return 360
}
}
germanLocale = d3.formatLocale({
decimal: ",", // Decimal separator
thousands: "", // Thousands separator
grouping: [3], // Grouping for thousands
currency: ["€", ""], // Currency format (optional)
})
dataRaw = FileAttachment("data/data.csv").csv({ })
gemeinden = FileAttachment("data/gemeinden.json").json()
bundesländer = FileAttachment("data/bundesländer.json").json()
projection = vl.projection("identity")
.reflectY(true)
Indicators = [
"Kaufkraft",
"Erwerbsintegration",
"Bevölkerungsstruktur",
"Bildungsstruktur",
"Lebenssituationsindex"
]
button = "quantile"
dataTransformed = aq
.from(dataRaw)
.groupby(["indicator", "unit"])
.orderby(aq.desc("2023"))
.derive({
rank_2023: op.rank(),
// decile_2023: op.ntile(10),
// percent_rank_2023: op.percent_rank(),
})
.orderby(aq.desc("2013"))
.derive({
rank_2013: op.rank(),
// decile_2013: op.ntile(10),
// percent_rank_2013: op.percent_rank(),
})
.ungroup()
.derive({
change_abs: d => (d["2023"]-d["2013"]),
change_rel: d => (d["2023"]-d["2013"])/d["2013"],
change_rank: d => d.rank_2023 - d.rank_2013,
})
.derive({
// percent_rank_2023: d => 1 - d.percent_rank_2023,
// percent_rank_2013: d => 1 - d.percent_rank_2013,
text_1: d => d.Gemeinde, // + ", Rang: " + d.rank_2023,
text_2: d => "Rang⠀⠀⠀⠀⠀⠀⠀/ 2115",
text_3: d => d.rank_2023,
text_4: aq.escape(d => germanLocale.format("+,.0~f")(-d.change_rank) + " Plätze"),
text_5: aq.escape(d => germanLocale.format(",.0~%")(d.change_abs)),
text_detail_1: aq.escape(d => germanLocale.format(",.1f")(d["2023"]) + " (" + germanLocale.format("+,.1f")(d["change_abs"]) + ")"),
})
.orderby(["Gemeinde", "indicator"])
.objects()
data = dataTransformed
.filter(d => d.indicator == "Lebenssituationsindex")
dataDetail = dataTransformed
.filter(d => Indicators.includes(d.indicator))
.filter(d => d.unit == "Index")
geoDataGemeinden = vl.topojson(gemeinden)
.feature("STATISTIK_AUSTRIA_GEM_20220101")
geoDataBundesländer = vl.topojson(bundesländer)
.feature("STATISTIK_AUSTRIA_NUTS2_20160101")
view = function(inputArgument) {
const emptyChart = vl.markRule().encode(vl.opacity().value(0));
const select = vl.selectPoint("select")
.fields("Gemeinde")
.on("click")
.value(inputArgument.search)
.bind(
inputArgument.selectMenu ?
vl.menu(inputArgument.data.map(d => d.Gemeinde)).name(null) :
null
)
.clear(false)
.nearest(false);
const selectRange = vl.selectInterval("selectRange")
.clear(false)
.encodings("x")
.value(inputArgument.range); // .value({x: [7, 9], y: [0, 10]})
const foreign = vl.data(inputArgument.data)
.key("gkz")
.fields(
"gkz",
"Gemeinde",
"indicator",
"unit",
"rank_2023",
"2023",
"2013",
"opacity",
);
const map = vl.markGeoshape({
stroke: "white",
strokeWidth: 0.3,
clip: false
})
.params(select)
.transform(
vl.lookup("id").from(foreign),
)
.encode(
vl.color()
.value("lightgray")
.if(
selectRange,
vl.color()
.fieldQ("2023")
.scale({
range: inputArgument.mainColors,
// domain: inputArgument.colorDomain,
type: inputArgument.mapLegend ? button : button,
})
.legend(
inputArgument.mapLegend ?
{
orient: width > 800 ? "none" : "top",
legendX: 120,
legendY: 50,
direction: "horizontal",
title: null,
format: "+,.0%",
// gradientHorizontalMinLength: 200,
// gradientHorizontalMaxLength: 400,
// gradientLength: 300,
values: [-0.05, 0.05, 0.1, 0.15, 0.2, 0.25],
} :
null
),
),
vl.opacity()
.fieldN("opacity")
.legend(null)
.scale({
domain: [false, true],
range: [0, 1]
})
);
const mapTooltip = vl.markGeoshape({
fill: "transparent",
clip: true,
stroke: "transparent",
strokeWidth: 0,
})
.transform(
vl.lookup("id").from(foreign),
)
.encode(
vl.tooltip([
{field: "Gemeinde", title: "Gemeinde"},
{field: "2023", type: "quantitative", title: "Lebenssituationsindex", format: ",.1f"}
]),
);
const mapSelectStroke = vl.markGeoshape({
fill: "transparent",
clip: true,
})
.transform(
vl.lookup("id").from(foreign),
vl.filter(select),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.stroke()
.if(select, vl.value("black")) // #c3423f
.value("transparent"),
vl.strokeWidth()
.if(select, vl.value(1.2))
.value(0),
);
const mapTextGemeinde = vl.markText({
fontSize: 18,
stroke: "black",
strokeWidth: 0.15,
clip: true,
align: "right",
dx: 3,
})
.transform(
vl.lookup("id").from(foreign),
vl.filter(select),
vl.calculate("datum.Gemeinde + '⤵'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
);
const mapTextGemeindeWhite = vl.markText({
fontSize: 18,
stroke: "white",
clip: true,
align: "right",
dx: 3,
strokeWidth: 2,
})
.transform(
vl.lookup("id").from(foreign),
vl.filter(select),
vl.calculate("datum.Gemeinde + '⤵'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
);
const background = vl.markGeoshape({
stroke: "black",
strokeWidth: 3,
fill: "transparent",
});
const backgroundGray = vl.markGeoshape({
stroke: "white",
strokeWidth: 0.5,
fill: "lightgray",
});
// const mapText1 = vl.markText({
// color: "black",
// fontSize: 16,
// align: "left",
// x: 209,
// y: 200,
// dy: -185,
// baseline: "bottom",
// })
// .transform(
// vl.filter(select),
// vl.window([{ op: "rank", as: "rank" }]),
// vl.filter("datum.rank == 1"),
// )
// .encode(
// vl.y().fieldN("text_1").axis(null),
// vl.text().fieldN("text_1"),
// ).data(inputArgument.data)
const mapText2 = vl.markText({
color: "black",
fontSize: 14,
align: "left",
x: 209,
y: 200,
dy: -152,
baseline: "bottom",
})
.transform(
vl.filter(select),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("text_1").axis(null),
vl.text().fieldN("text_2"),
).data(inputArgument.data)
const mapText3 = vl.markText({
color: "black",
fontSize: 24,
align: "right",
x: 305,
y: 200,
dy: -150,
fontWeight: "bold",
baseline: "bottom",
})
.transform(
vl.filter(select),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("text_1").axis(null),
vl.text().fieldN("text_3"),
).data(inputArgument.data)
const mapBl = vl.markGeoshape({
stroke: 'white', // Set the border color for Bundesländer
strokeWidth: 1.2, // Set the border width
fill: null // No fill color, only borders
})
.data(geoDataBundesländer)
.project(projection);
const chartMap = vl.layer(
background,
backgroundGray,
map,
mapBl,
mapSelectStroke,
inputArgument.tooltip ? mapTooltip : emptyChart,
// inputArgument.mapText ? mapText1 : emptyChart,
inputArgument.mapText && width > 800 ? mapText2 : emptyChart,
inputArgument.mapText && width > 800 ? mapText3 : emptyChart,
inputArgument.mapText ? mapTextGemeinde : emptyChart,
)
.data(geoDataGemeinden)
.project(projection);
const chartHistBackground = vl.markBar({
stroke: "black",
strokeWidth: 2.5,
offset: 250,
clip: true,
color: "transparent",
fill: "transparent",
width: {band: 1},
binSpacing: 0,
})
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023"),
vl.y({ aggregate: "count" }),
);
const chartHistBase = vl.markBar({
stroke: "white",
strokeWidth: 0.25,
offset: 250,
clip: true,
opacity: 1,
width: {band: 1},
binSpacing: 0,
})
.params(selectRange)
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023")
.scale({
type: "linear",
domain: [2.5, 9.5]
})
.axis({
orient: "bottom",
title: null,
values: [3, 4, 5, 6, 7, 8, 9],
format: "d"
}),
vl.y({ aggregate: "count" })
.axis({
title: "Anzahl der Gemeinden →",
titleAngle: -90,
domain: false,
ticks: false,
titlePadding: 15,
grid: false,
labels: false,
orient: "right",
titlePadding: -20,
})
.scale({ reverse: false }),
vl.color()
.value("lightgray")
.legend(null)
.if(
selectRange,
vl.color()
.fieldQ("2023")
.scale({
range: inputArgument.mainColors,
type: button,
})
.legend(null)
),
// vl.tooltip([
// {field: "Gemeinde", title: "Gemeinde"},
// {field: "2023", title: "Lebenssituationsindex", format: ",.1f"}
// ]),
);
const chartHistText = vl.markText({
fontSize: 14,
stroke: "black",
strokeWidth: 0.15,
y: 215,
clip: true,
align: "right",
dx: 3,
})
.transform(
vl.filter(select),
vl.calculate("datum.Gemeinde + '⤵'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023"),
vl.text()
.fieldN("text")
);
const chartHistTextWhite = vl.markText({
fontSize: 14,
stroke: "white",
y: 215,
clip: true,
align: "right",
dx: 3,
strokeWidth: 2,
})
.transform(
vl.filter(select),
vl.calculate("datum.Gemeinde + '⤵'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023"),
vl.text()
.fieldN("text")
);
const chartHistTextBetter = vl.markText({
stroke: "black",
fontSize: 13,
strokeWidth: 0.15,
y: 237,
clip: true,
align: "center",
dx: -12,
})
.transform(
vl.filter(select),
vl.calculate("'← schlechter | besser →'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023"),
vl.text()
.fieldN("text")
);
const chartHistTextBetterWhite = vl.markText({
stroke: "white",
fontSize: 13,
strokeWidth: 2,
y: 237,
clip: true,
align: "center",
dx: -12,
})
.transform(
vl.filter(select),
vl.calculate("'← schlechter | besser →'").as("text"),
vl.window([{ op: "rank", as: "rank" }]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.x()
.bin({maxbins: 80})
.fieldQ("2023"),
vl.text()
.fieldN("text")
);
const chartHist = vl.layer(
chartHistBackground,
chartHistBase,
chartHistTextWhite,
chartHistText,
chartHistTextBetterWhite,
chartHistTextBetter,
)
const rankChartMain = vl.markBar({
size: 15,
stroke: "black"
})
.transform(
vl.filter(select),
vl.filter("datum.indicator != 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x()
.fieldQ("2023")
.stack(false)
.axis(null)
.scale({
domain: [-2, 12]
}),
vl.color()
.fieldN("indicator")
.legend(null)
.scale({
range: colors_discrete_gray,
}),
vl.opacity()
.value(0)
.if(
select,
vl.color()
.value(1)
.legend(null)
)
)
.data(dataDetail)
const rankChartMain2 = vl.markBar({
size: 15,
stroke: "black"
})
.transform(
vl.filter(select),
vl.filter("datum.indicator == 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x()
.fieldQ("2023")
.stack(false)
.axis(null)
.scale({
domain: [-2, 12]
}),
vl.color()
.fieldQ("2023")
.legend(null)
.scale({
range: inputArgument.mainColors,
type: button,
}),
vl.opacity()
.value(1)
.legend(null),
)
.data(dataDetail)
const rankChartMainColorScale2 = vl.markBar({
size: 15,
stroke: "black"
})
.transform(
// vl.filter(select),
vl.filter("datum.indicator == 'Lebenssituationsindex'"),
// vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
// vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x()
.fieldQ("2023")
.stack(false)
.axis(null)
.scale({
domain: [-2, 12]
}),
vl.color()
.fieldQ("2023")
.legend(null)
.scale({
range: inputArgument.mainColors,
type: button,
}),
vl.opacity()
.value(0)
.legend(null)
)
.data(dataDetail)
const rankChartGray = vl.markBar({
size: 15,
color: "#f1f1f1", // "#f1f1f1"
})
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x()
.fieldQ("2023")
.axis(null),
)
.data([
{indicator: "Kaufkraft", 2023: 10},
{indicator: "Erwerbsintegration", 2023: 10},
{indicator: "Bevölkerungsstruktur", 2023: 10},
{indicator: "Bildungsstruktur", 2023: 10},
])
const rankChartGray2 = vl.markBar({
size: 15,
color: "#f1f1f1", // "#f1f1f1"
})
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x()
.fieldQ("2023")
.axis(null),
)
.data([
{indicator: "Lebenssituationsindex", 2023: 10},
])
const rankChartText = vl.markText({
fontSize: 14,
dy: 22,
align: "center",
})
.transform(
vl.filter(select),
vl.filter("datum.indicator != 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.text().fieldN("indicator"),
)
.data(dataDetail)
const rankChartText2 = vl.markText({
fontSize: 14,
dy: 22,
align: "center",
})
.transform(
vl.filter(select),
vl.filter("datum.indicator == 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.text().fieldN("indicator"),
)
.data(dataDetail)
const rankChartNumber = vl.markText({
fontSize: 14,
dx: 10,
align: "left",
})
.transform(
vl.filter(select),
vl.filter("datum.indicator != 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x().fieldQ("2023"),
vl.text().fieldN("text_detail_1"),
)
.data(dataDetail)
const rankChartNumber2 = vl.markText({
fontSize: 14,
dx: 10,
align: "left",
})
.transform(
vl.filter(select),
vl.filter("datum.indicator == 'Lebenssituationsindex'"),
vl.window([{ op: "rank", as: "rank" }]).groupby(["indicator"]),
vl.filter("datum.rank == 1"),
)
.encode(
vl.y().fieldN("indicator").axis(null),
vl.x().fieldQ("2023"),
vl.text().fieldN("text_detail_1"),
)
.data(dataDetail)
const rankChart = vl.layer(
rankChartGray,
rankChartMain,
rankChartText,
rankChartNumber,
)
const rankChart2 = vl.layer(
rankChartGray2,
rankChartMainColorScale2,
rankChartMain2,
rankChartText2,
rankChartNumber2,
)
const chart = width > 800 ?
vl.vconcat(
inputArgument.showMap ? chartMap
.height(width > 800 ? 460 : 240)
.width(makeWidth(width) / 1.05) :
emptyChart.params(select),
vl.hconcat(
vl.vconcat(
inputArgument.showRank ? rankChart2
.height(width > 800 ? 50 : 40)
.width(makeWidth(width) / 2.5) :
emptyChart.params(selectRange),
inputArgument.showRank ? rankChart
.height(width > 800 ? 190 : 170)
.width(makeWidth(width) / 2.5) :
emptyChart.params(selectRange),
),
inputArgument.showHist ? chartHist
.height(width > 800 ? 260 : 160)
.width(makeWidth(width) / 1.75) :
emptyChart,
)
) :
vl.vconcat(
inputArgument.showMap ? chartMap
.height(width > 800 ? 360 : 240)
.width(makeWidth(width) / 1.05) :
emptyChart.params(select),
inputArgument.showRank ? rankChart2
.height(width > 800 ? 50 : 40)
.width(makeWidth(width) / 1.25) :
emptyChart.params(selectRange),
inputArgument.showRank ? rankChart
.height(width > 800 ? 190 : 170)
.width(makeWidth(width) / 1.25) :
emptyChart.params(selectRange),
inputArgument.showHist ? chartHist
.height(width > 800 ? 260 : 160)
.width(makeWidth(width) / 1.25) :
emptyChart,
);
return chart
.data(inputArgument.data)
.resolve({
legend: {fill: "independent", color: "independent"},
scale: {fill: "independent", color: "independent", domain: "independent"},
axis: {y: "independent", x: "independent", domain: "independent"},
})
.config(config);
}
Von Feldkirch bis Jahrndorf - Wo lebt es sich in Österreich am besten?
Der WIFO-Lebenssituationsindex beleuchtet die Lebensumstände auf kleinräumiger Ebene in den Wohngemeinden Österreichs. Dabei werden die auf die Lebensumstände einwirkenden Faktoren wie Einkommen, Erwerbsintensität, Alter und Qualifikation in einer Zahl gebündelt. Je höher der Indexwert ausfällt, desto günstiger ist die Lebenssituation in der Gemeinde. Erkunden Sie hier in unserer interaktiven Geschichte und in der zugehörigen Publikation wie sich Ihre Heimatgemeinde schlägt.
↓ Scrollen Sie nach unten und finden Sie mehr heraus ↓
Das Wichtigste zuerst: Was wird überhaupt gemessen? Der Index setzt sich aus fünf Teilindikatoren zusammen. Sie basieren auf dem Bevölkerungsanteil der unter 65-Jährigen, dem Bevölkerungsanteil der über 15-Jährigen mit einer über die Pflichtschule hinausgehenden Ausbildung, der Erwerbstätigenquote der 15- bis 64-Jährigen sowie den verfügbaren Einkommen je Einwohner und dem Einkommen je Haushalt.
Die Indikatoren wurden durch Normierung im Index vergleichbar gemacht und mittels geometrischem Mittel zu Werten von 1 bis 10 aggregiert. Hier sehen wir, wie sich der Indexwert von 6,1 am Beispiel Bad Ischl zusammensetzt (und in Klammern, wie sich die Zahlen seit 2013 verändert haben). Doch wie steht die Gemeinde im Vergleich zu anderen Gemeinden da?
Ein Blick auf die Verteilung des Indikators schafft Abhilfe. Mit einem Indexwert von 6,1 ordnet sich die Stadt ins untere Mittelfeld ein, wie man auch an dem hellblauen Farbton erkennen kann. Damit ist sie in guter Gesellschaft: Rund die Hälfte der Gemeinden erreicht einen Index zwischen 6 und 7.
Nun befüllen wir die Karte mit den 2.115 Gemeinden, für die das WIFO den Lebenssituationsindex berechnet hat. Die Farben sind entsprechend der Quantile der Verteilung analog zum vorherigen Histogramm skaliert. Die Ergebnisse zeigen markante regionale Unterschiede. Was fällt Ihnen auf?
Das oberste Drittel der Gemeinden offenbart, dass die gewählten Indikatoren vor allem in den Regionen um die großen Städte Österreichs hohe Werte erreichen. Die Einwohner:innen sind hier jünger, gebildeter und weisen eine hohe Erwerbsbeteiligung auf. Oft entscheidet das Einkommen darüber, ob sich eine Gemeinde ganz oben oder nur im oberen Mittelfeld einreiht.
Das unterste Drittel der Gemeinden hingegen teilt sich aufgrund unterschiedlicher Effekte in zwei Gruppen. Ländliche Gemeinden verzeichnen vor allem aufgrund einer ungünstigen Bevölkerungsstruktur niedrige Werte im Index. Die Ballungszentren hingegen erzielen zwar gute Werte in Bezug auf die Bevölkerungsstruktur, doch niedriges Einkommen und eine geringere Erwerbsintegration verhindern höhere Platzierungen.
Zum Schluss wollen wir betrachten, was sich über zehn Jahre hinweg im Vergleich zu 2013 verändert hat.¹ Hier sind es nicht die Gemeinden im Umfeld der Städte, die positiv hervorstechen, sondern vor allem periphere Regionen in Tirol und Kärnten – oft von einem sehr niedrigen Ausgangsniveau. Ihre Gemeinsamkeit? Vor allem die Bildungsstruktur hat sich hier deutlich verbessert.
view({
search: "none",
range: null,
showMap: true,
showRank: false,
showHist: false,
data: data.map(d => ({...d ,
opacity: true,
2023: d.change_rel > 0.25 ? 0.25: d.change_rel < -0.05 ? -0.05 : d.change_rel
})),
tooltip: false,
mapText: false,
mainColors: colors_change,
mapLegend: true,
selectMenu: false,
})
.render({renderer: "svg"})
Rückfragen an:
Julia Bock-Schappelwein
Franz Sinabell
Lukas Schmoigl
¹ Für Gemeinden die zwischen 2013 und 2023 zusammengelegt wurden, sind die Wachstumsraten nicht aussagekräftig.