Analyse d’une matrice sur base de polygones prédéfinis

Import des modules

[ ]:
# import _add_path # for debugging purposes only - can be removed in production

try:
    from wolfhece import is_enough
    if not is_enough('2.2.31'):
        raise ImportError("Please update wolfhece to at least version 2.2.31")
except ImportError:
    raise ImportError("Please install the required version of wolfhece: pip install wolfhece>=2.2.30")

from wolfhece.analyze_poly import Array_analysis_polygons, Array_analysis_onepolygon
from wolfhece.wolf_array import WolfArray, header_wolf
from wolfhece.PyVertexvectors import vector, zone, Zones, wolfvertex as wv

import matplotlib.pyplot as plt
import numpy as np

Création d’une matrice de variables aléatoires

[2]:
h = header_wolf()
h.set_origin(25, 55) # Set the origin (lower-left) of the array
h.set_resolution(0.5 , 0.5) # Set the resolution of the array
h.shape = (1000, 2000) # Set the shape of the array (cells along x and y axes)

a = WolfArray(srcheader= h)

a.array[:,:] = np.random.rand(1000, 2000) * 10
a.mask_lower(5.)
a.set_nullvalue_in_mask()

a.plot_matplotlib(with_legend= True)
print("Number of values in the array:", a.nbnotnull)
Number of values in the array: 1000895
../_images/tutorials_analyze_polygons_4_1.png

Création de polygones d’analyse

Pour l’exemple, on va définir des polygones réguliers de 50 m x 50 m couvrant toute la matrice.

[3]:
nbx = 1000. * .5 / 50. # Number of polygons along x axis
nby = 2000. * .5 / 50. # Number of polygons along y axis
print(f"Number of polygons along x: {nbx}, y: {nby}")
print(f"Total number of polygons: {nbx * nby}")

# Create polygons
zone_poly = zone(name = 'polygons')
for i in range(int(nbx)):
    for j in range(int(nby)):
        x = i * 50. + 25.  # Offset by the origin
        y = j * 50. + 55.  # Offset by the origin
        poly = vector(name=f'Polygon_{i}_{j}', parentzone=zone_poly)
        poly.add_vertices_from_array(np.array([[x, y],
                                              [x + 50, y],
                                              [x + 50, y + 50],
                                              [x, y + 50]]))
        poly.force_to_close()  # Ensure the polygon is closed
        zone_poly.add_vector(poly)

fig, ax = plt.subplots(figsize=(10, 10))
a.plot_matplotlib(figax = (fig, ax))
zone_poly.plot_matplotlib(ax)
ax.set_aspect('equal')
Number of polygons along x: 10.0, y: 20.0
Total number of polygons: 200.0
../_images/tutorials_analyze_polygons_6_1.png

Création de l’objet d’analyse

[4]:
analyze = Array_analysis_polygons(a, zone_poly)

Analyse des polygones

  • Comptage du nombre de polygones avec des valeurs strictement positives

  • Histogramme des valeurs moyennes par polygone

  • Histogramme des valeurs médianes par polygone

  • Distribution des volumes par polygone

[5]:
analyze.count_strictly_positive()

analyze.plot_distributed_values(bins = [0., 5., 6, 7.5, 9., 10.], operator= 'Mean')
analyze.plot_distributed_values(bins = [0., 5., 6, 7.5, 9., 10.], operator= 'Median')

dist = analyze.values('Volume')
dist.sort_values(inplace=True)
dist.plot()
../_images/tutorials_analyze_polygons_10_0.png
../_images/tutorials_analyze_polygons_10_1.png
[5]:
<Axes: >
../_images/tutorials_analyze_polygons_10_3.png

Analyse d’un polygone spécifique

Il est possible de générer un graphique pour chaque polygone.

Au besoin, les clés des polygones peuvent être récupérées avec la propriété keys.

[6]:
analyze.keys
[6]:
['Polygon_0_0',
 'Polygon_0_1',
 'Polygon_0_2',
 'Polygon_0_3',
 'Polygon_0_4',
 'Polygon_0_5',
 'Polygon_0_6',
 'Polygon_0_7',
 'Polygon_0_8',
 'Polygon_0_9',
 'Polygon_0_10',
 'Polygon_0_11',
 'Polygon_0_12',
 'Polygon_0_13',
 'Polygon_0_14',
 'Polygon_0_15',
 'Polygon_0_16',
 'Polygon_0_17',
 'Polygon_0_18',
 'Polygon_0_19',
 'Polygon_1_0',
 'Polygon_1_1',
 'Polygon_1_2',
 'Polygon_1_3',
 'Polygon_1_4',
 'Polygon_1_5',
 'Polygon_1_6',
 'Polygon_1_7',
 'Polygon_1_8',
 'Polygon_1_9',
 'Polygon_1_10',
 'Polygon_1_11',
 'Polygon_1_12',
 'Polygon_1_13',
 'Polygon_1_14',
 'Polygon_1_15',
 'Polygon_1_16',
 'Polygon_1_17',
 'Polygon_1_18',
 'Polygon_1_19',
 'Polygon_2_0',
 'Polygon_2_1',
 'Polygon_2_2',
 'Polygon_2_3',
 'Polygon_2_4',
 'Polygon_2_5',
 'Polygon_2_6',
 'Polygon_2_7',
 'Polygon_2_8',
 'Polygon_2_9',
 'Polygon_2_10',
 'Polygon_2_11',
 'Polygon_2_12',
 'Polygon_2_13',
 'Polygon_2_14',
 'Polygon_2_15',
 'Polygon_2_16',
 'Polygon_2_17',
 'Polygon_2_18',
 'Polygon_2_19',
 'Polygon_3_0',
 'Polygon_3_1',
 'Polygon_3_2',
 'Polygon_3_3',
 'Polygon_3_4',
 'Polygon_3_5',
 'Polygon_3_6',
 'Polygon_3_7',
 'Polygon_3_8',
 'Polygon_3_9',
 'Polygon_3_10',
 'Polygon_3_11',
 'Polygon_3_12',
 'Polygon_3_13',
 'Polygon_3_14',
 'Polygon_3_15',
 'Polygon_3_16',
 'Polygon_3_17',
 'Polygon_3_18',
 'Polygon_3_19',
 'Polygon_4_0',
 'Polygon_4_1',
 'Polygon_4_2',
 'Polygon_4_3',
 'Polygon_4_4',
 'Polygon_4_5',
 'Polygon_4_6',
 'Polygon_4_7',
 'Polygon_4_8',
 'Polygon_4_9',
 'Polygon_4_10',
 'Polygon_4_11',
 'Polygon_4_12',
 'Polygon_4_13',
 'Polygon_4_14',
 'Polygon_4_15',
 'Polygon_4_16',
 'Polygon_4_17',
 'Polygon_4_18',
 'Polygon_4_19',
 'Polygon_5_0',
 'Polygon_5_1',
 'Polygon_5_2',
 'Polygon_5_3',
 'Polygon_5_4',
 'Polygon_5_5',
 'Polygon_5_6',
 'Polygon_5_7',
 'Polygon_5_8',
 'Polygon_5_9',
 'Polygon_5_10',
 'Polygon_5_11',
 'Polygon_5_12',
 'Polygon_5_13',
 'Polygon_5_14',
 'Polygon_5_15',
 'Polygon_5_16',
 'Polygon_5_17',
 'Polygon_5_18',
 'Polygon_5_19',
 'Polygon_6_0',
 'Polygon_6_1',
 'Polygon_6_2',
 'Polygon_6_3',
 'Polygon_6_4',
 'Polygon_6_5',
 'Polygon_6_6',
 'Polygon_6_7',
 'Polygon_6_8',
 'Polygon_6_9',
 'Polygon_6_10',
 'Polygon_6_11',
 'Polygon_6_12',
 'Polygon_6_13',
 'Polygon_6_14',
 'Polygon_6_15',
 'Polygon_6_16',
 'Polygon_6_17',
 'Polygon_6_18',
 'Polygon_6_19',
 'Polygon_7_0',
 'Polygon_7_1',
 'Polygon_7_2',
 'Polygon_7_3',
 'Polygon_7_4',
 'Polygon_7_5',
 'Polygon_7_6',
 'Polygon_7_7',
 'Polygon_7_8',
 'Polygon_7_9',
 'Polygon_7_10',
 'Polygon_7_11',
 'Polygon_7_12',
 'Polygon_7_13',
 'Polygon_7_14',
 'Polygon_7_15',
 'Polygon_7_16',
 'Polygon_7_17',
 'Polygon_7_18',
 'Polygon_7_19',
 'Polygon_8_0',
 'Polygon_8_1',
 'Polygon_8_2',
 'Polygon_8_3',
 'Polygon_8_4',
 'Polygon_8_5',
 'Polygon_8_6',
 'Polygon_8_7',
 'Polygon_8_8',
 'Polygon_8_9',
 'Polygon_8_10',
 'Polygon_8_11',
 'Polygon_8_12',
 'Polygon_8_13',
 'Polygon_8_14',
 'Polygon_8_15',
 'Polygon_8_16',
 'Polygon_8_17',
 'Polygon_8_18',
 'Polygon_8_19',
 'Polygon_9_0',
 'Polygon_9_1',
 'Polygon_9_2',
 'Polygon_9_3',
 'Polygon_9_4',
 'Polygon_9_5',
 'Polygon_9_6',
 'Polygon_9_7',
 'Polygon_9_8',
 'Polygon_9_9',
 'Polygon_9_10',
 'Polygon_9_11',
 'Polygon_9_12',
 'Polygon_9_13',
 'Polygon_9_14',
 'Polygon_9_15',
 'Polygon_9_16',
 'Polygon_9_17',
 'Polygon_9_18',
 'Polygon_9_19']
[7]:
i = 0
j = 0
all_plots = analyze[f'Polygon_{i}_{j}'].plot_values()

i = 8
j = 15
all_plots = analyze[f'Polygon_{i}_{j}'].plot_values()
../_images/tutorials_analyze_polygons_13_0.png
../_images/tutorials_analyze_polygons_13_1.png

Modification des valeurs analysées via le masque de la matrice

Masquage d’une tranche de la matrice et recaclcul des valeurs des polygones.

[8]:
a.array.mask[(a.array > 7.) & (a.array < 8.)] = True
analyze.update_values()

i = 8
j = 15
all_plots = analyze[f'Polygon_{i}_{j}'].plot_values()
../_images/tutorials_analyze_polygons_15_0.png