Une galerie de graphes

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je souhaiterais, avec Python et matplolib, faire quelque chose comme ça :

Image utilisateur

Pour l'instant, j'utilise la méthode subplot et la fonction suivante :

 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
def gallery(x_list, y_list, titles):
    l = len(x_list)

    if titles == []:
        titles = ["" for i in range(l)]

    n = int(ceil(sqrt(l)))

    if n <= 1:
        draw(x_list[0], y_list[0], titles[0], "x", "y")
        return

    f, axarr = plt.subplots(n, n)

    for k in range(l):
        i = k // n
        j = k % n

        x = x_list[k]
        y = y_list[k]
        title = titles[k]

        axarr[i, j].plot(x, y)
        axarr[i, j].set_title(title)

def show_gallery(x, y, titles=[]):
    gallery(x, y, titles=[])
    plt.show()  
    plt.clf()  

Seulement, il y a deux soucis :

  • Pour n = 2, je me retrouve avec un graphe 2x2

Mais f, axarr = plt.subplots(1 if n == 2 else n, n) me renvoie IndexError: too many indices pour la ligne axarr[i, j].plot(x, y).

  • Pour n n'étant pas un carré, j'ai des graphes vides dans le coin inférieur droit

Puis-je les effacer ?

Merci !

Édité par Vayel

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Salut,

Alors, dans l'ordre :

  • Pour n = 2, je me retrouve avec un graphe 2x2

Mais f, axarr = plt.subplots(1 if n == 2 else n, n) me renvoie IndexError: too many indices pour la ligne axarr[i, j].plot(x, y).

C'est bien étrange, pourrais tu tenter de faire un print des valeurs de i et j ?

  • Pour n n'étant pas un carré, j'ai des graphes vides dans le coin inférieur droit

Puis-je les effacer ?

En fait subplots (avec un s) est une fonction utilitaire qui crée explicitement une grille. Je ne suis pas surs, vu l'objectif de la fonction, que ce soit possible. Perso je crée chaque axe "a la main" ce qui regle le problème.

En gros pour le faire, crée uniquement les axes necessaire. remplace ta ligne 13 par (pas testé mais devrait marcher) :

1
2
f = plt.Figure()
axarr = [f.add_subplot(n, n, i) for i in range (1, n*n +1)]

edit: si tu change ta ligne 13 par ma proposition, tu dois mettre a jour tes deux dernieres lignes de la boucle (lignes 22-23) par axarr[k]... ce qui reglera peut etre l'autre problème.

Édité par Kje

+0 -0
Auteur du sujet

Merci !

Je m'étais trompé, ce n'est pas f, axarr = plt.subplots(1 if n == 2 else n, n) mais f, axarr = plt.subplots(1 if l == 2 else n, n).

En fin de compte, j'ai le code suivant :

 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
def gallery(x_list, y_list, title="", titles=[], xlabels=[], ylabels=[]):
    l = len(x_list)

    if titles == []: titles = ["" for i in range(l)]

    if xlabels == []: xlabels = ["" for i in range(l)]
    elif isinstance(xlabels, str): xlabels = [xlabels for i in range(l)]

    if ylabels == []: ylabels = ["" for i in range(l)]
    elif isinstance(ylabels, str): ylabels = [ylabels for i in range(l)]

    n = int(ceil(sqrt(l)))

    fig = plt.figure(1)
    fig.suptitle(title)

    for k in range(l):
        x = x_list[k]
        y = y_list[k]
        title = titles[k]
        xlabel = xlabels[k]
        ylabel = ylabels[k]

        plt.subplot(1 if l == 2 else n, n, k+1)
        draw(x, y, title, xlabel, ylabel)

    plt.tight_layout() # To space subplots
    plt.subplots_adjust(top=0.9) # Not to overwrite title

Il faut juste que je regarde au niveau des tailles. ^^

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte