Bonjour,

Tous d'abord une première question, est t il possible de créer des couleurs avec valeurs discrètes sur une carte gérer par une liste déroulante avec plotly ?

J'ai essayé pas mal de choses et trouvé aucun exemple sur le net où je pourrais me dire "ok, c'est possible".

J'ai un dataframe avec une répartition d’espèces par département et un statut associé.

Donc je boucle sur chaque espèce pour pouvoir afficher les départements et avoir les statuts (au nombre de 3 modalités) sur la symbologie.

Dans les faits , avec le code suivant j'ai bien ma carte . Par contre impossible de faire correspondre les valeurs du champ avec les couleurs.

si j'ai 10 département avec statut 1 et deux avec statuts 2 et un dep avec statut 3..

Le compte des couleurs affichée est respecté mais cela ne correspond pas au valeur de champs. C'est mélangé.

Si quelqu'un à une idée ? (et si au final ce n'est pas possible alors j'ai perdu mon temps :-) (j'ai pu le faire avec dash mais je préférerais le résultat émis par plotly)t

Merci d'avance...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import plotly.graph_objects as go
import pandas as pd
 
 
 
species = sorted(list(data['esp'].unique()))
 
 
 
status_colors = {
    1: 'red',
    2: 'green',
    3: 'blue'
}
colorscales = [[status / (len(status_colors) - 1), color] for status, color in enumerate(status_colors.values())]
 
 
 
 
 
text = data.apply(lambda row:  f"Code département: {str(row['dept'])}"
 
                                        , axis=1)
# Créez la figure initiale
fig = go.Figure()
 
# Ajoutez des traces pour chaque espèce
for specie in species:
    df_temp = data[data['esp'] == specie]
 
    fig.add_trace(go.Choroplethmapbox(
        featureidkey="properties.code",  # Clé du JSON pour la jointure avec la data
        geojson=dep_data,  # GeoJSON du département 
        locations=df_temp.dept,  # Clé de la data pour la jointure
        z=df_temp.category_numeric,# valeurs du champ qui correspond à 0.0, 0.5, 1.0
        colorscale=colorscales,# valeurs obtenue pour correspondre à df_temp.category_numeric
        colorbar=dict(
        tick0=0,
        dtick=1),#'viridis',  # Palette de couleurs colorscales,#
        #reversescale=True,  # Inverse la montée de valeur sur la barre de couleurs
        marker_opacity=0.6,  # Transparence de la figure (entre 0 et 1)
        text=text,#df_temp['some_field'],  # Champ de texte affiché au passage de la souris
        hoverinfo="text",  # Doit être associé à la variable text ci-dessus
        marker_line_width=0.8,  # Taille du contour de département
        visible=(specie==species[0]),  #paramètre pour afficher que la première espèces de la liste   deroulante            
        showscale=True,  # Par défaut, l'échelle (barre de couleur) est visible
    ))
 
#boutons de liste déroulante pour les espèces
buttons = []
 
 
for specie in species:
    visible = [False] * len(species)
    visible[species.index(specie)] = True
    buttons.append(dict(label=specie, method='update', args=[{'visible': visible}]))
 
updatemenus = [{'buttons': buttons,
                'direction': 'down',
                'showactive': True,
                'x': 0,
                'y': 1.1,
                'xanchor': 'left'
               }]
 
# Configurez les mises à jour de la figure
fig.update_layout(
    title={
        'text': f'Programme test',
        'xref': 'paper',
        'y': 0.95,
        'x': 0,
        'xanchor': 'left',
        'yanchor': 'bottom',
    },
    updatemenus=updatemenus,
    height=700, width=800,
    mapbox=dict(
        style="open-street-map",
        zoom=4, 
        center={"lat": 46, "lon": 2}
))
 
fig.show()