2 votes

comment créer des sous-intrigues de manière programmatique dans plotly ?

Je cherche à créer quelque chose comme ci-dessous en utilisant plotly, je viens juste de commencer à jouer avec la bibliothèque. Je suis capable de créer des figures en utilisant le code ci-dessous, mais je ne peux pas les rassembler sous une seule figure comme dans l'image.

enter image description here

from sklearn.datasets import load_iris
from sklearn import tree
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pdb 

#n_classes = 3
#plot_colors = "ryb"
plot_step = 0.02
#pair = [0, 1]

iris = load_iris()

for index, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 2], [1, 3], [2, 3]]):
    fig = make_subplots(rows=2,cols = 3)
    i = (index//3)+1 #indexing for rows
    k =(index//2)+1 #indexing for cols
    #pdb.set_trace()
    X = iris.data[:, pair]
    y = iris.target
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, y)

    x_min, x_max = X[:, 0].min(), X[:, 0].max() 
    y_min, y_max = X[:, 1].min(), X[:, 1].max() 
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                        np.arange(y_min, y_max, plot_step))

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    #pdb.set_trace()

    fig.add_trace(go.Contour(z = Z, 
                            x = np.linspace(x_min,x_max,num = Z.shape[1]),
                            y = np.linspace(y_min,y_max,num = Z.shape[0])

                            ),i,k)
    fig.update_layout(
        autosize=False,
        width=1000,
        height=800)
    for cl in np.unique(y):
        idx = np.where(y == cl)
        fig.add_trace(go.Scatter(x=X[idx, 0].ravel(), y=X[idx, 1].ravel(),
                                    mode = 'markers'),i,k)

fig.show()

1voto

r-beginners Points 11668

La raison de cette erreur est que les paramètres initiaux pour dessiner le graphique sont dans un processus en boucle.

Changement de code :

  1. La valeur de pair dans un processus en boucle.
  2. déplacer le paramètre initial du graphique hors de la boucle.
  3. changer l'index de placement de `add_trace()

    from sklearn.datasets import load_iris from sklearn import tree import pandas as pd import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots import pdb

    n_classes = 3

    plot_colors = "ryb"

    plot_step = 0.02

    pair = [0, 1]

    iris = load_iris()

    fig = make_subplots(rows=2,cols = 3) # update

    for index, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 1], [1, 2], [1, 3]]):

    fig = make_subplots(rows=2,cols = 3)

    i = (index//6)+1 #indexing for rows
    k =(index//3)+1 #indexing for rows
    #pdb.set_trace()
    X = iris.data[:, pair]
    y = iris.target
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, y)
    
    x_min, x_max = X[:, 0].min(), X[:, 0].max() 
    y_min, y_max = X[:, 1].min(), X[:, 1].max() 
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                        np.arange(y_min, y_max, plot_step))
    
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    #pdb.set_trace()
    
    fig.add_trace(go.Contour(z = Z, 
                            x = np.linspace(x_min,x_max,num = Z.shape[1]),
                            y = np.linspace(y_min,y_max,num = Z.shape[0]),         
                            ),row=pair[0]+1, col=pair[1])
    
    for cl in np.unique(y):
        idx = np.where(y == cl)
        fig.add_trace(go.Scatter(x=X[idx, 0].ravel(), y=X[idx, 1].ravel(),
                                    mode = 'markers'),row=pair[0]+1, col=pair[1])

    fig.update_layout( autosize=False, width=1000, height=800)

    fig.show()

enter image description here

1voto

Shoaibkhanz Points 732
from sklearn.datasets import load_iris
from sklearn import tree
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pdb 

plot_step = 0.02

iris = load_iris()
fig = make_subplots(rows=2,cols = 3)
for index, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 2], [1, 3], [2, 3]]):

    i = (index//3)+1 #indexing for rows
    k = (index%3)+1 #indexing for cols
    #pdb.set_trace()
    X = iris.data[:, pair]
    y = iris.target
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, y)

    x_min, x_max = X[:, 0].min()-1, X[:, 0].max()+1 
    y_min, y_max = X[:, 1].min()-1, X[:, 1].max()+1 
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                        np.arange(y_min, y_max, plot_step))

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    fig.add_trace(go.Contour(z = Z, 
                            x = np.linspace(x_min,x_max,num = Z.shape[1]),
                            y = np.linspace(y_min,y_max,num = Z.shape[0])
                            ),row = i,col = k)

    for cl,cl_name in enumerate(iris.target_names):
        idx = np.where(y == cl)
        fig.add_trace(go.Scatter(x=X[idx, 0].ravel(), y=X[idx, 1].ravel(),
                                    mode = 'markers', 
                                    name = cl_name,
                                    #legendgroup="group1",
                                    #marker=dict(color = ''),
                                    showlegend=False),row = i,col = k)
    #pdb.set_trace()
fig.update_layout(
    autosize=False,
    width=1000,
    height=800)
fig.show()
fig.write_html('plotly101.html')
  • déplacé make_subplots y update_layout à l'extérieur comme suggéré dans la réponse précédente @r-beginners
  • initialisé i y k correctement

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X