Zone de texte avec retour à la ligne dans matplotlib?
Est-il possible d'afficher le texte dans une boîte par Matplotlib, automatique avec des sauts de ligne? En utilisant pyplot.text()
, je n'ai pu imprimer de texte multi-ligne, qui s'écoule au-delà des limites de la fenêtre, ce qui est ennuyeux. La taille des lignes n'est pas connu à l'avance... une idée serait bien apprécié!
Vous devez vous connecter pour publier un commentaire.
Le contenu de cette réponse ont été fusionnées dans mpl maître dans https://github.com/matplotlib/matplotlib/pull/4342 et sera dans la prochaine version de fonctionnalités.
Wow... C'est un problème épineux... (Et il expose beaucoup de limites dans matplotlib de rendu de texte...)
Cela devrait (j'.m.o.) être quelque chose que matplotlib a intégré, mais il ne le fait pas. Il y a eu quelques discussions à ce sujet sur la liste de diffusion, mais aucune des solutions que j'ai pu trouver à automatique de l'habillage de texte.
Si, tout d'abord, il n'y a aucun moyen de déterminer la taille (en pixels) de la chaîne de texte avant qu'il soit établi dans matplotlib. Ce n'est pas trop grand d'un problème, comme on peut le dessiner simplement, prenez la taille, et puis redessiner le texte enveloppé. (C'est cher, mais pas trop mauvais)
Le problème suivant est que les personnages n'ont pas une largeur fixe en pixels, de sorte que la recouvrant d'une chaîne de texte à un nombre donné de caractères ne reflétera pas forcément une largeur lors du rendu. Ce n'est pas un énorme problème.
Au-delà, nous ne pouvons pas le faire une fois... Sinon, il sera emballé correctement quand élaboré la première fois (sur l'écran, par exemple), mais pas si nouveau tiré (lorsque la figure est redimensionnée ou enregistrée comme une image avec une autre DPI de l'écran). Ce n'est pas un énorme problème, comme on peut il suffit de connecter une fonction de rappel à la matplotlib attirer l'événement.
En tout cas cette solution est imparfaite, mais il devrait fonctionner dans la plupart des situations. Je ne cherche pas à rendre compte de tex-rendus des chaînes, tout tendu de polices ou fontes avec un aspect inhabituel ratio. Cependant, il doit maintenant gérer correctement le texte pivoté.
Cependant, Il doit tenter automatiquement automatiquement n'importe quel texte les objets en de multiples sous-intrigues, selon les chiffres que vous connectez le
on_draw
rappel... Il sera imparfaite dans de nombreux cas, mais il fait un travail décent.print wrapped_text
à la fin de laautowrap_text
de la fonction et de voir si la chaîne est manquant espaces... En tout cas, j'ai ajouté une version mise à jour (pour la plupart) poignées de rotation de texte. Il a encore des tonnes de limitations (et beaucoup d'alignement vertical des problèmes), mais j'espère que c'est utile, de toute façon.plt.show()
avecplt.savefig('test.png')
?Par la mise en
wrap = True
lors de la création de la zone de texte, comme dans l'exemple ci-dessous. Cela peut avoir l'effet désiré.wrap=True
) est essentiellement le même que l'on a accepté de répondre, en tant que réponse est ce qui se passe derrière les coulisses lors de l'utilisation dewrap
.Son été à peu près cinq ans, mais il ne semble pas encore être une excellente façon de le faire. Voici ma version de la solution retenue. Mon but était de permettre au pixel près d'habillage pour être appliquée de manière sélective à l'individu occurrences de texte. J'ai également créé une zone de texte simple() qui permet de convertir tous les axes dans une zone de texte avec des marges personnalisées et de l'alignement.
Au lieu de supposer une police particulière ratio d'aspect ou de largeur moyenne, en fait, je tire la corde un mot à la fois et d'insérer des retours à la ligne une fois que le seuil est atteint. C'est horriblement lent par rapport à la approximations, mais se sent encore assez accrocheur pour les chaînes de <200 mots.
Utilisation:
J'ai laissé tomber quelques fonctionnalités qui n'étaient pas aussi important pour moi. Le redimensionnement échouera comme chaque appel à _wrap() insère des sauts de ligne supplémentaires dans la chaîne, mais n'a aucun moyen de les enlever. Cela peut être résolu en enlevant tous les caractères \n dans le _wrap la fonction ou à l'entreposage de la chaîne d'origine quelque part et de "réinitialiser" le texte de l'instance entre les enveloppements.