Skip to content

antonin-lfv/Plotly_tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Plotly tutorial - Data analysis and Machine learning


Ce repo à pour objectif de présenter le module Plotly qui est l'un des modules les plus utilisés pour faire de la visualisation de données avec Python. Plotly étant le plus compliqué mais également le plus interactif. Il est construit sur 3 composantes principales, à savoir plotly.express qui est basé sur l'utilisation des dataframes pandas, et qui est simple et rapide, et plotly.graph_objects qui est beaucoup plus puissant, et beaucoup plus personnalisable, il est basé sur la POO et plotly.figure_factory qui est dédiée à la création de figure spécifiques qui seraient trop compliqué à developper avec les 2 autres composantes. Dans ce README toutes les fonctions seront accompagnées du résultat. Le code complet pour ce repository est dans les fichiers sous le nom plotly_ex.py .


Pour comprendre plus en détails comment plotly fonctionne, et pour personnaliser au maximum vos graphiques, je vous invite à consulter mon article sur plotly. ( bientôt disponible )


Pour mettre en ligne un dashboard avec une page plotly, j'ai crée un repository à ce sujet.

Index




Installation


Installation :

pip install plotly

Documentation Plotly .

Importations


from plotly.offline import plot  # pour travailler en offline!
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np
import statsmodels.api as sm
from sklearn.datasets import load_digits
from umap import UMAP # pip install umap-learn
from sklearn.manifold import TSNE

Plotly.Express

Plotly express, importée en tant que px, est la partie de plotly permettant de créer rapidement et simplement n'importe quel graphique en 1 ligne de code. Son interet est notamment basé sur le fait qu'elle marche parfaitement bien avec les DataFrames de Pandas, mais on peut également travailler avec des listes ou tout autre type de données. Son utilisation est limitée notamment dans la conception de subplots. Vous verrez dans cette section quelles sont les fonctions les plus utiles de plotly express, et comment les personnaliser au maximum.

Voici la syntaxe globale d'un code utilisant plotly express :

fig = px.chart_type(df, parameters)
fig.update_layout("layout_parameters or add annotations")
fig.update_traces("further graph parameters")
fig.update_xaxis() # ou update_yaxis
fig.add_trace() # ajouter une figure avec graph_objects
plot(fig)

Scatter plot

Exemple simple

On personnalise les figures de plotly express suivant ce modèle :

df = px.data.iris()

fig = px.scatter(df, x="sepal_width", # nom de la colonne du dataframe
                 y="sepal_length", # nom de la colonne du dataframe
                 color="species", # nom de la colonne du dataframe
                 )

fig.update_layout(title="Scatter avec px et ajout d'une figure avec Go",
                  font_family="Rockwell")

fig.update_xaxes(title_text='largeur sepales')
fig.update_yaxes(title_text='longueur sepales')

fig.add_trace(
    go.Scatter(
        x=[2, 4],
        y=[4, 8],
        mode="lines",
        marker=dict(color="gray"),
        name="droite",
        showlegend=True) # True par défaut
)

plot(fig)

Capture d’écran 2021-05-18 à 09 39 56


Superposition de figures

Si on veut superposer des courbes avec les données du même dataset on écrit :

df = px.data.iris()
fig = px.line(df, y=["sepal_width", "sepal_length", "petal_width"],
              #text="species_id" # pour ajouter l'id de l'espèce au dessus de chaque point
              color_discrete_map={"sepal_width":"blue", 
	      			  "sepal_length":"black",
				  "petal_width":"green" }, # couleur de chaque ligne
            )
plot(fig)

Capture d’écran 2021-05-18 à 09 42 40


Subplots

On peut aussi séparer les figures en plusieurs, c'est le seul moyen de faire des subplots avec plotly express ! Il y a 2 types de subplots, soit en lignes, soit en colonnes, spécifié par le paramètre facet_col ou facet_row. Partons du code suivant :

df = px.data.iris()
fig = px.line(df, y=["sepal_width", "sepal_length", "petal_width"],
              #text="species_id" on ajoute ici l'id de l'espèce au dessus de chaque point
              color_discrete_map={"sepal_width":"blue", 
	      			  "sepal_length":"black",
				  "petal_width":"green" }, # couleur de chaque ligne
            )
plot(fig)

Alors on obtient ces résultats en fonction du paramètre de séparation :


facet_col="species" facet_row="species"
Capture d’écran 2021-05-18 à 09 44 19 Capture d’écran 2021-05-18 à 09 45 25

Animations

On fait bouger les points qui suivent l'évolution des données au fil des années :

df = px.data.gapminder()
df_fr=df[df['country']=='France']
df_us=df[df['country']=='United States']
df = pd.concat([df_fr, df_us])

fig = px.scatter(df,
        y="gdpPercap",
        x="year",
        color="country",
        title="évolution pib france et USA",
        range_x=[1952,2007],
        range_y=[df['gdpPercap'].min(), df['gdpPercap'].max()],
        animation_frame="year")
plot(fig)

Capture d’écran 2021-05-18 à 09 49 41


Range Slider

Personnalisation des axes avec un range slider visible :

df = px.data.carshare()
fig = px.line(df, y="car_hours",
              #text="species_id" on ajoute ici l'id de l'espèce au dessus de chaque point
              color_discrete_map={"car_hours":"black"}, # couleur de chaque ligne
            )
fig.update_xaxes(rangeslider_visible=True)
plot(fig)

Capture d’écran 2021-05-18 à 09 51 49


Rectangles et lignes

On peut colorier une plage de valeurs, ou ajouter une ligne :

df = px.data.stocks(indexed=True)
fig = px.line(df, facet_col="company",
              facet_col_wrap=2 # nombre de figure par ligne
              )
fig.add_hline( # ou vline pour verticale avec x=...
              y=1, line_dash="dot",
              annotation_text="1er janvier 2018",
              annotation_position="bottom right")

fig.add_vrect( # ou hrect pour horizontal
              x0="2018-09-24", x1="2018-12-18",
              col=2, # numéro de la colonne (les figures de droites)
              annotation_text="24/09 au 18/12 2018",
              annotation_position="top left",
              fillcolor="red", opacity=0.2, line_width=0.1)

fig.add_hrect( # ou hrect pour horizontal
              y0=1.1, y1=1.7,
              col=1, # numéro de la colonne (les figures de droites)
              annotation_text="1.1 à 1.7",
              annotation_position="top right",
              fillcolor="blue", opacity=0.15, line_width=0.4)

plot(fig)

Capture d’écran 2021-05-18 à 09 52 53


Marges statistiques

On ajoute un indicateur statistique sur chacune des variables du scatter :

df = px.data.iris()
fig = px.scatter(df, x="sepal_length", # données
                 color="species", # couleur par expèce
                 marginal_x='box', # marge en boxplot
                 marginal_y='violin', # marge en violon
                 trendline="ols" # courbe de tendances
                 )
plot(fig)

Capture d’écran 2021-05-18 à 09 53 30


Curseurs

Curseurs qui apparaissent avec survol de la souris sur un point du graphique :

df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp", color="country",
              title="curseurs")
fig.update_traces(mode="markers+lines") # courbe avec ligne et points apparent
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)
plot(fig)

Capture d’écran 2021-05-18 à 09 54 47


Plot 3D

df = px.data.iris()
fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
              color='species', size='petal_length', size_max=18,symbol='species', opacity=1)
plot(fig)

Capture d’écran 2021-05-18 à 10 42 21


Bar chart

Premier exemple

Simple Barchart, on colorie sur une colonne et on sépare par couleur :

df = px.data.tips()
fig=px.bar(df,
           x="sex",
           y="total_bill",
           color="smoker",
           barmode="group")
fig.update_traces( marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5, opacity=0.6)
plot(fig)

Capture d’écran 2021-05-18 à 16 12 29


Indicateurs marginaux

On va tester 2 types de marges, violon et boxplot, qu'on ajoute avec le paramètre marginal :

df = px.data.iris()
fig = px.histogram(df, x="sepal_length",
                   nbins=50, # on choisi le nombre de barres
		   marginal=''
                   )
plot(fig)
marginal='violin' marginal='box'
Capture d’écran 2021-05-18 à 10 06 10 Capture d’écran 2021-05-18 à 10 07 45

Pie chart

Exemple basique

df = px.data.tips()
fig = px.pie(df, values='tip', # ce qu'on compte
             names='day', # sur quoi on tri
             color='day',
             hole=.3, # donut chart
             color_discrete_map={'Thur':'lightblue', # couleur spécifique par valeur
                                 'Fri':'lightred',
                                 'Sat':'gold',
                                 'Sun':'green'})
plot(fig)

Capture d’écran 2021-05-18 à 16 04 01


Polar bar charts

On va représenter ici la force des vents, sur un diagramme polaire, avec la direction comme angle, et la force en taille :

df = px.data.wind()
fig = px.bar_polar(df, r="frequency", theta="direction", color="strength", 
		template="seaborn", # couleur de fond
                color_discrete_sequence= px.colors.sequential.Plasma_r)
plot(fig)

Capture d’écran 2021-05-18 à 16 07 18


Machine Learning

Regression linéaire

from sklearn.linear_model import LinearRegression

df = px.data.tips()
X = df.total_bill.values.reshape(-1, 1)

model = LinearRegression()
model.fit(X, df.tip)

x_range = np.linspace(X.min(), X.max(), 100)
y_range = model.predict(x_range.reshape(-1, 1))

fig = px.scatter(df, x='total_bill', y='tip', opacity=0.65)
fig.add_traces(go.Scatter(x=x_range, y=y_range, name='Regression Fit'))
fig.show()

Capture d’écran 2020-11-24 à 10 45 21

UMAP

digits = load_digits()
umap_2d = UMAP(random_state=0)
umap_2d.fit(digits.data)

projections = umap_2d.transform(digits.data)
fig = px.scatter(
    projections, x=0, y=1,
    color=digits.target.astype(str), labels={'color': 'digit'}
)
plot(fig)

Capture d’écran 2021-04-30 à 13 02 14

t-SNE

df = px.data.iris()
features = df.loc[:, :'petal_width']
tsne = TSNE(n_components=3, random_state=0)
projections = tsne.fit_transform(features, )

fig = px.scatter_3d(
    projections, x=0, y=1, z=2,
    color=df.species, labels={'color': 'species'}
)
fig.update_traces(marker_size=8)
plot(fig)

Capture d’écran 2021-04-30 à 13 03 58


Graphique de corrélation

