2
votes

Dans matplotlib, si une étiquette de graduation est trop longue, comment contraindre la longueur et la laisser apparaître sur plusieurs lignes?

J'aimerais faire quelques graphiques avec matplotlib, mais il y a un problème parce que certaines de mes étiquettes de graduation sont trop longues. Je me demande si je peux faire apparaître de longues étiquettes de graduation sur plusieurs lignes.

Voici du code:

qwertyuiop
lkjhgfdsa+
1s

Voici donc l'intrigue que j'ai obtenue. result
Comme vous pouvez le voir, le libellé ytick du bas est trop long, et je veux définir chaque ligne sur 10 lettres au maximum, donc j'espère que le libellé de coche pourra être affiché dans

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random(4)
idx = np.arange(4)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim(-0.5, 4-0.5)
ax.set_yticks(b)
ax.tick_params(length=0)
ax.barh(idx, data, zorder=2, 
        tick_label=["qwertyuioplkjhgfdsa+1s",
        "abc","asd","qwerty"])
ax.grid(axis='x')

plt.show()

ou un peu moins longtemps en une seule ligne.

Toute aide serait appréciée!


0 commentaires

3 Réponses :


0
votes

essayez d'y ajouter \ n

ax.barh(idx, data, zorder=2, 
            tick_label=["qwertyuiop \n lkjhgfdsa+ \n 1s",
            "abc","asd","qwerty"])


1 commentaires

En fait, j'obtiens les étiquettes de graduation ailleurs, donc la solution de gmds fonctionne pour moi. Mais encore merci pour votre aide!



1
votes

Vous pouvez modifier les étiquettes de graduation juste avant d'afficher votre tracé pour avoir une nouvelle ligne tous les max_chars caractères:

max_chars = 10

new_labels = ['\n'.join(label._text[i:i + max_chars ] 
                        for i in range(0, len(label._text), max_chars ))
              for label in ax.get_yticklabels()]

ax.set_yticklabels(new_labels)


0 commentaires

2
votes

Vous pouvez utiliser le module textwrap de python. Par exemple. pour envelopper à 10 caractères:

import textwrap
f = lambda x: textwrap.fill(x.get_text(), 10)
ax.set_yticklabels(map(f, ax.get_yticklabels()))


0 commentaires