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 :

Matplotlib : figure size , taille reelle ( patron )


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    chaudronnier
    Inscrit en
    Juillet 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : chaudronnier
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2022
    Messages : 7
    Par défaut Matplotlib : figure size , taille reelle ( patron )
    Bonjour à tous

    Je suis chaudronnier ( metal ) en atelier et j'aimerai développer un outil pour faire des gabarits de coupe de tube notamment.
    L'idée serai de placer sur un tube un gabarit calculé par des outils de tracage ( et donc de géométrie ) pour pour voir effectuer les coupes avec la bonne forme.

    Voir gueule de loup par exemple sur internet.
    https://www.4x4-offroad.net/index.ph...gueule-de-loup

    Je suis assez débutant en python et j'ai une problématique dont je n'ai pas trouvé de solution sur le net. Cela concerne matplotlib.

    J'ai besoin pour travailler de gabarit à taille réelle, comme si je voulais utiliser un patron pour coudre une robe . Je veux donc que mon pdf final imprimé ai de "vrais" centimètres et sur plusieurs essais j'ai remarqué que le fameux figuresize ne me permettais pas d'obtenir des valeurs justes. Il existe pour moi un redimensionnement fait par matplotlib à un endroit que je ne maitrise pas. Il s'agit de "jouer" je pense avec conversion inch, centimetres en tenant compte de la resolution dpi. Et doit aussi intervenir les options de plot ( plt.gca().set_aspect('equal','box') ou plt.autoscale().

    Si je ne suis pas clair, n'hesiter pas. Je trouve le sujet interessant et je n'ai pas trouvé de réponse sur le net. Les personnes se focalisant sur l'impression du pdf. Taille réelle ou echelle 100% , ce que j'ai déjà configuré. Je precise que pour l'instant je travaille au format A4 mais que l'outil devra pouvoir faire plus au final. Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Salut à toi et bienvenu sur ce forum

    Je ne comprends pas tout de la partie métallique, mais je pense comprendre ton besoin.
    Tu pourras trouver au moins 2 solutions je pense sur ce lien là : https://stackoverflow.com/questions/...in-given-units.

    C'est un forum anglais, et c'est le #1 pour tous les développeurs. Si tu ne maitrises pas trop l'anglais, je pense que déjà rien que de regarder les codes ca devrait t'éclairer.

  3. #3
    Membre du Club
    Homme Profil pro
    chaudronnier
    Inscrit en
    Juillet 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : chaudronnier
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2022
    Messages : 7
    Par défaut
    Merci , beaucoup pour votre reactivité.

    Votre lien m'a aidé et j'avais plusieurs problematiques que j'ai reussi à resoudre. Je partage car d'autres sont peut être aussi débutant que moi.

    Pièce jointe 622747

    voici la figure, lorsque l'on roule sur lui même ce dessin dans l'axe Y cela represente une coupe à 45° d'un tube de 26.9 mm de diamètre exterieur.

    Je rappelle que je veux que la figure soit exprimée en taille réelle pour mon gabarit.

    J'ai tout d'abord cherché à connaitre la taille réelle en cm de ma figure. En sachant que la taille de figure est exprimée en inch(pouces) d'où la conversion par 2.54 .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
    width_cm=bbox.width*2.54;
    height_cm =bbox.height*2.54;
    Cela m'a permis en mesurant la figure suite à impression de confirmer que mon impression était bien à échelle 1:1 et que la taille de la figure correspondait au rectangle noir exterieur.

    Or, sur ma liste de données, on remarque que mon tracé ne touche pas la bords des axes X et Y. Or mes données réelles que je connais sont les valeurs min et max sur chaque axe. La taille de la figure ne m'interesse pas , c'est seulement la taille des axes.
    Je décide donc de limiter mes axes à mes valeurs min et max. Cela me permet d'ajuster la taille de la figure à la taille de mes axes.
    Car à ma connaissance seul la taille de la figure peut être imposé et pas la taille des axes (fig.set_size_inches(width,height ))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fig, ax=plt.subplots()
    ax.set_xlim(min(X1),max(X1));
    ax.set_ylim(min(Y1),max(Y1));
    Nom : Cylindre_Rev_PdB.png
Affichages : 338
Taille : 30,6 Ko

    Du coup, je peux modifier le ratio actuel pour retomber sur mes "vrais" centimètres.
    Cela me permet au passage de remarquer que matplotlib applique des ratios différents sur les axes X et Y

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    width_ratio=width_cm/max(X1S)*10;
    height_ratio=height_cm/max(Y1S)*10;
    print(width_ratio);
    print(height_ratio);
     
    width_real_inch=width_inch/width_ratio;
    height_real_inch=height_inch/height_ratio;
    print(width_real_inch);
    print(height_real_inch);
     
    fig.set_size_inches(width_real_inch,height_real_inch);

    Je suis pas loin mais j'ai encore quelques erreurs. Je poursuis mon investigation. Il faut que je fasse attention aussi au dpi car j'ai l'impression que maplotlib et la sauvegarde savefig en pdf peuvent modifier la résolution en dpi

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par TWSOTM Voir le message
    Car à ma connaissance seul la taille de la figure peut être imposé et pas la taille des axes
    Oui c'est ce qui semble être avancé dans le lien que je vous ai mis dans mon premier post. D'où la solution qui passe par un enlèvement de l'affichage des axes et par le retrait complet de la marge entre la taille de la figure et la taille des axes (ainsi la taille de la figure coincide avec celle des axes). D'ailleurs je vois que vous ne l'avez pas tout à fait adopter, pour pouvoir quand meme garder la graduation des axes. Mais à mon avis ca ca vous introduit une imprécision, car la taille de votre ax va être un poil inférieur à celle de la figure au lieu d'etre identique... Pour parer ca vous pouvez éventuellement mettre les graduations (et aussi les labels si vous voulez) à l'intérieur de l'axe plutôt qu'à l'extérieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ax.tick_params(axis="y",pad=-.5, left="off",labelleft="on")
    (jouer sur les paramètres pour obtenir le résultat voulu, et répéter l'opération avec axis="x")



    Citation Envoyé par TWSOTM Voir le message
    Cela me permet au passage de remarquer que matplotlib applique des ratios différents sur les axes X et Y
    Oui il ajuste au mieux pour occuper la place dans la figure. Pour corriger cela vous avez au moins 2 possibilités :
    1) Forcer le ratio 1:1 via
    2) Dans le cas où vous faites coincider la taille des axes à celle de la figure, calculer la taille de la figure par rapport aux valeurs de vos axes (xmin, xmax, ymin, ymax)

  5. #5
    Membre du Club
    Homme Profil pro
    chaudronnier
    Inscrit en
    Juillet 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : chaudronnier
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2022
    Messages : 7
    Par défaut
    Merci pour ton retour.

    J'ai toujours une erreur de conversion finale que je n'explique pas.
    comme si le fig.set_size_inches n'était pas appliqué convenablement.

    D'ailleurs j'ai fait un test de principe :

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fig.set_size_inches(4,5);
    bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
    cela me donne
    bbox.width=3.1 soit un ratio d'erreur de 1,29
    bbox.height=3.85 soit un ratio d'erreur de 1,29

    Si quelqu'un peu m'expliquer ce redimensionnement alors que je lui impose une taille la ligne d'avant ???

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Attention à plusieurs chose :
    - la taille de l'objet 'ax', ne correspond pas à la taille de vos axes. Car l'objet 'ax' englobe les ticks, les labels, etc ..
    Donc avec qqch comme ca, vous pouvez très bien avoir une bbox qui correspondent bien a vos dimensions, et quand vous allez l'imprimer ... non.
    - la taille de l'objet fig ne coincide pas avec la taille de l'objet ax (il y a des marges).

    Ci dessous un bout de code qui fait à la fois coincider taille de l'objet ax, taille de l'objet fig, et taille réelle des axes (du xmin à xmax, et du ymin à ymax).

    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
    from matplotlib import pyplot as plt
     
    plt.close('all')
     
    def get_ax_size(ax):
        bbox = ax.get_window_extent().transformed(ax.figure.dpi_scale_trans.inverted())
        return bbox.width, bbox.height
     
    fig,ax = plt.subplots()
    ax.set_aspect('equal')
    fig.set_size_inches(4,5)
    print(get_ax_size(ax))
     
    ax.tick_params(axis="y",direction="in", pad=-22)
    ax.tick_params(axis="x",direction="in", pad=-15)
    fig.subplots_adjust(0, 0, 1, 1)
    print(get_ax_size(ax))

Discussions similaires

  1. matplotlib : figure gelée sous windows pas sous linux
    Par membreComplexe12 dans le forum Général Python
    Réponses: 1
    Dernier message: 26/02/2016, 09h04
  2. [Python 3.X] Pyzo2015 matplotlib : figure ne s'affiche pas
    Par BertrandGo dans le forum EDI/RAD
    Réponses: 0
    Dernier message: 21/03/2015, 23h21
  3. Réponses: 4
    Dernier message: 24/02/2012, 22h03
  4. QHeader size : tailles des titres de ligne modifiables
    Par atalon1 dans le forum Débuter
    Réponses: 0
    Dernier message: 23/02/2012, 15h32
  5. peut on connaitre la taille reelle de l'ecran.?
    Par eomer212 dans le forum DirectX
    Réponses: 2
    Dernier message: 03/04/2008, 18h31

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