df = px.data.iris()
fig = px.scatter_matrix(df, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")
plot(fig)

Capture d’écran 2020-11-23 à 21 43 03


Plotly.Graph_Objects

Plotly graph_objects, importée en tant que go est la partie de Plotly utilisant la POO, pour créer des graphiques très complets. On va y retrouver la plupart des fonctions de plotly express. Vous verrez dans cette section quelles sont les fonctions les plus utiles de plotly graph_objetcs et comment les personnaliser au maximum.

Voici la syntaxe globale d'un code utilisant plotly graph_objects :

fig = go.Figure() # création de la figure, ou alors make_subplots

fig.add_TypeTrace("parameters") # on ajoute des figure avec TypeTrace qui est pie, scatter, surface, etc..
...
fig.add_TypeTrace("parameters")

fig.update_traces("parameters")
fig.update_layout("parameters")
plot(fig)

Subplots Go

Pour un subplots on utilise un autre moyen pour initialiser la figure :

fig = make_subplots(rows=2, cols=2,
                    #column_widths=[0.6, 0.4],
                    #row_heights=[0.3, 0.3, 0.3],
                    subplot_titles=["", "", ""],
                    specs=[[{'type': 'xy'}, {'type': 'domain'}], # 1er ligne
                           [{'type': 'xy', 'colspan': 2}, None]], # 2e ligne, dont la 1er colonne s'etend sur celle de droite
                    # si on s'etend sur une colonne on utilise rowspan
                    # il existe plusieurs type de specs : xy, domain, scene, polar, ternary, mapbox
                    #horizontal_spacing=0.2,
                    #vertical_spacing=0.5
                    )

"Ensuite on ajoute les figure normalement, en indiquant juste l'emplacement du graphique avec les paramètres row et col"
x=np.linspace(-4,4)
# 1er figure
fig.add_scatter(x=np.linspace(-4,4), y=np.tanh(x),
                marker=dict(color='green'),
                row=1, col=1, name="tangente hyperbolique"
                )
# 2e figure
fig.add_pie(labels=['oui', 'non'],
            values=[201902,192981], row=1, col=2)
# 3e figure
fig.add_traces( # je vais ajouter 2 courbes en même temps sur la dernière ligne
    [
        go.Scatter(x=x, y=np.square(x), mode='markers+lines', name='x²'),
        go.Scatter(x=x,y=-np.square(x), name='-x²')
    ],
    rows=2, cols=1
)

plot(fig)

Capture d’écran 2021-05-18 à 15 19 28


Scatter

Scatter basique

On pourra utiliser scattergl pour des gros datasets.

x = np.linspace(-2, 2, 100)
y = 1/(1+np.exp(-x))

fig = go.Figure()
# 1ere solution, on ajoute toutes les figures avec le même appel (pour appliquer une seule fois certains parametres)
fig.add_traces([go.Scatter(x=x, y=y, mode='markers', name='sigmoid'),
               go.Scatter(x=x, y=-y, mode='lines', name='negative sigmoid')] )
# 2e solution, on ajoute les figures indépendemment
fig.add_scatter(x=x, y=1+y, mode='markers', name='sigmoid+1')
fig.add_scatter(x=x, y=1-y, mode='lines', name='1-sigmoid')

fig.update_layout(title="sigmoid")
plot(fig)

Capture d’écran 2021-05-18 à 15 21 12


Annotations

x = np.linspace(-5, 5, 100)
y = 1/(1+np.exp(-x))

fig = go.Figure()
fig.add_scatter(x=x,y=y,mode='lines',
                name='sigmoid',
                marker=dict(color='green'))
fig.add_annotation(x=0, y=0.5,
                   text='point en x=0',
                   showarrow=True,
                   arrowhead=1,
                   arrowsize=1,
                   arrowwidth=2,
                   arrowcolor='black',
                   bgcolor="orange",
                   borderwidth=1,
                   yshift=10)
plot(fig)

Capture d’écran 2021-05-18 à 15 22 17


Droite et plage de valeurs

x = np.linspace(-5, 5, 100)
y = -1/(1+np.exp(-x))

fig=go.Figure()
fig.add_scatter(x=x, y=y)
fig.add_hline(y=-0.5, line_dash="dot", # vline pour verticale
              annotation_text="0.5",
              annotation_position="bottom right"
              )
fig.add_hrect(y0=-0.85, y1=-0.15, # vrect pour verticale
              annotation_text="-0.15 à -0.85",
              annotation_position="top right",
              fillcolor="blue", opacity=0.15, line_width=0.4)

plot(fig)

Capture d’écran 2021-05-18 à 15 23 22


Interpolation

temps_exec = [0.40251994132995605, 0.014573812484741211, 0.23034405708312988, 0.4499189853668213, 0.8043158054351807, 0.21565508842468262, 0.10195517539978027, 0.35376596450805664, 0.5991549491882324, 0.08605694770812988, 1.1117901802062988, 0.9011919498443604, 0.3789708614349365, 0.8676671981811523, 1.3645083904266357, 0.8764557838439941, 0.13943982124328613, 0.05235695838928223, 0.1372683048248291, 0.29303503036499023]
l = [3.4549849033355713, 5.4536731243133545, 1.2118861675262451, 0.7063937187194824, 4.295026779174805, 11.98727297782898, 1.0320260524749756, 5.288934707641602, 9.74186897277832, 1.484644889831543, 6.555363893508911, 0.8726191520690918, 2.6839470863342285, 9.980525970458984, 0.665977954864502, 4.907128095626831, 2.7749810218811035, 5.096926927566528, 11.398299217224121, 3.3110921382904053]

fig=make_subplots(rows=2, cols=1,
                  subplot_titles=["Courbe bleue", "Courbe rouge"],
                  specs=[[{'type': 'xy'}], [{'type': 'xy'}]],
                  shared_xaxes=True,
                  )

## figures principales en haut ##
# Interpolation linéaire
fig.add_scatter(y=l, mode='lines', opacity=0.4, line=dict(color='royalblue', width=4), line_dash='dot', name='interpolation linéaire',row=1,col=1)
# Interpolation par spline
fig.add_scatter(y=l, mode='lines', line=dict(color='royalblue', width=4), line_shape='spline', name='interpolation par spline',
                          hovertemplate = "<br>%{y:.0f}</br>", row=1,col=1)
fig.update_xaxes(title="x", row=1, col=1)
fig.update_yaxes(title="y", row=1, col=1)

## Titre + axes labels ##
fig.update_layout(title="Interpolation")
## ligne moyenne ##
fig.add_shape(type="line", line_color="firebrick", line_width=2, opacity=1, line_dash="dot",
              x0=0, x1=len(l)-1, y0=np.mean(l), y1=np.mean(l), row=1, col=1)
## fleche moyenne ##
fig.add_annotation(text="Moyenne : {}".format(int(np.mean(l)), grouping=True, monetary=True),
                   x=int(len(l)/5)*4, # arrows' head
                   y=np.mean(l)*1.2,  # arrows' head
                   arrowhead=2, showarrow=True, row=1, col=1)
## layout custom ##
fig.update_xaxes(
        showline=True,
        showgrid=False,
        showticklabels=True,
        linecolor='rgb(204, 204, 204)',
        linewidth=2,
        ticks='outside',
        tickfont=dict(
            family='Arial',
            size=12,
            color='rgb(82, 82, 82)',
        ), row=1,col=1)
fig.update_yaxes(
        showgrid=False,
        zeroline=True,
        showline=True,
        linecolor='rgb(204, 204, 204)',
        linewidth=2,
        ticks='outside',
        tickfont=dict(
            family='Arial',
            size=12,
            color='rgb(82, 82, 82)',
    ), row=1, col=1)


## figures principales en bas ##
# Interpolation linéaire
fig.add_scatter(y=temps_exec, mode='lines', opacity=0.4, line=dict(color='firebrick', width=4), line_dash='dot', name="Interpolation linéaire",
                          row=2,col=1)
# Interpolation par spline
fig.add_scatter(y=temps_exec, mode='lines', line=dict(color='firebrick', width=4), line_shape='spline', name="Interpolation par spline",
                          hovertemplate = "<br>%{y:.3f}</br>", row=2,col=1)
## ligne moyenne ##
fig.add_shape(type="line", line_color="royalblue", line_width=2, opacity=1, line_dash="dot",
              x0=0, x1=len(l)-1, y0=np.mean(temps_exec), y1=np.mean(temps_exec), row=2, col=1)
## fleche moyenne ##
fig.add_annotation(text="Moyenne : {} sec".format(round(np.mean(temps_exec),2), grouping=True, monetary=True),
                   x=int(len(temps_exec)/5)*4, # arrows' head
                   y=np.mean(temps_exec)*1.2,  # arrows' head
                   arrowhead=2, showarrow=True, row=2, col=1)
fig.update_xaxes(title="x", row=2, col=1)
fig.update_yaxes(title="y", row=2, col=1)
## layout custom ##
fig.update_xaxes(
    showline=True,
    showgrid=False,
    showticklabels=True,
    linecolor='rgb(204, 204, 204)',
    linewidth=2,
    ticks='outside',
    tickfont=dict(
        family='Arial',
        size=12,
        color='rgb(82, 82, 82)',
    ), row=2, col=1)
fig.update_yaxes(
    showgrid=False,
    zeroline=True,
    showline=True,
    linecolor='rgb(204, 204, 204)',
    linewidth=2,
    ticks='outside',
    tickfont=dict(
        family='Arial',
        size=12,
        color='rgb(82, 82, 82)',
    ), row=2, col=1)

fig.update_layout(plot_bgcolor='white',
                  hoverlabel_align='right')
plot(fig)

Capture d’écran 2021-05-19 à 14 58 16


Financial Chart

Le dataset et disponible dans les fichiers du repo : "EURUSD_5y.csv"

vert = '#599673'
rouge = '#e95142'
noir = '#000'
df = pd.read_csv('path/EURUSD_5y.csv')

fig = go.Figure()

fig.add_trace(go.Scatter(
    y = df['Close'],
    x = df['Date'],
    line=dict(color=noir, width=1),
    name="",
    hovertemplate=
    "Date: %{x}<br>" +
    "Close: %{y}<br>"
))

fig.add_hline(y=df['Close'].iloc[0],
              line_dash="dot",
              annotation_text="25 mai 2016",
              annotation_position="bottom right",
              line_width=1.5, line=dict(color='black'))

# montée 1

fig.add_vrect(x0='2017-01-01',x1='2018-02-20',
              fillcolor=vert, opacity=0.2, line_width=0.4,
              annotation_text='01-01-2017 au 02-20-2018',
              annotation_position="top left",
              annotation=dict(font=dict(size=8))
              )

fig.add_traces(go.Indicator(
    mode = "number+delta",
    value = 1.239864,
    number={'prefix': "$", 'font_size' : 40},
    delta = {"reference": 1.052698, "valueformat": ".6f", "position" : "bottom"},
    title = {"text": "Eur/USD"},
    domain = {'y': [0, 0.5], 'x': [0.15, 0.4]}))

# descente 1

fig.add_traces(go.Indicator(
    mode = "number+delta",
    value = 1.077702,
    number={'prefix': "$", 'font_size' : 40},
    delta = {"reference": 1.237317, "valueformat": ".6f", "position" : "bottom"},
    title = {"text": "Eur/USD"},
    domain = {'y': [0.5, 0.7], 'x': [0.55, 0.75]}))

fig.add_vrect(x0='2018-04-18',x1='2020-04-24',
              fillcolor=rouge, opacity=0.2, line_width=0.4,
              annotation_text='18-04-2018 au 24-04-2020',
              annotation_position="top right",
              annotation=dict(font=dict(size=8))
              )

fig.update_layout(
    template='simple_white',
    yaxis_title="Euro/USD close",
    title_text="Euro/USD Close"
)

plot(fig)	

Capture d’écran 2021-05-25 à 11 31 28


Pie chart Go

labels = ['Apple','Samsung','Nokia','Wiko']
values = [4500, 3000, 1053, 500]
fig = go.Figure()
fig.add_pie(labels=labels, # les valeurs sur lesquelles on compte
            values=values, # ce qui sert à faire les pourcentages
            pull=[0, 0, 0, 0.2], # represente une fraction de pi, ici on décale le 4e label
            textposition='inside',
            )
fig.update_traces(hoverinfo='label+percent', # ce qu'on voit avec la souris
                  textinfo='value', # Ce qu'on lit dans le pie
                  textfont_size=20, # taille du texte du pie
                  marker=dict(colors=['gold', 'mediumturquoise', 'darkorange', 'lightgreen']) # couleur des secteurs
                  )
plot(fig)

Capture d’écran 2021-05-18 à 15 24 13


Violin chart

df = px.data.iris()
fig=go.Figure()

fig.add_violin(y=df['sepal_length'],
               points='all', # pour tous les afficher
               box_visible=True,
               meanline_visible=True,
               fillcolor='lightblue',
               opacity=0.7,
	       name="longueur sepale")
fig.update_layout(yaxis_zeroline=False)
plot(fig)

Capture d’écran 2021-05-18 à 15 26 23


Histogramme/Bar

A partir du code suivant, on a 2 types de diagrammes bâtons, qu'on choisi avec fig.add_histogram ou fig.add_bar :

df = px.data.iris()
fig=go.Figure()

fig.add_XXXXXX(x=df['sepal_width'])
plot(fig)
add_histogram add_bar
Capture d’écran 2021-05-18 à 15 29 05 Capture d’écran 2021-05-18 à 15 30 26

Graphiques en 3D


Surface

z_data = df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/volcano.csv")
fig = go.Figure(data=[go.Surface(z=z_data, colorscale='IceFire')]) # Z1 liste de liste
fig.update_layout(title='Mountain')
plot(fig)

Capture d’écran 2020-11-23 à 22 30 54


Nuage de points

df = px.data.iris()
fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
              color='species', size='petal_length', size_max=18,symbol='species', opacity=0.7)
plot(fig)

Capture d’écran 2020-11-23 à 22 31 34


réseau de neurones

# liens
edge_x, edge_y = [1.5,3,None,1.5,3,None,1.5,3,None,1.5,3,None,1.5,3,None,1.5,3,None,3,4.5,None,3,4.5,None,3,4.5,None,3,4.5,None,3,4.5,None,3,4.5,None,3,4.5,None,],\
                 [1,0,None,1,2,None,1,4,None,3,0,None,3,2,None,3,4,None,0,1,None,0,1,None,0,3,None,2,1,None,2,3,None,4,1,None,4,3,None,]
# None pour couper la ligne
edge_trace = go.Scatter(
    x=edge_x, y=edge_y,
    line=dict(width=2, color='#000000'),
    hoverinfo='none',
    mode='lines')

# traçage des noeuds
node_x, node_y = [1.5,1.5,3,3,3,4.5,4.5],\
                 [1,3,0,2,4,1,3]
node_trace = go.Scatter(
    x=node_x, y=node_y,
    mode='markers',
    hoverinfo='text',
    marker=dict(
        color='green',
        size=20,
        line_width=1.5))

# affichage
fig = go.Figure(data=[edge_trace, node_trace],
             layout=go.Layout(
                titlefont_size=16,
                showlegend=False,
                hovermode='closest',
                margin=dict(b=20,l=5,r=5,t=40),
                xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
                yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
                yaxis_range=[-6,10],
                xaxis_range=[-5,11]
             )
             )
plot(fig)

Capture d’écran 2021-04-30 à 13 24 07

Regression surfacique en 3D

Le contenu de df_final est disponible dans les fichiers du github.

from sklearn.svm import SVR

mesh_size = .02
margin = 0

df = df_final

X = df[['x', 'y']]
y = df['hauteurs']

# Modele
model = SVR(C=1.)
model.fit(X, y)

# mesh grid 
x_min, x_max = X.x.min() - margin, X.x.max() + margin
y_min, y_max = X.y.min() - margin, X.y.max() + margin
xrange = np.arange(x_min, x_max, mesh_size)
yrange = np.arange(y_min, y_max, mesh_size)
xx, yy = np.meshgrid(xrange, yrange)

# On run le modele
pred = model.predict(np.c_[xx.ravel(), yy.ravel()])
pred = pred.reshape(xx.shape)

# plot
fig = px.scatter_3d(df, x='x', y='y', z='hauteurs')
fig.update_traces(marker=dict(size=5))
fig.add_traces(go.Surface(x=xrange, y=yrange, z=pred, name='pred_surface'))
plot(fig)

Capture d’écran 2021-05-18 à 10 56 25


Maps

Ligne entre Miami et Chicago

fig = go.Figure()

fig.add_scattermapbox(
    # on relie Miami (lat = 25.7616798, long = -80.1917902) et Chicago (lat = 41.8119, long = -87.6873)
    mode = "markers+lines",
    lon = [-80.1917902, -87.6873],
    lat = [25.7616798, 41.8119],
    marker = {'size': 10,
              'color': 'firebrick',
              })

