IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Créer des objets avec matplotlib


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Créer des objets avec matplotlib
    bonjour je cherche a créer des objets


    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    # coding: utf-8 
    '''
    Created on 17 juin 2023
    '''
     
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    import numpy as np
    from PIL import Image
    D avec 
    # Coordonnées des sommets du dé à dix faces
    vertices = [
        [0, 0, 0],
        [1, 0, 0],
        [1, 1, 0],
        [0, 1, 0],
        [0, 0, 1],
        [1, 0, 1],
        [1, 1, 1],
        [0, 1, 1],
        [0.5, 0.5, 1.5],
        [0.5, 0.5, -0.5]
    ]
     
    # Faces du dé à dix faces (indices des sommets)
    faces = [
        [0, 1, 2, 3],   # Face 1
        [0, 1, 5, 4],   # Face 2
        [1, 2, 6, 5],   # Face 3
        [2, 3, 7, 6],   # Face 4
        [3, 0, 4, 7],   # Face 5
        [4, 5, 9, 8],   # Face 6
        [5, 6, 9, 8],   # Face 7 (modifié)
        [6, 7, 9, 8],   # Face 8 (modifié)
        [7, 4, 9, 8],   # Face 9 (modifié)
        [9, 6, 5, 8]    # Face 10 (modifié)
    ]
     
    # Chargement des images des chiffres pour le dé à dix faces
    images = []
    for i in range(1, 11):
        image_path = f"chiffre_{i}.png"  # Chemin vers l'image du chiffre
        image = Image.open(image_path)
        images.append(image)
     
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
     
    # Création des polygones pour chaque face du dé avec les textures des chiffres
    polygons = []
    rotated_vertices = [np.array(vertex) for vertex in vertices]  # Déplacement de la définition de rotated_vertices
     
    for i, face in enumerate(faces):
        polygon = Poly3DCollection([rotated_vertices[j] for j in face], alpha=1.0)
        polygon.set_facecolor('white')
        polygon.set_edgecolor('black')
        polygon.set_alpha(0.8)
        ax.add_collection3d(polygon)
     
        # Placement de l'image du chiffre sur la face
        face_center = np.mean([rotated_vertices[j] for j in face], axis=0)
        image = images[i]
        ax.imshow(image, extent=(face_center[0]-0.5, face_center[0]+0.5, face_center[1]-0.5, face_center[1]+0.5), origin='lower')
     
     
    # Paramètres d'affichage
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    ax.set_xlim([0, 1])
    ax.set_ylim([0, 1])
    ax.set_zlim([0, 1.5])
     
     
    # Fonction d'animation pour faire tourner le dé à dix faces
    def animate(frame):
        ax.cla()  # Effacer le contenu de l'axe à chaque frame
     
        # Rotation aléatoire du dé
        angle = np.random.uniform(0, 360)  # Angle de rotation aléatoire
        rotation_matrix = np.array([[np.cos(np.radians(angle)), -np.sin(np.radians(angle)), 0],
                                   [np.sin(np.radians(angle)), np.cos(np.radians(angle)), 0],
                                   [0, 0, 1]])
        rotated_vertices = [np.dot(rotation_matrix, vertex) for vertex in vertices]
     
        # Recréation des polygones pour chaque face avec les textures des chiffres
        polygons = []
        for i, face in enumerate(faces):
            polygon = Poly3DCollection([rotated_vertices[j] for j in face], alpha=1.0)
            polygon.set_facecolor('white')
            polygon.set_edgecolor('black')
            polygon.set_alpha(0.8)
            ax.add_collection3d(polygon)
     
            # Placement de l'image du chiffre sur la face
            face_center = np.mean([rotated_vertices[j] for j in face], axis=0)
            image = images[i]
            ax.imshow(image, extent=(face_center[0]-0.5, face_center[0]+0.5, face_center[1]-0.5, face_center[1]+0.5), origin='lower')
     
        # Paramètres d'affichage
        ax.set_xlabel('X')
        ax.set_ylabel('Y')
        ax.set_zlabel('Z')
        ax.set_xlim([0, 1])
        ax.set_ylim([0, 1])
        ax.set_zlim([0, 1.5])
     
    ani = animation.FuncAnimation(fig, animate, frames=100, interval=200)
    plt.show()
    voici l'erreur que j'obtiens Avez vous une idée ?

    File "D:\eclipse-workspace\Images3d\MATPLOTLIB\De4face10.py", line 55, in <module>
    polygon = Poly3DCollection([rotated_vertices[j] for j in face], alpha=1.0)
    File "art3d.py", line 887, in __init__
    raise ValueError('verts must be a list of (N, 3) array-like')
    ValueError: verts must be a list of (N, 3) array-like

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par dedalios Voir le message
    voici l'erreur que j'obtiens Avez vous une idee ?
    Poly3DCollection attend des points avec 3 coordonnées (3D) d'où le (N, 3).
    Pourquoi ne pas fabriquer ce que la fonction attend?
    note: au delà, il faut essayer de comprendre ce que vous cherchez à faire... et probablement ré-écrire tout ou partie du code. Même si j'avais du temps, je ne vole pas le boulot des autres (ici vous).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dedalios Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    images = []
    for i in range(1, 11):
    	image_path = f"chiffre_{i}.png"  # Chemin vers l'image du chiffre
    	image = Image.open(image_path)
    	images.append(image)
    images=tuple(Image.open("chiffre_{0}.png".format(i) for i in range(1, 11)))
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    On préfère les f-strings et on évite les double quotes:

    images=tuple(Image.open(f'chiffre_{0}.png' for i in range(1, 11)))
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    On préfère les f-strings
    Question de point de vue non? Le format a aussi ses avantages
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def carre(n):
    ...     print("trace: ", n)
    ...     return n**2
    ... 
    >>> print(f"test: {carre(5)}={carre(5)}")
    trace:  5
    trace:  5
    test: 25=25
    >>> print("test: {0}={0}".format(carre(5)))
    trace:  5
    test: 25=25
    >>>
    https://levelup.gitconnected.com/whe...d-3b89718757bd

    Citation Envoyé par wiztricks Voir le message
    et on évite les double quotes
    Un peu pareil... print("aujourd'hui il a fait bien chaud!!!")... surtout qu'à ce qu'il semble, la pep8 ne dit rien à ce sujet...
    PEP doesn’t make a recommendation on whether to use single or double quotes - pick a rule and stick to it.
    => https://betterdatascience.com/python...s-double-quote
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Question de point de vue non?
    Absolument, mais c'est ce qu'on peut aussi dire sur l'utilisation de tuples et generateurs: si on a envie d'écrire une boucle et plein de lignes, c'est un choix, pas un sujet.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    bonjour

    Je recherche des solutions pour simulé un dé qui tourne.
    Je teste plusieurs solutions sans parvenir a ce que je souhaite.

    Passe de ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    images = []
    for i in range(1, 11):
        image_path = f"chiffre_{i}.png"  # Chemin vers l'image du chiffre
        image = Image.open(image_path)
        images.append(image)
    a cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images=tuple(Image.open("chiffre_{0}.png".format(i) for i in range(1, 11)))
    Ne faudrait il pas mettre ceci car sans variation de la variable i le nom du fichier est toujours le même .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images=tuple(Image.open(f"chiffre_{i}.png".format(i) for i in range(1, 11)))

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par Sve@r Voir le message
    images=tuple(Image.open("chiffre_{0}.png".format(i) for i in range(1, 11)))
    format ou f-string , ... c'est exactement la même chose au niveau de l'interpréteur (bien que je préfère f-string)

    MAIS, ici c'est surtout que ce code n'a pas de sens fermeture pour open() décalée ? car open() ne prend pas une liste en paramètre
    Tu désirais écrire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images_handle = tuple(Image.open(f"chiffre_{i}.png") for i in range(1, 11))
    Citation Envoyé par Sve@r;
    tuple("chiffre_{0}.png".format(i) for i in range(1, 11))
    ok, ici nous sommes d'accord

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par papajoker Voir le message
    MAIS, ici c'est surtout que ce code n'a pas de sens fermeture pour open() décalée ? car open() ne prend pas une liste en paramètre
    Tu désirais écrire ?
    Ce code a du sens puisqu'on comprend ce qu'on veut faire. Par contre, il est laxiste (le mien aussi) côté parenthèses.
    Son exécution devrait planter vu ce qu'on passe à Image.open.... et l'erreur (une faute de frappe) est facile à corriger.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    format ou f-string , ... c'est exactement la même chose au niveau de l'interpréteur
    J'ai vu par ci/par là que f_string était plus rapide car interprété lors de la compilation (py vers pyc) tandis que les autres façons d'écrire étaient interprétées à l'exécution. Ceci dit ça me semble bizarre (si on affiche une expression issue de fonction, c'est à l'exécution que la fonction est exécutée). Peut-être j'ai pas bien lu (c'était en anglais) ou alors ce n'est valable que pour des expression très spécifiques ce qui le rend donc malgré tout plus efficace. Ce qui ne m'empêche pas de ne pas l'aimer. Je trouve que format() (ainsi que son ancètre %) permet plus de souplesse. M'est arrivé d'afficher dans des fenêtres de debug des trucs en rafale style...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> x=123
    >>> y=456
    >>> z=789
    >>> print("".join("%s (%s)\n" % (v, type(v)) for v in (x, y, z)))
    123 (<class 'int'>)
    456 (<class 'int'>)
    789 (<class 'int'>)
    ... écriture qu'on peut reproduire avec format() mais que je pense les f-string incapables d'égaler (en tout cas j'ai pas réussi)

    Citation Envoyé par papajoker Voir le message
    MAIS, ici c'est surtout que ce code n'a pas de sens fermeture pour open() décalée ? car open() ne prend pas une liste en paramètre
    Mouais. Je sentais que j'avais fait une erreur qq part. Pas pu tester car je n'avais pas PIL (ok j'aurais pu simuler mais j'y suis allé sans filet). Je me suis contenté de compter les parenthèses.

    Citation Envoyé par papajoker Voir le message
    Tu désirais écrire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images_handle = tuple(Image.open(f"chiffre_{i}.png") for i in range(1, 11))
    Non, ceci images_handle = tuple(Image.open("chiffre_{0}.png".format(i)) for i in range(1, 11))

    Citation Envoyé par papajoker Voir le message
    ok, ici nous sommes d'accord
    Oui parce que là j'ai pu tester avant de poster
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    M'est arrivé d'afficher dans des fenêtres de debug des trucs en rafale style...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> x=123
    >>> y=456
    >>> z=789
    >>> print("".join("%s (%s)\n" % (v, type(v)) for v in (x, y, z)))
    123 (<class 'int'>)
    456 (<class 'int'>)
    789 (<class 'int'>)
    ... écriture qu'on peut reproduire avec format() mais que je pense les f-string incapables d'égaler (en tout cas j'ai pas réussi)
    En F-string ça donnerait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print("\n".join(f"{v} ({type(v)})" for v in (x, y, z)))
    En général je trouve les F-strings plus claires, mais dans un cas comme celui-ci c'est discutable. Pourtant l'expression est plus succinte. Mais il y a l'avantage qu'on ne confond pas les variables et on peut changer l'ordre d'affichage sans craindre d'induire un bug. Avoir une suite de %s me perturbe un peu.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    En F-string ça donnerait ceci:
    Ah oui, moi j'avais essayé print("\n".join(f"{v} (type({v}))" for v in (x, y, z))) (inversion des accolades pour type())
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème avec matplotlib
    Par TimStudent56 dans le forum Général Python
    Réponses: 4
    Dernier message: 13/06/2022, 18h25
  2. [Python 2.X] Problème avec MatPlotLib
    Par AlexBsd dans le forum Général Python
    Réponses: 3
    Dernier message: 11/05/2017, 08h13
  3. [Python 3.X] problème avec matplotlib
    Par abdou313 dans le forum Général Python
    Réponses: 1
    Dernier message: 19/05/2015, 03h18
  4. Problème avec Matplotlib
    Par Pacome1973 dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 23/02/2014, 14h14
  5. problème avec matplotlib
    Par mortal dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 27/01/2014, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo