Att det går att skapa snygga stilar för olika typer av data med GIS är säkert ingen överraskning. Om man däremot inte är så van vid GIS eller om man saknar en omfattande utbildning inom området så kanske man inte hört talas om normalisering av data, eller varför det är viktigt i många sammanhang.
Normalisering är något som ofta är nödvändigt om man har data som består av värden med olika enheter och skalor, som man vill kombinera vid stilsättningen.
Jag publicerade nyligen en video om detta på YouTube:
Och i detta inlägg så beskriver jag samma sak, med samma typ av data.
För det första, du behöver inte normalisera dina data om de endast beskriver värden från en enda skala eller värderymd. Om du exempelvis har punktdata som skall stilsättas baserat på ett enskilt värde, exempelvis genom att variera storleken på en punkt, så behöver data inte ”normaliseras”. Du kan däremot behöva fundera över om du skall använda en linjär skala eller en logaritmisk. Om du skall klassindela värden och i så fall hur. Eller om du skall variera punktens radie eller yta efter värdena (en form av linjär/exponentiell skala).
Inte heller om du enbart vill lyfta fram formen på ett objekt så krävs någon normalisering.
Men om du vill använda ett numeriskt värde, för att stilsätta ett geografiskt objekt, så behöver du åtminstone kompensera för objektets storlek. Om två polygoner har värdet 4 och 8, där den med värdet 8 är betydligt större, så kan en färgsättning av dessa polygoner efter en skala ganska lätt ge sken av att polygonen med 8 är värd mer.

Detta kan vara helt korrekt, om man bara ser till värdet. Men om värdet representerar en population som finns inom ytan, så behöver man dela populationen på den yta som den finns i för att korrekt representera detta.

I det här fallet så blir färgskalan i det närmaste den omvända där den lilla polygonen med 4 har en betydligt ”tätare” population.
Om det är andra värden man vill visualisera så kan man behöva kompensera på andra sätt, men det som visas ovan är en mycket enkel form av ”normalisering”.

De data jag använder är resultat från presidentvalet i USA 2020 och här har jag plockat ut Californien som exempel.
Det finns fler resultat än de jag använder här, och valsystemet i USA är betydligt mer krångligt än vad jag orkar sätta mig in i, så det kan säkert förekomma oriktigheter i resultatet.
Den enklaste stilsättningen man kan göra är att testa vilken av huvudkandidaterna som fick flest röster och färgsätta varje distrikt efter detta. Det finns även distrikt som har ”0” röster, vilket med detta uttryck ger ett falskt resultat och stilsätts ”rött”.
Om man i stället vill belysa marginalen som skiljer och då även fånga upp dessa ”0” resultat där det är ”lika” så kan man göra på flera sätt. Det går att ta skillnaden i antal röster och då får man ett värde som är positivt eller negativt och är större eller mindre beroende på hur många rösters övervikt någon har.

För detta så behöver man använda en färgramp i stället och då kan assistenten vara bra att använda. Eftersom marginalen är olika stor som mest, så måste skalan som används justeras så att den är lika stor åt båda hållen, så att ”lika” hamnar mitt på färgrampen. Det är mera sannolikt att stora skillnader uppstår i ytor med fler röstande, vilket betyder att många glest befolkade områden hamnar väldigt nära mitten på färgskalan. Detta är tekniskt korrekt och återspeglar skillnadens inflytande totalt sett i staten. Om man tycker att skalan är lite ”blek” så kan man justera skalan så att den inte är så ljus i mitten.
Ganska trevlig karta där vi tar hänsyn till marginalen i antal röster, men där ytan inte är normaliserad. Om ytan också skall normaliseras så blir det inte mycket färger kvar. Men det finns ett annat sätt.
I stället för ”marginal” så kan vi titta på en procentuell skillnad. Dela den ena kandidatens röster med summan av bådas, så kommer ett värde mellan 0 och 1 att erhållas, där 0.5 betyder att det är exakt lika. Detta sätt betyder att ingen kompensation för olika stora värden behöver göras och det blir enklare att anpassa färgrampen. Då det finns distrikt med ”0” röster så behöver även ett villkor läggas till som tilldelar dessa områden värdet 0.5, eftersom division med ”0” inte är tillåten.

Genom att ”strama åt” färgrampen något så kan mer intensiva färger behållas, vilket är bättre lämpat för nästa steg i normaliseringen.

För att normalisera mot ytan så tänker jag ”blanda” befolkningstätheten i varje distrikt med dessa färger, så att glest befolkade områden ”bleks” mer än områden med hög befolkningstäthet.
Vad jag känner till så finns inget bra sätt att göra detta i samma stilinställningar, men genom att duplicera lagret och använda assistenten till att skapa en ny färgramp i gråskala baserat på densitet och använda en blandningseffekt med det underliggande färglagret, så kan man uppnå ganska bra resultat.

Som standard så är bilden väldigt blek, men eftersom det mest intressanta är i mitten på färgskalan så ”tajta” till kurvan lite och på så sätt framhäva färger lite bättre. I exemplet här har jag använt ”Hard light” som blandningsläge, men det fungerar även med andra så prova dig fram.
Syftet med att justera kurvan ovan är att skapa en representativ bild av resultatet. I Californien vann Biden med drygt 11 miljoner röster mot Trumps 6 miljoner. Det är en mycket bred marginal jämfört med många andra stater, men befolkningen är koncentrerad i många små områden, och om man inte passar sig när man justerar kurvan så kan man lätt förledas att tro att det var ett jämnare race än vad det faktiskt var. Det gäller att även titta på helheten så att man inte ”ljuger” i sin iver att skapa en ”snygg” stil. Det mest korrekta är att låta matematiken stå för sig själv och använda en helt linjär kurva, men då blir som sagt helheten ganska blek.

I bilden nedan visas en jämförelse för San Francisco området där den övre delen är normaliserad mot ytan och den undre endast justerad för vinstmarginal, vilket delvis normaliserar mot populationen.

Att normalisera mot yta i QGIS kan kräva en hel del beräkningar, om programmet hela tiden behöver räkna ut arean dynamiskt med ett uttryck. För att snabba upp renderingen så kan man därför skapa ett attribut för ytan och beräkna den en enda gång för att sedan använda detta värde direkt. Detta kommer att göra renderingarna mycket snabbare.