fig.update_layout(
    margin ={'l':0,'t':0,'b':0,'r':0}, # marge left, top, bottom, right
    mapbox = {
        'center': {'lon': -80, 'lat': 40},
        'style': "stamen-terrain",
        'zoom': 3})

plot(fig)

Capture d’écran 2021-05-19 à 10 51 17


Air colorée sur une carte, triangle des bermudes

fig = go.Figure()

# les 3 points :
# Bermudes : lat = 32.320236, long = -64.7740215
# Miami : lat = 25.7616798, long = -80.1917902
# San Juan : lat = 18.2232855, long = -66.5927315

fig.add_scattermapbox(
    fill = "toself",
    lon = [-64.7740215, -80.1917902, -66.5927315], lat = [32.320236, 25.7616798, 18.2232855],
    marker = { 'size': 2, 'color': "red" })

fig.update_layout(
    margin ={'l':0,'t':0,'b':0,'r':0},
    mapbox = {
        'style': "stamen-terrain",
        'center': {'lon': -80, 'lat': 25 },
        'zoom': 3},
    showlegend = False)

plot(fig)

Capture d’écran 2021-05-19 à 10 51 55


Scatter sur une map

df = px.data.gapminder().query("year == 2007")
fig = px.scatter_geo(df, locations="iso_alpha", # on situe le pays avec son raccourci international
                     color="continent", # on colorie par continent
                     hover_name="country", # ce qu'on voit avec la souris
                     size="gdpPercap", # la taille des points dépend du pib du pays
                     projection="natural earth" # type de carte
                     )
