Qualche anno fa analizzai i dati del progetto CORINE Land Cover relativi alla Campania, focalizzandomi sui tre censimenti tra il 2000 ed il 2012. Oggi invece estenderò quell'analisi inserendo sia i dati del 1990 che gli ultimi disponibili attualmente, cioè quelli del 2018.
L'analisi questa volta la farò usando Python e la estenderò al resto dell'Italia verso la fine.
Prima di iniziare¶
Librerie¶
Per raggiungere l'obiettivo userò le librerie che seguono:
from pathlib import Path
import geopandas as gpd
import pandas as pd
from functools import reduce
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
Fonti dati¶
Ho rielaborato i dati CORINE Land Cover dal 1990 al 2018 inserendoli in un unico GeoPackage che è possibile scaricare da qui. I dati sono stati processati preventivamente usando PostGIS in modo da associare ai poligoni della CLC anche quelli dei Comuni italiani al 2022 dell'ISTAT. E' stato indispensabile questo passaggio preventivo perchè ho dovuto correggere gli errori topologici sui dati ISTAT e, al momento, trovo molto più comodo correggere gli errori topologici tramite SQL piuttosto che con Python.
main_folder = Path('/home/max/Downloads/clcitalia')
dataset = main_folder.joinpath('clcitalia.gpkg')
1. Lettura e normalizzazione dei dati¶
In questa fase ho proceduto ad estrarre un po' di dati statistici che userò nei passaggi successivi. Sono perlopiu analisi mirate al calcolo delle superfici che ho espresso in ettari. Fatte queste analisi mi sono liberato dei dati geometrici perchè, non dovendoli più usare, mi alleggeriscono le analisi successive in termini di prestazioni hardware.
%%time
# CLC 1990
clc1990 = gpd.read_file(dataset, layer='clc1990')
clc1990.insert(loc=10, column='sup_com_ha', value=clc1990.sup_com_mq / 10000)
clc1990.insert(loc=11, column='surface_ha_1990', value=round(clc1990.geometry.area / 10000, 4))
clc1990.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)
clc1990.head(10)
CPU times: user 1min 4s, sys: 687 ms, total: 1min 4s Wall time: 1min 4s
code_90 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.1386 |
1 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 276.7171 |
2 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 35.4001 |
3 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 2.2285 |
4 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.3860 |
5 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 8.6550 |
6 | 243 | Agricultural areas | Heterogeneous agricultural areas | Land principally occupied by agriculture, with... | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 37.2054 |
7 | 243 | Agricultural areas | Heterogeneous agricultural areas | Land principally occupied by agriculture, with... | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 114.5143 |
8 | 311 | Forest and semi natural areas | Forests | Broad-leaved forest | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 44.3502 |
9 | 311 | Forest and semi natural areas | Forests | Broad-leaved forest | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 32.6148 |
%%time
# CLC 2000
clc2000 = gpd.read_file(dataset, layer='clc2000')
clc2000.insert(loc=10, column='sup_com_ha', value=clc2000.sup_com_mq / 10000)
clc2000.insert(loc=11, column='surface_ha_2000', value=round(clc2000.geometry.area / 10000, 4))
clc2000.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)
clc2000.head(10)
CPU times: user 1min 14s, sys: 388 ms, total: 1min 14s Wall time: 1min 14s
code_00 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_2000 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 2170.0 | Alto Sermenza | Vercelli | Piemonte | 6032.586221 | 11.9494 |
1 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 2170.0 | Alto Sermenza | Vercelli | Piemonte | 6032.586221 | 42.8232 |
2 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 2170.0 | Alto Sermenza | Vercelli | Piemonte | 6032.586221 | 279.4458 |
3 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 2170.0 | Alto Sermenza | Vercelli | Piemonte | 6032.586221 | 120.3762 |
4 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 2170.0 | Alto Sermenza | Vercelli | Piemonte | 6032.586221 | 80.1545 |
5 | 311 | Forest and semi natural areas | Forests | Broad-leaved forest | 46008.0 | Careggine | Lucca | Toscana | 2408.101499 | 1664.3039 |
6 | 324 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Transitional woodland-shrub | 46008.0 | Careggine | Lucca | Toscana | 2408.101499 | 25.8278 |
7 | 324 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Transitional woodland-shrub | 46008.0 | Careggine | Lucca | Toscana | 2408.101499 | 73.5182 |
8 | 333 | Forest and semi natural areas | Open spaces with little or no vegetation | Sparsely vegetated areas | 46008.0 | Careggine | Lucca | Toscana | 2408.101499 | 34.7050 |
9 | 333 | Forest and semi natural areas | Open spaces with little or no vegetation | Sparsely vegetated areas | 46008.0 | Careggine | Lucca | Toscana | 2408.101499 | 101.5072 |
%%time
# CLC 2006
clc2006 = gpd.read_file(dataset, layer='clc2006')
clc2006.insert(loc=10, column='sup_com_ha', value=clc2006.sup_com_mq / 10000)
clc2006.insert(loc=11, column='surface_ha_2006', value=round(clc2006.geometry.area / 10000, 4))
clc2006.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)
clc2006.head(10)
CPU times: user 1min 10s, sys: 328 ms, total: 1min 11s Wall time: 1min 11s
code_06 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_2006 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 99.9449 |
1 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 161.6097 |
2 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 35.3999 |
3 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.1332 |
4 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 5.0278 |
5 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 2.8168 |
6 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 0.1570 |
7 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 165.7342 |
8 | 243 | Agricultural areas | Heterogeneous agricultural areas | Land principally occupied by agriculture, with... | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 36.2394 |
9 | 311 | Forest and semi natural areas | Forests | Broad-leaved forest | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 32.6261 |
%%time
# CLC 2012
clc2012 = gpd.read_file(dataset, layer='clc2012')
clc2012.insert(loc=10, column='sup_com_ha', value=clc2012.sup_com_mq / 10000)
clc2012.insert(loc=11, column='surface_ha_2012', value=round(clc2012.geometry.area / 10000, 4))
clc2012.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)
clc2012.head(10)
CPU times: user 1min 20s, sys: 588 ms, total: 1min 21s Wall time: 1min 21s
code_12 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_2012 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 243 | Agricultural areas | Heterogeneous agricultural areas | Land principally occupied by agriculture, with... | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 0.5968 |
1 | 313 | Forest and semi natural areas | Forests | Mixed forest | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 187.4011 |
2 | 324 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Transitional woodland-shrub | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 29.7040 |
3 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 99.9449 |
4 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 161.6097 |
5 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 420.1994 |
6 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 35.3999 |
7 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.1332 |
8 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 5.0278 |
9 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.6430 |
%%time
# CLC 2018
clc2018 = gpd.read_file(dataset, layer='clc2018')
clc2018.insert(loc=10, column='sup_com_ha', value=clc2018.sup_com_mq / 10000)
clc2018.insert(loc=11, column='surface_ha_2018', value=round(clc2018.geometry.area / 10000, 4))
clc2018.drop(columns={'sup_com_mq', 'geometry'}, inplace=True)
clc2018.head(10)
CPU times: user 1min 12s, sys: 560 ms, total: 1min 12s Wall time: 1min 12s
code_18 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_2018 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 0.1570 |
1 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 161.6097 |
2 | 211 | Agricultural areas | Arable land | Non-irrigated arable land | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 420.1994 |
3 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 5.0278 |
4 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.6430 |
5 | 223 | Agricultural areas | Permanent crops | Olive groves | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 34.7345 |
6 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 2.8168 |
7 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.3899 |
8 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 13.0463 |
9 | 243 | Agricultural areas | Heterogeneous agricultural areas | Land principally occupied by agriculture, with... | 101005.0 | Castelsilano | Crotone | Calabria | 4006.296249 | 1.1525 |
Le colonne label*
fanno riferimento alla nomenclatura delle tre classi della mappa CORINE Land Cover per ogni singolo anno. Per interpretare la nomenclatura vai qui. Come puoi vedere sono presenti le colonne relative al Comune, Provincia e Regione di apparteneza, l'estensione dell'area comunale(sup_com_ha
) e quelle relative alle superfici della CLC che mi sono calcolato in precedenza.
2. Focus sulla Campania¶
Per appartenza territoriale partirò proprio dalla Campania, lo faccio anche per riprendere parte della analisi del mio vecchio articolo.
clc1990_campania = clc1990[clc1990['regione'] == 'Campania']
clc2000_campania = clc2000[clc2000['regione'] == 'Campania']
clc2006_campania = clc2006[clc2006['regione'] == 'Campania']
clc2012_campania = clc2012[clc2012['regione'] == 'Campania']
clc2018_campania = clc2018[clc2018['regione'] == 'Campania']
Test di visualizzazione
clc2000_campania
code_00 | label1 | label2 | label3 | pro_com | comune | provincia | regione | sup_com_ha | surface_ha_2000 | |
---|---|---|---|---|---|---|---|---|---|---|
14 | 111 | Artificial surfaces | Urban fabric | Continuous urban fabric | 65134.0 | Sapri | Salerno | Campania | 1420.007490 | 82.5207 |
15 | 112 | Artificial surfaces | Urban fabric | Discontinuous urban fabric | 65134.0 | Sapri | Salerno | Campania | 1420.007490 | 36.5516 |
16 | 241 | Agricultural areas | Heterogeneous agricultural areas | Annual crops associated with permanent crops | 65134.0 | Sapri | Salerno | Campania | 1420.007490 | 17.7890 |
17 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 65134.0 | Sapri | Salerno | Campania | 1420.007490 | 0.6866 |
18 | 242 | Agricultural areas | Heterogeneous agricultural areas | Complex cultivation patterns | 65134.0 | Sapri | Salerno | Campania | 1420.007490 | 56.9832 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
177542 | 323 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Sclerophyllous vegetation | 61072.0 | Rocchetta e Croce | Caserta | Campania | 1300.547184 | 206.0290 |
177543 | 324 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Transitional woodland-shrub | 61072.0 | Rocchetta e Croce | Caserta | Campania | 1300.547184 | 2.3093 |
177544 | 221 | Agricultural areas | Permanent crops | Vineyards | 61072.0 | Rocchetta e Croce | Caserta | Campania | 1300.547184 | 4.0201 |
177545 | 321 | Forest and semi natural areas | Scrub and/or herbaceous vegetation associations | Natural grasslands | 61072.0 | Rocchetta e Croce | Caserta | Campania | 1300.547184 | 1.8517 |
177546 | 222 | Agricultural areas | Permanent crops | Fruit trees and berry plantations | 61072.0 | Rocchetta e Croce | Caserta | Campania | 1300.547184 | 1.9998 |
11361 rows × 10 columns
2.1.1 Stato al 1990¶
Come primo step mi sono concentrato sui dati del 1990; ho pulito un po' la tabella per rendere meglio comprensibile la sua lettura ed ho estratto valori per tutte e tre le classi. Quello che ho fatto per il 1990 l'ho ripetuto per i restanti anni.
Livello 1
campania_clc1990_label1 = pd.DataFrame(clc1990_campania.groupby('label1')['surface_ha_1990'].sum())
campania_clc1990_label1.reset_index(inplace=True)
campania_clc1990_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc1990_label1
CORINE Land Cover - level 1 | surface_ha_1990 | |
---|---|---|
0 | Agricultural areas | 761041.0303 |
1 | Artificial surfaces | 80649.9550 |
2 | Forest and semi natural areas | 522870.7142 |
3 | Water bodies | 1593.6569 |
4 | Wetlands | 608.8997 |
Livello 2
campania_clc1990_label2 = pd.DataFrame(clc1990_campania.groupby('label2')['surface_ha_1990'].sum())
campania_clc1990_label2.reset_index(inplace=True)
campania_clc1990_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc1990_label2
CORINE Land Cover - level 2 | surface_ha_1990 | |
---|---|---|
0 | Arable land | 330066.4318 |
1 | Artificial, non-agricultural vegetated areas | 1046.0670 |
2 | Forests | 383826.2982 |
3 | Heterogeneous agricultural areas | 297503.9919 |
4 | Industrial, commercial and transport units | 8083.1341 |
5 | Inland waters | 1567.8002 |
6 | Inland wetlands | 608.8997 |
7 | Marine waters | 25.8567 |
8 | Mine, dump and construction sites | 1631.6247 |
9 | Open spaces with little or no vegetation | 8966.3806 |
10 | Pastures | 15620.1214 |
11 | Permanent crops | 117850.4852 |
12 | Scrub and/or herbaceous vegetation associations | 130078.0354 |
13 | Urban fabric | 69889.1292 |
Livello 3
campania_clc1990_label3 = pd.DataFrame(clc1990_campania.groupby('label3')['surface_ha_1990'].sum())
campania_clc1990_label3.reset_index(inplace=True)
campania_clc1990_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
campania_clc1990_label3
CORINE Land Cover - level 3 | surface_ha_1990 | |
---|---|---|
0 | Agro-forestry areas | 420.5049 |
1 | Airports | 383.8998 |
2 | Annual crops associated with permanent crops | 42881.8119 |
3 | Bare rocks | 1122.7257 |
4 | Beaches, dunes, sands | 2282.0112 |
5 | Broad-leaved forest | 367521.2801 |
6 | Coastal lagoons | 25.8567 |
7 | Complex cultivation patterns | 165047.1097 |
8 | Coniferous forest | 7457.8770 |
9 | Construction sites | 25.4060 |
10 | Continuous urban fabric | 32608.0637 |
11 | Discontinuous urban fabric | 37281.0655 |
12 | Dump sites | 207.8811 |
13 | Fruit trees and berry plantations | 56044.2433 |
14 | Green urban areas | 731.9919 |
15 | Industrial or commercial units | 6590.0765 |
16 | Inland marshes | 608.8997 |
17 | Land principally occupied by agriculture, with... | 89154.5654 |
18 | Mineral extraction sites | 1398.3376 |
19 | Mixed forest | 8847.1411 |
20 | Moors and heathland | 16.7825 |
21 | Natural grasslands | 57150.7848 |
22 | Non-irrigated arable land | 304750.4005 |
23 | Olive groves | 58951.7577 |
24 | Pastures | 15620.1214 |
25 | Permanently irrigated land | 25316.0313 |
26 | Port areas | 458.6026 |
27 | Road and rail networks and associated land | 650.5552 |
28 | Sclerophyllous vegetation | 19255.7695 |
29 | Sparsely vegetated areas | 5561.6437 |
30 | Sport and leisure facilities | 314.0751 |
31 | Transitional woodland-shrub | 53654.6986 |
32 | Vineyards | 2854.4842 |
33 | Water bodies | 1095.5920 |
34 | Water courses | 472.2082 |
2.1.2 Stato al 2000¶
campania_clc2000_label1 = pd.DataFrame(clc2000_campania.groupby('label1')['surface_ha_2000'].sum())
campania_clc2000_label1.reset_index(inplace=True)
campania_clc2000_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc2000_label2 = pd.DataFrame(clc2000_campania.groupby('label2')['surface_ha_2000'].sum())
campania_clc2000_label2.reset_index(inplace=True)
campania_clc2000_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc2000_label3 = pd.DataFrame(clc2000_campania.groupby('label3')['surface_ha_2000'].sum())
campania_clc2000_label3.reset_index(inplace=True)
campania_clc2000_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
2.1.3 Stato al 2006¶
campania_clc2006_label1 = pd.DataFrame(clc2006_campania.groupby('label1')['surface_ha_2006'].sum())
campania_clc2006_label1.reset_index(inplace=True)
campania_clc2006_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc2006_label2 = pd.DataFrame(clc2006_campania.groupby('label2')['surface_ha_2006'].sum())
campania_clc2006_label2.reset_index(inplace=True)
campania_clc2006_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc2006_label3 = pd.DataFrame(clc2006_campania.groupby('label3')['surface_ha_2006'].sum())
campania_clc2006_label3.reset_index(inplace=True)
campania_clc2006_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
2.1.4 Stato al 2012¶
campania_clc2012_label1 = pd.DataFrame(clc2012_campania.groupby('label1')['surface_ha_2012'].sum())
campania_clc2012_label1.reset_index(inplace=True)
campania_clc2012_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc2012_label2 = pd.DataFrame(clc2012_campania.groupby('label2')['surface_ha_2012'].sum())
campania_clc2012_label2.reset_index(inplace=True)
campania_clc2012_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc2012_label3 = pd.DataFrame(clc2012_campania.groupby('label3')['surface_ha_2012'].sum())
campania_clc2012_label3.reset_index(inplace=True)
campania_clc2012_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
2.1.5 Stato al 2018¶
campania_clc2018_label1 = pd.DataFrame(clc2018_campania.groupby('label1')['surface_ha_2018'].sum())
campania_clc2018_label1.reset_index(inplace=True)
campania_clc2018_label1.rename(columns={'label1': 'CORINE Land Cover - level 1'}, inplace=True)
campania_clc2018_label2 = pd.DataFrame(clc2018_campania.groupby('label2')['surface_ha_2018'].sum())
campania_clc2018_label2.reset_index(inplace=True)
campania_clc2018_label2.rename(columns={'label2': 'CORINE Land Cover - level 2'}, inplace=True)
campania_clc2018_label3 = pd.DataFrame(clc2018_campania.groupby('label3')['surface_ha_2018'].sum())
campania_clc2018_label3.reset_index(inplace=True)
campania_clc2018_label3.rename(columns={'label3': 'CORINE Land Cover - level 3'}, inplace=True)
2.2 Grafici¶
E' il momento di approfondire questi dati! Ho estratto grafici per tutte e tre le classi ed ho cercato di dare una interpretazione del perchè di alcuni fenomeni.
2.2.1 Grafici per il livello 1¶
lvl1 = [campania_clc1990_label1, campania_clc2000_label1, campania_clc2006_label1, campania_clc2012_label1, campania_clc2018_label1]
lvl1_df = reduce(lambda left,right: pd.merge(left,right,on=['CORINE Land Cover - level 1'], how='outer'), lvl1)
lvl1_df.fillna(0, inplace=True)
lvl1_df.insert(loc=6, column='Surf.Diff. | 2018-1990', value=(lvl1_df.surface_ha_2018 - lvl1_df.surface_ha_1990))
lvl1_df.set_index('CORINE Land Cover - level 1', inplace=True)
lvl1_df.rename(columns={'surface_ha_1990': '1990', 'surface_ha_2000': '2000', 'surface_ha_2006': '2006', 'surface_ha_2012': '2012', 'surface_ha_2018': '2018'}, inplace=True)
lvl1_df.sort_index(ascending=True, inplace=True)
lvl1_df
1990 | 2000 | 2006 | 2012 | 2018 | Surf.Diff. | 2018-1990 | |
---|---|---|---|---|---|---|
CORINE Land Cover - level 1 | ||||||
Agricultural areas | 761041.0303 | 753145.2349 | 755438.9748 | 752611.5454 | 752077.3861 | -8963.6442 |
Artificial surfaces | 80649.9550 | 89935.2388 | 97747.4059 | 101771.7643 | 102304.6984 | 21654.7434 |
Forest and semi natural areas | 522870.7142 | 521005.1536 | 510731.5181 | 509096.9289 | 508050.0206 | -14820.6936 |
Water bodies | 1593.6569 | 2195.8983 | 2463.1760 | 2948.2571 | 2948.2571 | 1354.6002 |
Wetlands | 608.8997 | 482.9084 | 386.6832 | 339.2620 | 339.2620 | -269.6377 |
fig1 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig1, hspace=0.35)
ax = fig1.add_subplot(sub_fig[0, 0])
lvl1_df.plot.bar(ax=ax, rot=0)
ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7f13b28b6da0>
E' visibile abbastanza chiaramente un netto aumento delle superfici artificiali con un conseguente arretramento di quelle forestate e di quelle agricole. Le aree forestate tra il 1990 ed il 2018 hanno subito un arretramento quasi doppio rispetto a quelle agricole e le superfici artificiali sono quelle che hanno maggiormente "beneficiato" di questo arretramento complessivo delle due classi di CLC. Si potrebbe dire che l'urbanizzato ha eroso foreste ed aree agricole in quasi 30 anni.
2.2.2 Grafici per il livello 2¶
lvl2 = [campania_clc1990_label2, campania_clc2000_label2, campania_clc2006_label2, campania_clc2012_label2, campania_clc2018_label2]
lvl2_df = reduce(lambda left,right: pd.merge(left,right,on=['CORINE Land Cover - level 2'], how='outer'), lvl2)
lvl2_df.fillna(0, inplace=True)
lvl2_df.insert(loc=6, column='Surf.Diff. | 2000-1990', value=(lvl2_df.surface_ha_2000 - lvl2_df.surface_ha_1990))
lvl2_df.insert(loc=7, column='Surf.Diff. | 2006-2000', value=(lvl2_df.surface_ha_2006 - lvl2_df.surface_ha_2000))
lvl2_df.insert(loc=8, column='Surf.Diff. | 2012-2006', value=(lvl2_df.surface_ha_2012 - lvl2_df.surface_ha_2006))
lvl2_df.insert(loc=9, column='Surf.Diff. | 2018-2012', value=(lvl2_df.surface_ha_2018 - lvl2_df.surface_ha_2012))
lvl2_df.insert(loc=9, column='Surf.Diff. | 2018-1990', value=(lvl2_df.surface_ha_2018 - lvl2_df.surface_ha_1990))
lvl2_df.set_index('CORINE Land Cover - level 2', inplace=True)
lvl2_df = lvl2_df[['Surf.Diff. | 2000-1990', 'Surf.Diff. | 2006-2000', 'Surf.Diff. | 2012-2006', 'Surf.Diff. | 2018-2012', 'Surf.Diff. | 2018-1990']]
lvl2_df.sort_index(ascending=True, inplace=True)
lvl2_df
Surf.Diff. | 2000-1990 | Surf.Diff. | 2006-2000 | Surf.Diff. | 2012-2006 | Surf.Diff. | 2018-2012 | Surf.Diff. | 2018-1990 | |
---|---|---|---|---|---|
CORINE Land Cover - level 2 | |||||
Arable land | -6226.9986 | -15007.4805 | 1362.7374 | 26.9417 | -19844.8000 |
Artificial, non-agricultural vegetated areas | 330.5367 | -4.4113 | 58.5588 | 396.9458 | 781.6300 |
Forests | 2963.0601 | -4293.0050 | 1859.3801 | -1391.9151 | -862.4799 |
Heterogeneous agricultural areas | -947.6309 | 4546.7408 | 9331.1283 | -448.2578 | 12481.9804 |
Industrial, commercial and transport units | 1550.4505 | 3173.2827 | 2094.7855 | 154.4961 | 6973.0148 |
Inland waters | 602.2416 | 267.2776 | 398.3284 | 0.0000 | 1267.8476 |
Inland wetlands | -125.9913 | -96.2252 | -73.2778 | 0.0000 | -295.4943 |
Marine waters | -0.0002 | 0.0001 | 86.7527 | 0.0000 | 86.7526 |
Maritime wetlands | 0.0000 | 0.0000 | 25.8566 | 0.0000 | 25.8566 |
Mine, dump and construction sites | -31.1788 | 474.9460 | 112.8079 | -23.5198 | 533.0553 |
Open spaces with little or no vegetation | 1019.9233 | -287.3449 | 20220.0532 | 3005.5295 | 23958.1611 |
Pastures | -1351.7336 | -788.2046 | -997.1098 | -110.4579 | -3247.5059 |
Permanent crops | 630.5677 | 13542.6842 | -12524.1853 | -2.3853 | 1646.6813 |
Scrub and/or herbaceous vegetation associations | -5848.5440 | -5693.2856 | -23714.0225 | -2660.5227 | -37916.3748 |
Urban fabric | 7435.4754 | 4168.3497 | 1758.2062 | 5.0120 | 13367.0433 |
fig2 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig2, hspace=0.35)
ax = fig2.add_subplot(sub_fig[0, 0])
lvl2_df.plot.bar(ax=ax, rot=0)
ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')
plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7f13ab7d1fc0>
Scendendo di un livello, quindi andando ad approfondire di più il dato passando al secondo livello CLC, possiamo verificare i trend negativi a quali specifiche superfici fanno riferimento.
Le aree arbustive e con alberi radi hanno avuto la peggio, a seguire i terreni arabili, pascoli e foreste. Netto è invece l'aumento delle aree aperte, classe in cui nel terzo livello CLC ci sono le aree percorse dal fuoco(da tenere in mente per richiami successivi!). Seguono, nell'incremento, le aree urbanizzate, le aree per colture eterogenee e quelle per lo sviluppo di siti industriali e commerciali.
2.2.3 Grafici per il livello 3¶
lvl3 = [campania_clc1990_label3, campania_clc2000_label3, campania_clc2006_label3, campania_clc2012_label3, campania_clc2018_label3]
lvl3_df = reduce(lambda left,right: pd.merge(left,right,on=['CORINE Land Cover - level 3'], how='outer'), lvl3)
lvl3_df.fillna(0, inplace=True)
lvl3_df.insert(loc=6, column='Surf.Diff. | 2000-1990', value=(lvl3_df.surface_ha_2000 - lvl3_df.surface_ha_1990))
lvl3_df.insert(loc=7, column='Surf.Diff. | 2006-2000', value=(lvl3_df.surface_ha_2006 - lvl3_df.surface_ha_2000))
lvl3_df.insert(loc=8, column='Surf.Diff. | 2012-2006', value=(lvl3_df.surface_ha_2012 - lvl3_df.surface_ha_2006))
lvl3_df.insert(loc=9, column='Surf.Diff. | 2018-2012', value=(lvl3_df.surface_ha_2018 - lvl3_df.surface_ha_2012))
lvl3_df.insert(loc=10, column='Surf.Diff. | 2018-1990', value=(lvl3_df.surface_ha_2018 - lvl3_df.surface_ha_1990))
lvl3_df.set_index('CORINE Land Cover - level 3', inplace=True)
lvl3_df.sort_index(ascending=True, inplace=True)
lvl3_df
surface_ha_1990 | surface_ha_2000 | surface_ha_2006 | surface_ha_2012 | surface_ha_2018 | Surf.Diff. | 2000-1990 | Surf.Diff. | 2006-2000 | Surf.Diff. | 2012-2006 | Surf.Diff. | 2018-2012 | Surf.Diff. | 2018-1990 | |
---|---|---|---|---|---|---|---|---|---|---|
CORINE Land Cover - level 3 | ||||||||||
Agro-forestry areas | 420.5049 | 420.5224 | 140.9079 | 79.0823 | 79.0823 | 0.0175 | -279.6145 | -61.8256 | 0.000000e+00 | -341.4226 |
Airports | 383.8998 | 556.4307 | 556.4308 | 556.4308 | 556.4308 | 172.5309 | 0.0001 | 0.0000 | 0.000000e+00 | 172.5310 |
Annual crops associated with permanent crops | 42881.8119 | 44016.3987 | 23501.2894 | 24459.1737 | 24062.2280 | 1134.5868 | -20515.1093 | 957.8843 | -3.969457e+02 | -18819.5839 |
Bare rocks | 1122.7257 | 1006.1738 | 979.8852 | 1274.5252 | 1274.5252 | -116.5519 | -26.2886 | 294.6400 | 0.000000e+00 | 151.7995 |
Beaches, dunes, sands | 2282.0112 | 1852.6891 | 1835.3037 | 1904.4059 | 1904.4059 | -429.3221 | -17.3854 | 69.1022 | 0.000000e+00 | -377.6053 |
Broad-leaved forest | 367521.2801 | 369187.8047 | 365453.4552 | 367034.3194 | 366436.4566 | 1666.5246 | -3734.3495 | 1580.8642 | -5.978628e+02 | -1084.8235 |
Burnt areas | 0.0000 | 354.7607 | 438.4148 | 770.8451 | 3802.9844 | 354.7607 | 83.6541 | 332.4303 | 3.032139e+03 | 3802.9844 |
Coastal lagoons | 25.8567 | 25.8565 | 25.8566 | 112.6093 | 112.6093 | -0.0002 | 0.0001 | 86.7527 | 0.000000e+00 | 86.7526 |
Complex cultivation patterns | 165047.1097 | 162777.2069 | 181971.5611 | 185634.2569 | 185582.9448 | -2269.9028 | 19194.3542 | 3662.6958 | -5.131210e+01 | 20535.8351 |
Coniferous forest | 7457.8770 | 8154.5708 | 7620.7143 | 8876.9029 | 8373.6888 | 696.6938 | -533.8565 | 1256.1886 | -5.032141e+02 | 915.8118 |
Construction sites | 25.4060 | 70.0172 | 246.1018 | 58.2792 | 58.2792 | 44.6112 | 176.0846 | -187.8226 | 0.000000e+00 | 32.8732 |
Continuous urban fabric | 32608.0637 | 33436.5752 | 29309.2673 | 33833.4142 | 33833.4142 | 828.5115 | -4127.3079 | 4524.1469 | 0.000000e+00 | 1225.3505 |
Discontinuous urban fabric | 37281.0655 | 43888.0294 | 52183.6870 | 49417.7463 | 49422.7583 | 6606.9639 | 8295.6576 | -2765.9407 | 5.012000e+00 | 12141.6928 |
Dump sites | 207.8811 | 27.2633 | 174.0802 | 438.6634 | 406.9530 | -180.6178 | 146.8169 | 264.5832 | -3.171040e+01 | 199.0719 |
Fruit trees and berry plantations | 56044.2433 | 54999.5524 | 61954.0631 | 56585.3863 | 56585.3142 | -1044.6909 | 6954.5107 | -5368.6768 | -7.210000e-02 | 541.0709 |
Green urban areas | 731.9919 | 758.4238 | 805.2857 | 780.1128 | 1177.0586 | 26.4319 | 46.8619 | -25.1729 | 3.969458e+02 | 445.0667 |
Industrial or commercial units | 6590.0765 | 8168.7442 | 11005.1236 | 12643.3548 | 12797.8509 | 1578.6677 | 2836.3794 | 1638.2312 | 1.544961e+02 | 6207.7744 |
Inland marshes | 608.8997 | 482.9084 | 386.6832 | 313.4054 | 313.4054 | -125.9913 | -96.2252 | -73.2778 | 0.000000e+00 | -295.4943 |
Land principally occupied by agriculture, with significant areas of natural vegetation | 89154.5654 | 89342.2330 | 95489.3434 | 100261.7172 | 100261.7172 | 187.6676 | 6147.1104 | 4772.3738 | 0.000000e+00 | 11107.1518 |
Mineral extraction sites | 1398.3376 | 1503.1654 | 1655.2099 | 1691.2572 | 1699.4478 | 104.8278 | 152.0445 | 36.0473 | 8.190600e+00 | 301.1102 |
Mixed forest | 8847.1411 | 9446.9828 | 9422.1838 | 8444.5111 | 8153.6729 | 599.8417 | -24.7990 | -977.6727 | -2.908382e+02 | -693.4682 |
Moors and heathland | 16.7825 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | -16.7825 | 0.0000 | 0.0000 | 0.000000e+00 | -16.7825 |
Natural grasslands | 57150.7848 | 53354.5398 | 48427.4297 | 30587.1997 | 29539.0655 | -3796.2450 | -4927.1101 | -17840.2300 | -1.048134e+03 | -27611.7193 |
Non-irrigated arable land | 304750.4005 | 298328.2037 | 283148.7731 | 284508.0453 | 284503.2765 | -6422.1968 | -15179.4306 | 1359.2722 | -4.768800e+00 | -20247.1240 |
Olive groves | 58951.7577 | 60805.0013 | 66147.7874 | 61604.3214 | 61632.6846 | 1853.2436 | 5342.7861 | -4543.4660 | 2.836320e+01 | 2680.9269 |
Pastures | 15620.1214 | 14268.3878 | 13480.1832 | 12483.0734 | 12372.6155 | -1351.7336 | -788.2046 | -997.1098 | -1.104579e+02 | -3247.5059 |
Permanently irrigated land | 25316.0313 | 25511.2295 | 25683.1796 | 25686.6448 | 25718.3553 | 195.1982 | 171.9501 | 3.4652 | 3.171050e+01 | 402.3240 |
Port areas | 458.6026 | 469.9879 | 481.6963 | 459.2550 | 459.2550 | 11.3853 | 11.7084 | -22.4413 | 0.000000e+00 | 0.6524 |
Road and rail networks and associated land | 650.5552 | 438.4218 | 763.6166 | 1242.6122 | 1242.6122 | -212.1334 | 325.1948 | 478.9956 | 0.000000e+00 | 592.0570 |
Salt marshes | 0.0000 | 0.0000 | 0.0000 | 25.8566 | 25.8566 | 0.0000 | 0.0000 | 25.8566 | 0.000000e+00 | 25.8566 |
Sclerophyllous vegetation | 19255.7695 | 18537.4944 | 17072.9128 | 15623.7660 | 15530.6877 | -718.2751 | -1464.5816 | -1449.1468 | -9.307830e+01 | -3725.0818 |
Sparsely vegetated areas | 5561.6437 | 6772.6803 | 6445.3553 | 25969.2360 | 25942.6262 | 1211.0366 | -327.3250 | 19523.8807 | -2.660980e+01 | 20380.9825 |
Sport and leisure facilities | 314.0751 | 618.1799 | 566.9067 | 650.6384 | 650.6384 | 304.1048 | -51.2732 | 83.7317 | 0.000000e+00 | 336.5633 |
Transitional woodland-shrub | 53654.6986 | 52337.4572 | 53035.8633 | 48611.2176 | 47091.9074 | -1317.2414 | 698.4061 | -4424.6457 | -1.519310e+03 | -6562.7912 |
Vineyards | 2854.4842 | 2676.4992 | 3921.8866 | 1309.8441 | 1279.1677 | -177.9850 | 1245.3874 | -2612.0425 | -3.067640e+01 | -1575.3165 |
Water bodies | 1095.5920 | 1373.7744 | 1687.8687 | 1981.1362 | 1981.1362 | 278.1824 | 314.0943 | 293.2675 | 2.273737e-13 | 885.5442 |
Water courses | 472.2082 | 796.2674 | 749.4507 | 854.5116 | 854.5116 | 324.0592 | -46.8167 | 105.0609 | 0.000000e+00 | 382.3034 |
fig3 = plt.figure(figsize=(20, 10), dpi=100)
sub_fig = GridSpec(nrows=1, ncols=1, figure=fig3, hspace=0.35)
ax = fig3.add_subplot(sub_fig[0, 0])
lvl3_df['Surf.Diff. | 2018-1990'].plot.bar(ax=ax, rot=0)
ax.yaxis.set_label_text('ha')
ax.set_xlabel('')
ax.grid(color='lightgrey', linestyle='dashdot')
plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7f13b28b4fd0>
Passando al livello tre della CLC, ho voluto graficare la sola differenza tra 1990 e 2018 per motivi di leggibilità del grafico. In termini di aumento di copertura del suolo c'è l'avanzamento, quasi identico, delle piccole aree destinate a colture annuali e delle aree con vegetazione frammentata. A seguire ci sono le aree urbane discontinue e quelle occupate da orti, vigneti e alberi da frutto.
Una riflessione che mi sento di fare è che l'avanzamento del tessuto urbano discontinuo ha frazionato il territorio agricolo, generando aree a piccole colture agricole.
Significativo anche l'aumento di estensione delle aree percorse dal fuoco.
I decrementi sono la cartina di tornasole degli incrementi che ho descritto poco fa e che potrebbero confermare la mia riflessione sul frazionamento del territorio naturale ed agricolo, portato avanti dall'avanzamento delle classi legati ai suoli artificiali.
2.3 Focus sui Comuni¶
L'analisi che segue tenta di rispondere alla domanda: "quali sono i Comuni campani in cui i fenomeni esposti poco fa hanno avuto un maggior impatto?"
Mi concentrerò sul terzo livello della CLC, in particolare sulle aree artificiali, aree agricole e foreste ma anche sulle discariche, le aree percorse dal fuoco ed il verde urbano.
Visto che dal 2000 in poi l'accuratezza geometrica del dato CLC è aumentata considerevolmente, le analisi di dettaglio che seguono si concentreranno sulla differenza tra 2000 e 2018.
# Dati 1990
focus_1990 = clc1990_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_1990']]
focus_1990.set_index('label3', inplace=True)
focus_1990_group = pd.DataFrame(focus_1990.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_1990'].sum())
focus_1990_group.reset_index(inplace=True)
# Dati 2000
focus_2000 = clc2000_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2000']]
focus_2000.set_index('label3', inplace=True)
focus_2000_group = pd.DataFrame(focus_2000.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2000'].sum())
focus_2000_group.reset_index(inplace=True)
# Dati 2006
focus_2006 = clc2006_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2006']]
focus_2006.set_index('label3', inplace=True)
focus_2006_group = pd.DataFrame(focus_2006.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2006'].sum())
focus_2006_group.reset_index(inplace=True)
# Dati 2012
focus_2012 = clc2012_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2012']]
focus_2012.set_index('label3', inplace=True)
focus_2012_group = pd.DataFrame(focus_2012.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2012'].sum())
focus_2012_group.reset_index(inplace=True)
# Dati 2018
focus_2018 = clc2018_campania[['pro_com', 'comune', 'provincia', 'sup_com_ha', 'label3', 'surface_ha_2018']]
focus_2018.set_index('label3', inplace=True)
focus_2018_group = pd.DataFrame(focus_2018.groupby(['pro_com', 'comune', 'sup_com_ha', 'label3'])['surface_ha_2018'].sum())
focus_2018_group.reset_index(inplace=True)
focus_1990_group
pro_com | comune | sup_com_ha | label3 | surface_ha_1990 | |
---|---|---|---|---|---|
0 | 61001.0 | Ailano | 1605.560469 | Broad-leaved forest | 472.5747 |
1 | 61001.0 | Ailano | 1605.560469 | Complex cultivation patterns | 93.2780 |
2 | 61001.0 | Ailano | 1605.560469 | Continuous urban fabric | 31.0972 |
3 | 61001.0 | Ailano | 1605.560469 | Land principally occupied by agriculture, with... | 188.9317 |
4 | 61001.0 | Ailano | 1605.560469 | Non-irrigated arable land | 752.7540 |
... | ... | ... | ... | ... | ... |
4543 | 65158.0 | Bellizzi | 802.200746 | Continuous urban fabric | 93.9079 |
4544 | 65158.0 | Bellizzi | 802.200746 | Discontinuous urban fabric | 40.9309 |
4545 | 65158.0 | Bellizzi | 802.200746 | Fruit trees and berry plantations | 24.3220 |
4546 | 65158.0 | Bellizzi | 802.200746 | Non-irrigated arable land | 426.7024 |
4547 | 65158.0 | Bellizzi | 802.200746 | Vineyards | 33.8787 |
4548 rows × 5 columns
2.3.1 Aree artificiali¶
I gruppi 1.1 ed 1.2 della CLC
# Dati 1990
artificial_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_1990_group = pd.DataFrame(artificial_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
artificial_surface_1990_group.reset_index(inplace=True)
# Dati 2000
artificial_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2000_group = pd.DataFrame(artificial_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
artificial_surface_2000_group.reset_index(inplace=True)
# Dati 2006
artificial_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2006_group = pd.DataFrame(artificial_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
artificial_surface_2006_group.reset_index(inplace=True)
# Dati 2012
artificial_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2012_group = pd.DataFrame(artificial_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
artificial_surface_2012_group.reset_index(inplace=True)
# Dati 2018
artificial_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Continuous urban fabric', 'Discontinuous urban fabric', 'Industrial or commercial units', 'Road and rail networks and associated land', 'Port areas', 'Airports'])]
artificial_surface_2018_group = pd.DataFrame(artificial_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
artificial_surface_2018_group.reset_index(inplace=True)
# Dati aggregati
focus_artificial = [artificial_surface_2018_group, artificial_surface_2012_group, artificial_surface_2006_group, artificial_surface_2000_group, artificial_surface_1990_group]
focus_artificial_df = reduce(lambda left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_artificial)
focus_artificial_df = focus_artificial_df[focus_artificial_df['sup_com_ha'] > 0]
focus_artificial_df.fillna(0, inplace=True)
focus_artificial_df.insert(loc=3, column='perc_1990', value=round(focus_artificial_df.surface_ha_1990 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=4, column='perc_2000', value=round(focus_artificial_df.surface_ha_2000 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=5, column='perc_2006', value=round(focus_artificial_df.surface_ha_2006 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=6, column='perc_2012', value=round(focus_artificial_df.surface_ha_2012 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=7, column='perc_2018', value=round(focus_artificial_df.surface_ha_2018 / focus_artificial_df.sup_com_ha, 4) * 100)
focus_artificial_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_artificial_df.perc_2018 - focus_artificial_df.perc_2000))
focus_artificial_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
focus_artificial_df
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
201 | 63036.0 | Grumo Nevano | 287.688759 | 47.45 | 64.93 | 64.93 | 51.31 | 51.31 | -13.62 | 147.6065 | 147.6065 | 186.8019 | 186.8019 | 136.5066 |
232 | 63067.0 | San Giorgio a Cremano | 415.383936 | 60.96 | 76.57 | 68.51 | 68.51 | 68.51 | -8.06 | 284.5767 | 284.5767 | 284.5768 | 318.0615 | 253.2174 |
197 | 63032.0 | Frattamaggiore | 538.816178 | 58.54 | 71.14 | 72.46 | 63.97 | 63.97 | -7.17 | 344.6705 | 344.6705 | 390.4469 | 383.2980 | 315.4185 |
476 | 65121.0 | San Mango Piemonte | 602.370147 | 7.81 | 7.81 | 3.14 | 3.14 | 3.14 | -4.67 | 18.8890 | 18.8890 | 18.8890 | 47.0198 | 47.0222 |
137 | 62046.0 | Pago Veiano | 2374.895020 | 1.83 | 5.24 | 2.13 | 2.13 | 2.13 | -3.11 | 50.6037 | 50.6037 | 50.6037 | 124.5097 | 43.5550 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
228 | 63063.0 | Quarto | 1415.896056 | 24.40 | 24.95 | 26.90 | 39.26 | 39.26 | 14.31 | 555.9065 | 555.9065 | 380.8373 | 353.2075 | 345.4612 |
254 | 63089.0 | Volla | 620.630205 | 45.68 | 49.86 | 49.94 | 64.34 | 64.34 | 14.48 | 399.3008 | 399.3008 | 309.9351 | 309.4482 | 283.5034 |
212 | 63047.0 | Monte di Procida | 370.428037 | 31.25 | 31.25 | 31.25 | 48.28 | 48.28 | 17.03 | 178.8412 | 178.8412 | 115.7459 | 115.7458 | 115.7439 |
190 | 63025.0 | Castello di Cisterna | 392.135970 | 21.89 | 46.04 | 68.31 | 68.31 | 68.31 | 22.27 | 267.8514 | 267.8514 | 267.8514 | 180.5292 | 85.8311 |
380 | 65011.0 | Atrani | 12.061182 | 0.00 | 0.00 | 52.01 | 52.01 | 52.01 | 52.01 | 6.2730 | 6.2730 | 6.2730 | 0.0000 | 0.0000 |
507 rows × 14 columns
# Superfici in arretramento
reduction_artificial_area = focus_artificial_df.iloc[0:10]
reduction_artificial_area
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
201 | 63036.0 | Grumo Nevano | 287.688759 | 47.45 | 64.93 | 64.93 | 51.31 | 51.31 | -13.62 | 147.6065 | 147.6065 | 186.8019 | 186.8019 | 136.5066 |
232 | 63067.0 | San Giorgio a Cremano | 415.383936 | 60.96 | 76.57 | 68.51 | 68.51 | 68.51 | -8.06 | 284.5767 | 284.5767 | 284.5768 | 318.0615 | 253.2174 |
197 | 63032.0 | Frattamaggiore | 538.816178 | 58.54 | 71.14 | 72.46 | 63.97 | 63.97 | -7.17 | 344.6705 | 344.6705 | 390.4469 | 383.2980 | 315.4185 |
476 | 65121.0 | San Mango Piemonte | 602.370147 | 7.81 | 7.81 | 3.14 | 3.14 | 3.14 | -4.67 | 18.8890 | 18.8890 | 18.8890 | 47.0198 | 47.0222 |
137 | 62046.0 | Pago Veiano | 2374.895020 | 1.83 | 5.24 | 2.13 | 2.13 | 2.13 | -3.11 | 50.6037 | 50.6037 | 50.6037 | 124.5097 | 43.5550 |
485 | 65132.0 | San Valentino Torio | 915.632363 | 15.51 | 15.56 | 13.27 | 13.27 | 13.27 | -2.29 | 121.4587 | 121.4587 | 121.4588 | 142.4372 | 141.9949 |
4 | 61005.0 | Aversa | 885.176217 | 59.33 | 67.87 | 67.96 | 66.24 | 66.24 | -1.63 | 586.3294 | 586.3294 | 601.5394 | 600.7846 | 525.1697 |
170 | 63005.0 | Arzano | 473.103075 | 83.22 | 86.97 | 87.40 | 85.42 | 85.42 | -1.55 | 404.1348 | 404.1348 | 413.4904 | 411.4785 | 393.7116 |
474 | 65119.0 | San Giovanni a Piro | 3790.148485 | 2.12 | 4.21 | 2.72 | 2.72 | 2.72 | -1.49 | 103.0783 | 103.0783 | 103.0783 | 159.6782 | 80.3555 |
57 | 61067.0 | Recale | 321.954739 | 32.81 | 32.81 | 31.54 | 31.54 | 31.54 | -1.27 | 101.5467 | 101.5467 | 101.5467 | 105.6199 | 105.6193 |
# Superfici in avanzamento
increase_artificial_area = focus_artificial_df.iloc[-10:]
increase_artificial_area.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
increase_artificial_area
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
380 | 65011.0 | Atrani | 12.061182 | 0.00 | 0.00 | 52.01 | 52.01 | 52.01 | 52.01 | 6.2730 | 6.2730 | 6.2730 | 0.0000 | 0.0000 |
190 | 63025.0 | Castello di Cisterna | 392.135970 | 21.89 | 46.04 | 68.31 | 68.31 | 68.31 | 22.27 | 267.8514 | 267.8514 | 267.8514 | 180.5292 | 85.8311 |
212 | 63047.0 | Monte di Procida | 370.428037 | 31.25 | 31.25 | 31.25 | 48.28 | 48.28 | 17.03 | 178.8412 | 178.8412 | 115.7459 | 115.7458 | 115.7439 |
254 | 63089.0 | Volla | 620.630205 | 45.68 | 49.86 | 49.94 | 64.34 | 64.34 | 14.48 | 399.3008 | 399.3008 | 309.9351 | 309.4482 | 283.5034 |
228 | 63063.0 | Quarto | 1415.896056 | 24.40 | 24.95 | 26.90 | 39.26 | 39.26 | 14.31 | 555.9065 | 555.9065 | 380.8373 | 353.2075 | 345.4612 |
82 | 61094.0 | Trentola Ducenta | 665.513019 | 30.18 | 30.19 | 31.44 | 44.05 | 44.05 | 13.86 | 293.1760 | 293.1760 | 209.2403 | 200.8859 | 200.8848 |
15 | 61016.0 | Carinaro | 631.593670 | 28.55 | 34.93 | 44.25 | 47.41 | 47.41 | 12.48 | 299.4077 | 299.4077 | 279.4878 | 220.6269 | 180.3185 |
80 | 61092.0 | Teverola | 669.906081 | 31.59 | 37.22 | 50.70 | 48.78 | 48.78 | 11.56 | 326.7535 | 326.7535 | 339.6324 | 249.3457 | 211.6063 |
188 | 63023.0 | Casoria | 1213.840286 | 57.66 | 72.14 | 72.14 | 83.48 | 83.48 | 11.34 | 1013.2593 | 1013.2593 | 875.7210 | 875.7214 | 699.8511 |
123 | 62032.0 | Forchia | 545.454120 | 0.00 | 0.00 | 0.00 | 11.00 | 11.00 | 11.00 | 59.9761 | 59.9761 | 0.0000 | 0.0000 | 0.0000 |
artificial_df = pd.concat([reduction_artificial_area, increase_artificial_area])
artificial_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
artificial_df = artificial_df[['comune', 'Perc.Diff. | 2018-2000']]
artificial_df['Perc.Diff. | 2018-2000'] = artificial_df['Perc.Diff. | 2018-2000']
artificial_df.set_index('comune', inplace=True)
fig_artificial = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_artificial = GridSpec(nrows=1, ncols=1, figure=fig_artificial, hspace=0.35)
ax_artificial = fig_artificial.add_subplot(sub_fig_artificial[0, 0])
artificial_df.plot.bar(ax=ax_artificial, rot=0)
ax_artificial.yaxis.set_label_text('%')
ax_artificial.set_xlabel('')
ax_artificial.grid(color='lightgrey', linestyle='dashdot')
plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7f13b50e6e60>
Onestamente non so come interpretare l'arretramento delle aree artificiali, andrebbe fatta una ulteriore analisi per valutare se sono Comuni che si sono spopolati in quasi trenta anni.
L'aumento è abbastanza facile da indagare per me che sono del posto. Napoli ha una popolazione di quasi un milione di abitanti che triplica nei giorni feriali, per non parlare poi dei turisti. E' un'area molto congestionata con possibilità di nuova edilizia prossime allo zero; risulta normale quindi che Comuni più prossimi al Capoluogo di Regione stiano accogliendo "l'esubero" di popolazione. Faccio riferimento a Castello di Cisterna, Volla e Quarto.
Il caso di Atrani è particolare perchè è il Comune più piccolo d'Italia ed è posto in una zona abbastanza impervia della costiera amalfitana; è probabile che nel 2000 non si sia data molta importanza all'area.
2.3.2 Aree forestate¶
Il gruppo 3.1 della CLC
# Dati 1990
forest_surface_1990 = focus_1990_group[focus_1990_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_1990_group = pd.DataFrame(forest_surface_1990.groupby(['pro_com'])['surface_ha_1990'].sum())
forest_surface_1990_group.reset_index(inplace=True)
# Dati 2000
forest_surface_2000 = focus_2000_group[focus_2000_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2000_group = pd.DataFrame(forest_surface_2000.groupby(['pro_com'])['surface_ha_2000'].sum())
forest_surface_2000_group.reset_index(inplace=True)
# Dati 2006
forest_surface_2006 = focus_2006_group[focus_2006_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2006_group = pd.DataFrame(forest_surface_2006.groupby(['pro_com'])['surface_ha_2006'].sum())
forest_surface_2006_group.reset_index(inplace=True)
# Dati 2012
forest_surface_2012 = focus_2012_group[focus_2012_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2012_group = pd.DataFrame(forest_surface_2012.groupby(['pro_com'])['surface_ha_2012'].sum())
forest_surface_2012_group.reset_index(inplace=True)
# Dati 2018
forest_surface_2018 = focus_2018_group[focus_2018_group['label3'].isin(['Broad-leaved forest', 'Coniferous forest', 'Mixed forest'])]
forest_surface_2018_group = pd.DataFrame(forest_surface_2018.groupby(['pro_com', 'comune', 'sup_com_ha'])['surface_ha_2018'].sum())
forest_surface_2018_group.reset_index(inplace=True)
# Dati aggregati
focus_forest = [forest_surface_2018_group, forest_surface_2012_group, forest_surface_2006_group, forest_surface_2000_group, forest_surface_1990_group]
focus_forest_df = reduce(lambda left,right: pd.merge(left,right,on=['pro_com'], how='outer'), focus_forest)
focus_forest_df = focus_forest_df[focus_forest_df['sup_com_ha'] > 0]
focus_forest_df.fillna(0, inplace=True)
focus_forest_df.insert(loc=3, column='perc_1990', value=round(focus_forest_df.surface_ha_1990 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=4, column='perc_2000', value=round(focus_forest_df.surface_ha_2000 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=5, column='perc_2006', value=round(focus_forest_df.surface_ha_2006 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=6, column='perc_2012', value=round(focus_forest_df.surface_ha_2012 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=7, column='perc_2018', value=round(focus_forest_df.surface_ha_2018 / focus_forest_df.sup_com_ha, 4) * 100)
focus_forest_df.insert(loc=8, column='Perc.Diff. | 2018-2000', value=(focus_forest_df.perc_2018 - focus_forest_df.perc_2000))
focus_forest_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
focus_forest_df
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
139 | 62073.0 | Solopaca | 3112.664003 | 43.63 | 43.63 | 43.46 | 11.69 | 11.69 | -31.94 | 363.9901 | 363.9901 | 1352.7210 | 1358.0359 | 1358.0275 |
143 | 62077.0 | Vitulano | 3599.050416 | 50.86 | 50.81 | 50.81 | 26.82 | 26.82 | -23.99 | 965.1276 | 965.1276 | 1828.5273 | 1828.5272 | 1830.3353 |
410 | 65115.0 | Salento | 2378.507005 | 51.73 | 50.93 | 37.94 | 37.93 | 37.93 | -13.00 | 902.2741 | 902.2741 | 902.4736 | 1211.3768 | 1230.4272 |
179 | 63082.0 | Terzigno | 2346.480829 | 20.68 | 20.68 | 20.68 | 20.68 | 8.01 | -12.67 | 187.8420 | 485.2334 | 485.2333 | 485.2338 | 485.2356 |
147 | 63007.0 | Barano d'Ischia | 1096.089426 | 49.21 | 49.21 | 49.21 | 38.59 | 38.59 | -10.62 | 422.9915 | 422.9915 | 539.3662 | 539.3660 | 539.3685 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
439 | 65147.0 | Torchiara | 846.167482 | 20.76 | 20.76 | 20.86 | 29.14 | 29.14 | 8.38 | 246.5860 | 246.5860 | 176.5072 | 175.6504 | 175.6495 |
436 | 65144.0 | Stella Cilento | 1451.726154 | 39.51 | 43.25 | 43.25 | 52.64 | 52.64 | 9.39 | 764.2043 | 764.2043 | 627.8681 | 627.8690 | 573.5525 |
393 | 65098.0 | Pollica | 2816.525386 | 11.44 | 17.14 | 17.15 | 27.01 | 27.01 | 9.87 | 760.6785 | 760.6785 | 482.9555 | 482.8660 | 322.2088 |
359 | 65064.0 | Lustra | 1524.153297 | 34.01 | 34.02 | 34.02 | 44.61 | 44.61 | 10.59 | 679.9189 | 679.9189 | 518.4959 | 518.4971 | 518.4368 |
408 | 65113.0 | Sacco | 2365.702940 | 42.11 | 42.02 | 42.02 | 63.01 | 63.01 | 20.99 | 1490.6391 | 1490.6391 | 994.0414 | 994.0408 | 996.2456 |
450 rows × 14 columns
# Superfici in arretramento
reduction_forest_area = focus_forest_df.iloc[0:10]
reduction_forest_area
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
139 | 62073.0 | Solopaca | 3112.664003 | 43.63 | 43.63 | 43.46 | 11.69 | 11.69 | -31.94 | 363.9901 | 363.9901 | 1352.7210 | 1358.0359 | 1358.0275 |
143 | 62077.0 | Vitulano | 3599.050416 | 50.86 | 50.81 | 50.81 | 26.82 | 26.82 | -23.99 | 965.1276 | 965.1276 | 1828.5273 | 1828.5272 | 1830.3353 |
410 | 65115.0 | Salento | 2378.507005 | 51.73 | 50.93 | 37.94 | 37.93 | 37.93 | -13.00 | 902.2741 | 902.2741 | 902.4736 | 1211.3768 | 1230.4272 |
179 | 63082.0 | Terzigno | 2346.480829 | 20.68 | 20.68 | 20.68 | 20.68 | 8.01 | -12.67 | 187.8420 | 485.2334 | 485.2333 | 485.2338 | 485.2356 |
147 | 63007.0 | Barano d'Ischia | 1096.089426 | 49.21 | 49.21 | 49.21 | 38.59 | 38.59 | -10.62 | 422.9915 | 422.9915 | 539.3662 | 539.3660 | 539.3685 |
304 | 65006.0 | Amalfi | 570.014402 | 48.51 | 48.51 | 38.86 | 38.86 | 38.86 | -9.65 | 221.4838 | 221.4838 | 221.4838 | 276.5111 | 276.5144 |
170 | 63064.0 | Ercolano | 1989.359843 | 21.47 | 21.26 | 21.26 | 17.39 | 11.75 | -9.51 | 233.6730 | 345.9226 | 422.9398 | 422.9397 | 427.1795 |
155 | 63035.0 | Gragnano | 1464.244074 | 53.35 | 53.35 | 52.42 | 44.07 | 44.07 | -9.28 | 645.3063 | 645.3063 | 767.6083 | 781.1773 | 781.1751 |
159 | 63041.0 | Marano di Napoli | 1565.253641 | 13.09 | 13.09 | 13.09 | 3.98 | 3.98 | -9.11 | 62.3734 | 62.3734 | 204.9146 | 204.9145 | 204.9150 |
183 | 63091.0 | Trecase | 621.312671 | 8.86 | 8.86 | 8.86 | 8.86 | 0.08 | -8.78 | 0.4777 | 55.0368 | 55.0368 | 55.0368 | 55.0371 |
# Superfici in avanzamento
increase_forest_area = focus_forest_df.iloc[-10:]
increase_forest_area.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=False, inplace=True)
increase_forest_area
pro_com | comune | sup_com_ha | perc_1990 | perc_2000 | perc_2006 | perc_2012 | perc_2018 | Perc.Diff. | 2018-2000 | surface_ha_2018 | surface_ha_2012 | surface_ha_2006 | surface_ha_2000 | surface_ha_1990 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
408 | 65113.0 | Sacco | 2365.702940 | 42.11 | 42.02 | 42.02 | 63.01 | 63.01 | 20.99 | 1490.6391 | 1490.6391 | 994.0414 | 994.0408 | 996.2456 |
359 | 65064.0 | Lustra | 1524.153297 | 34.01 | 34.02 | 34.02 | 44.61 | 44.61 | 10.59 | 679.9189 | 679.9189 | 518.4959 | 518.4971 | 518.4368 |
393 | 65098.0 | Pollica | 2816.525386 | 11.44 | 17.14 | 17.15 | 27.01 | 27.01 | 9.87 | 760.6785 | 760.6785 | 482.9555 | 482.8660 | 322.2088 |
436 | 65144.0 | Stella Cilento | 1451.726154 | 39.51 | 43.25 | 43.25 | 52.64 | 52.64 | 9.39 | 764.2043 | 764.2043 | 627.8681 | 627.8690 | 573.5525 |
439 | 65147.0 | Torchiara | 846.167482 | 20.76 | 20.76 | 20.86 | 29.14 | 29.14 | 8.38 | 246.5860 | 246.5860 | 176.5072 | 175.6504 | 175.6495 |
405 | 65110.0 | Romagnano al Monte | 966.995480 | 18.35 | 18.35 | 18.35 | 26.64 | 26.64 | 8.29 | 257.5984 | 257.5984 | 177.4251 | 177.4254 | 177.4249 |
151 | 63022.0 | Casola di Napoli | 259.318212 | 34.28 | 34.28 | 42.15 | 42.15 | 42.15 | 7.87 | 109.3078 | 109.3078 | 109.3078 | 88.8917 | 88.8916 |
102 | 62036.0 | Ginestra degli Schiavoni | 1478.706162 | 22.20 | 22.20 | 22.20 | 29.90 | 29.90 | 7.70 | 442.1457 | 442.1457 | 328.2494 | 328.2500 | 328.2562 |
229 | 64045.0 | Luogosano | 606.809422 | 10.43 | 12.63 | 12.63 | 18.42 | 18.42 | 5.79 | 111.7932 | 111.7932 | 76.6287 | 76.6287 | 63.2980 |
355 | 65060.0 | Laureana Cilento | 1374.420460 | 25.62 | 25.64 | 25.64 | 30.10 | 31.15 | 5.51 | 428.1047 | 413.7489 | 352.3810 | 352.3819 | 352.1644 |
forest_df = pd.concat([reduction_forest_area, increase_forest_area])
forest_df.sort_values(by=['Perc.Diff. | 2018-2000'], ascending=True, inplace=True)
forest_df = forest_df[['comune', 'Perc.Diff. | 2018-2000']]
forest_df['Perc.Diff. | 2018-2000'] = forest_df['Perc.Diff. | 2018-2000']
forest_df.set_index('comune', inplace=True)
fig_forest = plt.figure(figsize=(20, 10), dpi=100)
sub_fig_forest = GridSpec(nrows=1, ncols=1, figure=fig_forest, hspace=0.35)
ax_forest = fig_forest.add_subplot(sub_fig_forest[0, 0])
forest_df.plot.bar(ax=ax_forest, rot=0)
ax_forest.yaxis.set_label_text('%')
ax_forest.set_xlabel('')
ax_forest.grid(color='lightgrey', linestyle='dashdot')
plt.xticks(rotation = 90)
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x7f13b1292cb0>