plot(fig)

Capture d’écran 2021-05-19 à 10 53 23


Scatter avec ensemble de points

token = 'your token from https://studio.mapbox.com'
fig = go.Figure()
	
fig.add_scattermapbox(
    mode = "markers",
    name="",
    lon = list(df['long'].apply(lambda x : float(x))),
    lat = list(df['lat'].apply(lambda x : float(x))),
    marker = dict(size= 5,
              color= df['richter'],
              showscale = True,
              colorscale="jet"
    ),
    hovertemplate=
    "longitude: %{lon}<br>" +
    "latitude: %{lat}<br>"+
    "intensité: %{marker.color}"  ,
)
fig.update_layout(
    margin ={'l':0,'t':0,'b':0,'r':0},
    mapbox = {
        'accesstoken': token,
        'style': 'light',
        'center': {'lon': -80, 'lat': 25 },},
)
plot(fig)

Capture d’écran 2021-05-22 à 23 16 19


Plotly.figure_factory

Plotly.figure_factory est la partie de plotly qui intervient quand l'utilisation de Go et Px devient impossible.

Distplot

x = [np.random.randn(150)]

label = ['Groupe 1']
color = ['#B36CD2']
fig = ff.create_distplot(x, label, colors=color,
                         bin_size=.2, show_rug=False)

fig.update_layout(title_text='Distplot')
plot(fig)

Distplot


Heatmap avec annotations

z = [[1, 1, 3],
     [3, 1, 3],
     [3, 1, 1]]

x = ['Équipe A', 'Équipe B', 'Équipe C']
y = ['Match 3', 'Match 2', 'Match 1']

z_text = [['Perdu', 'Perdu', 'Gagné'],
          ['Gagné', 'Perdu', 'Gagné'],
          ['Gagné', 'Perdu', 'Perdu']]

fig = ff.create_annotated_heatmap(z, x=x, y=y, annotation_text=z_text, colorscale='gnbu')
plot(fig)

Capture d’écran 2021-05-19 à 12 14 27


Dendrogrames

X = np.array([[1],[2], [5], [3]])
fig = ff.create_dendrogram(X)
fig.update_layout(width=1080, height=675)
plot(fig)

Capture d’écran 2021-05-19 à 12 15 08


Champ vectoriel

x,y = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))
u = -np.cos(y)*x
v = np.sin(x)*y+1

fig = ff.create_quiver(x, y, u, v)
plot(fig)

Capture d’écran 2021-05-19 à 12 15 34


Lignes de flux

x = np.linspace(-4, 4, 80)
y = np.linspace(-4, 4, 80)
Y, X = np.meshgrid(x, y)
u = -(1 + X )**2 + 2*Y
v = 1 - X + (Y+1)**2

fig = ff.create_streamline(x, y, u, v, arrow_scale=.2)
plot(fig)

Capture d’écran 2021-05-19 à 12 16 29


Création d'un tableau

À la main avec LaTex

data_matrix = [['Forme factorisée', 'Forme developpée'],
               ['$(a+b)^{2}$', '$a^{2}+2ab+b^{2}$'],
               ['$(a-b)^{2}$', '$a^{2}-2ab+b^{2}$'],
               ['$(a+b)(a-b)$', '$a^{2}-b^{2}$']]

fig =  ff.create_table(data_matrix)
plot(fig, include_mathjax='cdn')

Capture d’écran 2021-05-19 à 12 27 17


À partir d'un dataframe pandas

df = px.data.iris()

fig=ff.create_table(df)
plot(fig)

Capture d’écran 2021-05-19 à 12 27 49



Haut de la page